mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-19 19:04:11 +08:00
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:
parent
11597bc969
commit
9e7facfd47
@ -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.
|
||||
|
@ -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>
|
||||
|
@ -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 \
|
||||
|
@ -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 \
|
||||
|
@ -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;
|
||||
|
@ -876,7 +876,6 @@ namespace std
|
||||
__base.setf(ios_base::scientific, ios_base::floatfield);
|
||||
return __base;
|
||||
}
|
||||
|
||||
} // namespace std
|
||||
|
||||
#endif /* _IOS_BASE_H */
|
||||
|
155
libstdc++-v3/include/ext/pod_char_traits.h
Normal file
155
libstdc++-v3/include/ext/pod_char_traits.h
Normal 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
|
78
libstdc++-v3/testsuite/ext/pod_char_traits.cc
Normal file
78
libstdc++-v3/testsuite/ext/pod_char_traits.cc
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user