pod_char_traits.cc: New.

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.

From-SVN: r69115
This commit is contained in:
Benjamin Kosnik 2003-07-09 00:40:29 +00:00 committed by Benjamin Kosnik
parent 11597bc969
commit 9e7facfd47
8 changed files with 254 additions and 10 deletions

View 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.

View File

@ -414,13 +414,15 @@
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>

View 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 \

View 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 \

View 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;

View File

@ -876,7 +876,6 @@ namespace std
__base.setf(ios_base::scientific, ios_base::floatfield);
return __base;
}
} // namespace std
#endif /* _IOS_BASE_H */

View File

@ -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

View File

@ -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;
}