char_traits.h revision 117397
1// Character Traits for use by standard string and iostream -*- C++ -*-
2
3// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
4// Free Software Foundation, Inc.
5//
6// This file is part of the GNU ISO C++ Library.  This library is free
7// software; you can redistribute it and/or modify it under the
8// terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 2, or (at your option)
10// any later version.
11
12// This library is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15// GNU General Public License for more details.
16
17// You should have received a copy of the GNU General Public License along
18// with this library; see the file COPYING.  If not, write to the Free
19// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20// USA.
21
22// As a special exception, you may use this file as part of a free software
23// library without restriction.  Specifically, if other files instantiate
24// templates or use macros or inline functions from this file, or you compile
25// this file and link it with other files to produce an executable, this
26// file does not by itself cause the resulting executable to be covered by
27// the GNU General Public License.  This exception does not however
28// invalidate any other reasons why the executable file might be covered by
29// the GNU General Public License.
30
31//
32// ISO C++ 14882: 21  Strings library
33//
34
35/** @file char_traits.h
36 *  This is an internal header file, included by other library headers.
37 *  You should not attempt to use it directly.
38 */
39
40#ifndef _CPP_BITS_CHAR_TRAITS_H
41#define _CPP_BITS_CHAR_TRAITS_H 1
42
43#pragma GCC system_header
44
45#include <cstring>            // For memmove, memset, memchr
46#include <bits/fpos.h>        // For streampos
47
48namespace std
49{
50  // 21.1
51  /**
52   *  @brief  Basis for explicit traits specializations.
53   *
54   *  @note  For any given actual character type, this definition is
55   *  probably wrong.
56   *
57   *  See http://gcc.gnu.org/onlinedocs/libstdc++/21_strings/howto.html#5
58   *  for advice on how to make use of this class for "unusual" character
59   *  types.
60  */
61  template<class _CharT>
62    struct char_traits
63    {
64      typedef _CharT 		char_type;
65      // Unsigned as wint_t is unsigned.
66      typedef unsigned long  	int_type;
67      typedef streampos 	pos_type;
68      typedef streamoff 	off_type;
69      typedef mbstate_t 	state_type;
70
71      static void
72      assign(char_type& __c1, const char_type& __c2);
73
74      static bool
75      eq(const char_type& __c1, const char_type& __c2);
76
77      static bool
78      lt(const char_type& __c1, const char_type& __c2);
79
80      static int
81      compare(const char_type* __s1, const char_type* __s2, size_t __n);
82
83      static size_t
84      length(const char_type* __s);
85
86      static const char_type*
87      find(const char_type* __s, size_t __n, const char_type& __a);
88
89      static char_type*
90      move(char_type* __s1, const char_type* __s2, size_t __n);
91
92      static char_type*
93      copy(char_type* __s1, const char_type* __s2, size_t __n);
94
95      static char_type*
96      assign(char_type* __s, size_t __n, char_type __a);
97
98      static char_type
99      to_char_type(const int_type& __c);
100
101      static int_type
102      to_int_type(const char_type& __c);
103
104      static bool
105      eq_int_type(const int_type& __c1, const int_type& __c2);
106
107      static int_type
108      eof();
109
110      static int_type
111      not_eof(const int_type& __c);
112    };
113
114
115  /// 21.1.3.1  char_traits specializations
116  template<>
117    struct char_traits<char>
118    {
119      typedef char 		char_type;
120      typedef int 	        int_type;
121      typedef streampos 	pos_type;
122      typedef streamoff 	off_type;
123      typedef mbstate_t 	state_type;
124
125      static void
126      assign(char_type& __c1, const char_type& __c2)
127      { __c1 = __c2; }
128
129      static bool
130      eq(const char_type& __c1, const char_type& __c2)
131      { return __c1 == __c2; }
132
133      static bool
134      lt(const char_type& __c1, const char_type& __c2)
135      { return __c1 < __c2; }
136
137      static int
138      compare(const char_type* __s1, const char_type* __s2, size_t __n)
139      { return memcmp(__s1, __s2, __n); }
140
141      static size_t
142      length(const char_type* __s)
143      { return strlen(__s); }
144
145      static const char_type*
146      find(const char_type* __s, size_t __n, const char_type& __a)
147      { return static_cast<const char_type*>(memchr(__s, __a, __n)); }
148
149      static char_type*
150      move(char_type* __s1, const char_type* __s2, size_t __n)
151      { return static_cast<char_type*>(memmove(__s1, __s2, __n)); }
152
153      static char_type*
154      copy(char_type* __s1, const char_type* __s2, size_t __n)
155      {  return static_cast<char_type*>(memcpy(__s1, __s2, __n)); }
156
157      static char_type*
158      assign(char_type* __s, size_t __n, char_type __a)
159      { return static_cast<char_type*>(memset(__s, __a, __n)); }
160
161      static char_type
162      to_char_type(const int_type& __c)
163      { return static_cast<char_type>(__c); }
164
165      // To keep both the byte 0xff and the eof symbol 0xffffffff
166      // from ending up as 0xffffffff.
167      static int_type
168      to_int_type(const char_type& __c)
169      { return static_cast<int_type>(static_cast<unsigned char>(__c)); }
170
171      static bool
172      eq_int_type(const int_type& __c1, const int_type& __c2)
173      { return __c1 == __c2; }
174
175      static int_type
176      eof() { return static_cast<int_type>(EOF); }
177
178      static int_type
179      not_eof(const int_type& __c)
180      { return (__c == eof()) ? 0 : __c; }
181  };
182
183
184#ifdef _GLIBCPP_USE_WCHAR_T
185  /// 21.1.3.2  char_traits specializations
186  template<>
187    struct char_traits<wchar_t>
188    {
189      typedef wchar_t 		char_type;
190      typedef wint_t 		int_type;
191      typedef streamoff 	off_type;
192      typedef wstreampos 	pos_type;
193      typedef mbstate_t 	state_type;
194
195      static void
196      assign(char_type& __c1, const char_type& __c2)
197      { __c1 = __c2; }
198
199      static bool
200      eq(const char_type& __c1, const char_type& __c2)
201      { return __c1 == __c2; }
202
203      static bool
204      lt(const char_type& __c1, const char_type& __c2)
205      { return __c1 < __c2; }
206
207      static int
208      compare(const char_type* __s1, const char_type* __s2, size_t __n)
209      { return wmemcmp(__s1, __s2, __n); }
210
211      static size_t
212      length(const char_type* __s)
213      { return wcslen(__s); }
214
215      static const char_type*
216      find(const char_type* __s, size_t __n, const char_type& __a)
217      { return wmemchr(__s, __a, __n); }
218
219      static char_type*
220      move(char_type* __s1, const char_type* __s2, int_type __n)
221      { return wmemmove(__s1, __s2, __n); }
222
223      static char_type*
224      copy(char_type* __s1, const char_type* __s2, size_t __n)
225      { return wmemcpy(__s1, __s2, __n); }
226
227      static char_type*
228      assign(char_type* __s, size_t __n, char_type __a)
229      { return wmemset(__s, __a, __n); }
230
231      static char_type
232      to_char_type(const int_type& __c) { return char_type(__c); }
233
234      static int_type
235      to_int_type(const char_type& __c) { return int_type(__c); }
236
237      static bool
238      eq_int_type(const int_type& __c1, const int_type& __c2)
239      { return __c1 == __c2; }
240
241      static int_type
242      eof() { return static_cast<int_type>(WEOF); }
243
244      static int_type
245      not_eof(const int_type& __c)
246      { return eq_int_type(__c, eof()) ? 0 : __c; }
247  };
248#endif //_GLIBCPP_USE_WCHAR_T
249
250  template<typename _CharT, typename _Traits>
251    struct _Char_traits_match
252    {
253      _CharT _M_c;
254      _Char_traits_match(_CharT const& __c) : _M_c(__c) { }
255
256      bool
257      operator()(_CharT const& __a) { return _Traits::eq(_M_c, __a); }
258    };
259} // namespace std
260
261#endif
262