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