OSDN Git Service

2003-07-08 Benjamin Kosnik <bkoz@redhat.com>
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Jul 2003 00:40:29 +0000 (00:40 +0000)
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Jul 2003 00:40:29 +0000 (00:40 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@69115 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/docs/html/21_strings/howto.html
libstdc++-v3/include/Makefile.am
libstdc++-v3/include/Makefile.in
libstdc++-v3/include/bits/char_traits.h
libstdc++-v3/include/bits/ios_base.h
libstdc++-v3/include/ext/pod_char_traits.h [new file with mode: 0644]
libstdc++-v3/testsuite/ext/pod_char_traits.cc [new file with mode: 0644]

index 8dd46c3..190d2d7 100644 (file)
@@ -1,3 +1,11 @@
+2003-07-08  Benjamin Kosnik  <bkoz@redhat.com>
+
+       * 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  <gp.bolton@computer.org>
 
        * testsuite/performance/list_create_fill_sort.cc: New.
index d862467..49f17e7 100644 (file)
       of work to do</a>, especially if you with to use i18n features
       (facets require traits information but don't have a traits argument).
    </p>
-   <p>One example of how to specialize char_traits is given
-      <a href="http://gcc.gnu.org/ml/libstdc++/2002-08/msg00260.html">in
-      this message</a>.  We agree that the way it's used with basic_string
-      (scroll down to main()) doesn't look nice, but that's because
-      <a href="http://gcc.gnu.org/ml/libstdc++/2002-08/msg00236.html">the
-      nice-looking first attempt</a> turned out to
-      <a href="http://gcc.gnu.org/ml/libstdc++/2002-08/msg00242.html">not
+   <p>One example of how to specialize char_traits is given <a
+      href="http://gcc.gnu.org/ml/libstdc++/2002-08/msg00260.html">in
+      this message</a>, which was then put into the file <code>
+      include/ext/pod_char_traits.h</code> 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 <a
+      href="http://gcc.gnu.org/ml/libstdc++/2002-08/msg00236.html">the
+      nice-looking first attempt</a> turned out to <a
+      href="http://gcc.gnu.org/ml/libstdc++/2002-08/msg00242.html">not
       be conforming C++</a>, due to the rule that CharT must be a POD.
       (See how tricky this is?)
    </p>
index 20b7025..29b3077 100644 (file)
@@ -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 \
index b29b37c..879bf16 100644 (file)
@@ -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 \
index 5a5eca6..aa6d7f4 100644 (file)
@@ -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<class _CharT>
     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;
index 34600cc..3cc4ac1 100644 (file)
@@ -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 (file)
index 0000000..0de7a0f
--- /dev/null
@@ -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 <gdr@integrable-solutions.net>
+// Benjamin Kosnik <bkoz@redhat.com>
+
+#ifndef _POD_CHAR_TRAITS_H
+#define _POD_CHAR_TRAITS_H 1
+#include <string>
+
+namespace __gnu_cxx
+{
+  template<typename V, typename I>
+    struct character
+    {
+      typedef V        value_type;
+      typedef I        int_type;
+      value_type       value;
+    };
+  
+  template<typename V, typename I>
+    inline bool 
+    operator==(const character<V, I>& lhs, const character<V, I>& rhs)
+    { return lhs.value == rhs.value; }
+  
+  template<typename V, typename I>
+    inline bool 
+    operator<(const character<V, I>& lhs, const character<V, I>& rhs)
+    { return lhs.value < rhs.value; }
+} // namespace __gnu_cxx
+
+namespace std
+{
+  // Provide std::char_traits specialization.
+  template<typename V, typename I>
+    struct char_traits<__gnu_cxx::character<V, I> >
+    {
+      typedef __gnu_cxx::character<V, I>       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<int_type>(-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 (file)
index 0000000..c3c4eee
--- /dev/null
@@ -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 <gdr@integrable-solutions.net>
+// Benjamin Kosnik <bkoz@redhat.com>
+
+#include <ext/pod_char_traits.h>
+
+int main()
+{
+  using namespace std;
+  using namespace __gnu_cxx;
+
+  typedef unsigned short                       value_type;
+  typedef unsigned int                         int_type;
+  typedef character<value_type, int_type>      char_type;
+  typedef char_traits<char_type>               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<char_type>
+  typedef basic_string<char_type>      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;
+}