From 9e7facfd47ed8da719ee0693ffb170e5d3d21379 Mon Sep 17 00:00:00 2001 From: Benjamin Kosnik Date: Wed, 9 Jul 2003 00:40:29 +0000 Subject: [PATCH] pod_char_traits.cc: New. 2003-07-08 Benjamin Kosnik * testsuite/ext/pod_char_traits.cc: New. * include/ext/pod_char_traits.h: New. * include/Makefile.am (ext_headers): Add pod_char_traits.h. * include/Makefile.in: Regenerate. * docs/html/21_strings/howto.html: Update. From-SVN: r69115 --- libstdc++-v3/ChangeLog | 8 + libstdc++-v3/docs/html/21_strings/howto.html | 16 +- libstdc++-v3/include/Makefile.am | 1 + libstdc++-v3/include/Makefile.in | 2 + libstdc++-v3/include/bits/char_traits.h | 3 +- libstdc++-v3/include/bits/ios_base.h | 1 - libstdc++-v3/include/ext/pod_char_traits.h | 155 ++++++++++++++++++ libstdc++-v3/testsuite/ext/pod_char_traits.cc | 78 +++++++++ 8 files changed, 254 insertions(+), 10 deletions(-) create mode 100644 libstdc++-v3/include/ext/pod_char_traits.h create mode 100644 libstdc++-v3/testsuite/ext/pod_char_traits.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 8dd46c31e90..190d2d78b4a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2003-07-08 Benjamin Kosnik + + * testsuite/ext/pod_char_traits.cc: New. + * include/ext/pod_char_traits.h: New. + * include/Makefile.am (ext_headers): Add pod_char_traits.h. + * include/Makefile.in: Regenerate. + * docs/html/21_strings/howto.html: Update. + 2003-07-08 Gawain Bolton * testsuite/performance/list_create_fill_sort.cc: New. diff --git a/libstdc++-v3/docs/html/21_strings/howto.html b/libstdc++-v3/docs/html/21_strings/howto.html index d862467b2a9..49f17e7c8aa 100644 --- a/libstdc++-v3/docs/html/21_strings/howto.html +++ b/libstdc++-v3/docs/html/21_strings/howto.html @@ -414,13 +414,15 @@ of work to do, especially if you with to use i18n features (facets require traits information but don't have a traits argument).

-

One example of how to specialize char_traits is given - in - this message. We agree that the way it's used with basic_string - (scroll down to main()) doesn't look nice, but that's because - the - nice-looking first attempt turned out to - not +

One example of how to specialize char_traits is given in + this message, which was then put into the file + include/ext/pod_char_traits.h at a later date. We agree + that the way it's used with basic_string (scroll down to main()) + doesn't look nice, but that's because the + nice-looking first attempt turned out to not be conforming C++, due to the rule that CharT must be a POD. (See how tricky this is?)

diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am index 20b7025a050..29b3077b812 100644 --- a/libstdc++-v3/include/Makefile.am +++ b/libstdc++-v3/include/Makefile.am @@ -226,6 +226,7 @@ ext_headers = \ ${ext_srcdir}/mt_allocator.h \ ${ext_srcdir}/new_allocator.h \ ${ext_srcdir}/numeric \ + ${ext_srcdir}/pod_char_traits.h \ ${ext_srcdir}/pool_allocator.h \ ${ext_srcdir}/rb_tree \ ${ext_srcdir}/rope \ diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in index b29b37c1990..879bf1694f6 100644 --- a/libstdc++-v3/include/Makefile.in +++ b/libstdc++-v3/include/Makefile.in @@ -135,6 +135,7 @@ glibcxx_toolexecdir = @glibcxx_toolexecdir@ glibcxx_toolexeclibdir = @glibcxx_toolexeclibdir@ ifGNUmake = @ifGNUmake@ libtool_VERSION = @libtool_VERSION@ +port_specific_symbol_file = @port_specific_symbol_file@ toplevel_srcdir = @toplevel_srcdir@ AUTOMAKE_OPTIONS = 1.3 cygnus @@ -346,6 +347,7 @@ ext_headers = \ ${ext_srcdir}/mt_allocator.h \ ${ext_srcdir}/new_allocator.h \ ${ext_srcdir}/numeric \ + ${ext_srcdir}/pod_char_traits.h \ ${ext_srcdir}/pool_allocator.h \ ${ext_srcdir}/rb_tree \ ${ext_srcdir}/rope \ diff --git a/libstdc++-v3/include/bits/char_traits.h b/libstdc++-v3/include/bits/char_traits.h index 5a5eca631e1..aa6d7f48a6d 100644 --- a/libstdc++-v3/include/bits/char_traits.h +++ b/libstdc++-v3/include/bits/char_traits.h @@ -56,13 +56,12 @@ namespace std * * See http://gcc.gnu.org/onlinedocs/libstdc++/21_strings/howto.html#5 * for advice on how to make use of this class for "unusual" character - * types. + * types. Also, check out include/ext/pod_char_traits.h. */ template struct char_traits { typedef _CharT char_type; - // Unsigned as wint_t is unsigned. typedef unsigned long int_type; typedef streampos pos_type; typedef streamoff off_type; diff --git a/libstdc++-v3/include/bits/ios_base.h b/libstdc++-v3/include/bits/ios_base.h index 34600cc3de7..3cc4ac1fd33 100644 --- a/libstdc++-v3/include/bits/ios_base.h +++ b/libstdc++-v3/include/bits/ios_base.h @@ -876,7 +876,6 @@ namespace std __base.setf(ios_base::scientific, ios_base::floatfield); return __base; } - } // namespace std #endif /* _IOS_BASE_H */ diff --git a/libstdc++-v3/include/ext/pod_char_traits.h b/libstdc++-v3/include/ext/pod_char_traits.h new file mode 100644 index 00000000000..0de7a0fd1e6 --- /dev/null +++ b/libstdc++-v3/include/ext/pod_char_traits.h @@ -0,0 +1,155 @@ +// POD character, std::char_traits specialization -*- C++ -*- + +// Copyright (C) 2002, 2003 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +// Gabriel Dos Reis +// Benjamin Kosnik + +#ifndef _POD_CHAR_TRAITS_H +#define _POD_CHAR_TRAITS_H 1 + +#include + +namespace __gnu_cxx +{ + template + struct character + { + typedef V value_type; + typedef I int_type; + value_type value; + }; + + template + inline bool + operator==(const character& lhs, const character& rhs) + { return lhs.value == rhs.value; } + + template + inline bool + operator<(const character& lhs, const character& rhs) + { return lhs.value < rhs.value; } +} // namespace __gnu_cxx + +namespace std +{ + // Provide std::char_traits specialization. + template + struct char_traits<__gnu_cxx::character > + { + typedef __gnu_cxx::character char_type; + + // NB: This type should be bigger than char_type, so as to + // properly hold EOF values in addition to the full range of + // char_type values. + typedef typename char_type::int_type int_type; + + typedef streampos pos_type; + typedef streamoff off_type; + typedef mbstate_t state_type; + + static void + assign(char_type& __c1, const char_type& __c2) + { __c1 = __c2; } + + static bool + eq(const char_type& __c1, const char_type& __c2) + { return __c1 == __c2; } + + static bool + lt(const char_type& __c1, const char_type& __c2) + { return __c1 < __c2; } + + static int + compare(const char_type* __s1, const char_type* __s2, size_t __n) + { + for (size_t __i = 0; __i < __n; ++__i) + if (!eq(__s1[__i], __s2[__i])) + return lt(__s1[__i], __s2[__i]) ? -1 : 1; + return 0; + } + + static size_t + length(const char_type* __s) + { + const char_type* __p = __s; + while (*__p) + ++__p; + return (__p - __s); + } + + static const char_type* + find(const char_type* __s, size_t __n, const char_type& __a) + { + for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p) + if (*__p == __a) + return __p; + return 0; + } + + static char_type* + move(char_type* __s1, const char_type* __s2, size_t __n) + { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); } + + static char_type* + copy(char_type* __s1, const char_type* __s2, size_t __n) + { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); } + + static char_type* + assign(char_type* __s, size_t __n, char_type __a) + { + for (char_type* __p = __s; __p < __s + __n; ++__p) + assign(*__p, __a); + return __s; + } + + static char_type + to_char_type(const int_type& __c) + { + char_type __r = { __c }; + return __r; + } + + static int_type + to_int_type(const char_type& __c) + { return int_type(__c.value); } + + static bool + eq_int_type(const int_type& __c1, const int_type& __c2) + { return __c1 == __c2; } + + static int_type + eof() { return static_cast(-1); } + + static int_type + not_eof(const int_type& __c) + { return eq_int_type(__c, eof()) ? int_type(0) : __c; } + }; +} + +#endif diff --git a/libstdc++-v3/testsuite/ext/pod_char_traits.cc b/libstdc++-v3/testsuite/ext/pod_char_traits.cc new file mode 100644 index 00000000000..c3c4eee2594 --- /dev/null +++ b/libstdc++-v3/testsuite/ext/pod_char_traits.cc @@ -0,0 +1,78 @@ +// POD character, std::char_traits specialization -*- C++ -*- + +// Copyright (C) 2002, 2003 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +// Gabriel Dos Reis +// Benjamin Kosnik + +#include + +int main() +{ + using namespace std; + using namespace __gnu_cxx; + + typedef unsigned short value_type; + typedef unsigned int int_type; + typedef character char_type; + typedef char_traits traits_type; + + bool test = true; + + // 1 char_type <-> value_type conversions + value_type uc1 = 'c'; + value_type uc2 = 'd'; + char_type c1 = { uc1 }; + char_type c2 = { uc2 }; + test = !(c1 == c2); + + // 2 char_traits + test = traits_type::eq(c1, c2); + + // 3 basic_string + typedef basic_string string_type; + string_type str; + char_type c3 = { value_type('b') }; + char_type c4 = { value_type('o') }; + char_type c5 = { value_type('r') }; + char_type c6 = { value_type('a') }; + char_type c7 = { value_type('c') }; + char_type c8 = { value_type('a') }; + char_type c9 = { value_type('y') }; + str += c3; + str += c4; + str += c5; + str += c6; + str += c7; + str += c8; + str += c9; + string_type::size_type len = str.size(); + const char_type* arr = str.c_str(); + + return 0; +} -- 2.30.2