3 * Silicon Graphics Computer Systems, Inc.
8 * This material is provided "as is", with absolutely no warranty expressed
9 * or implied. Any use is at your own risk.
11 * Permission to use or copy this software for any purpose is hereby granted
12 * without fee, provided the above notices are retained on all copies.
13 * Permission to modify the code and to distribute modified code is granted,
14 * provided the above notices are retained, and a notice that the code was
15 * modified is included with the above copyright notice.
19 #include "stlport_prefix.h"
29 //----------------------------------------------------------------------
32 // The classic table: static data members.
34 #if !defined(_STLP_STATIC_CONST_INIT_BUG) && !(defined(__MRC__) || defined(__SC__))
35 //*TY 02/25/2000 - added workaround for MPW compilers; they confuse on in-class static const
36 const size_t ctype<char>::table_size;
39 // This macro is specifically for platforms where isprint() relies
42 #define PRINTFLAG ctype_base::mask( _Locale_PRINT & ~(_Locale_UPPER | _Locale_LOWER | _Locale_ALPHA | _Locale_DIGIT | _Locale_PUNCT | _Locale_SPACE | _Locale_XDIGIT ))
44 const ctype_base::mask*
45 ctype<char>::classic_table() _STLP_NOTHROW {
46 /* Ctype table for the ASCII character set.
47 * There are 257 entries in this table. The first is EOF (-1).
48 * That is, the "table" seen by ctype<char> member functions is
49 * _S_classic_table + 1.
51 /* The following static assert check that alpha is not defined as upper | lower.
52 * STLport flags character like 'a' with alpha | lower, if alpha is badly configure
53 * then 'a' will also be seen as upper which is wrong.
55 #if !defined (__MWERKS__)
56 /* CodeWarrior 8 don't understabd this */
57 _STLP_STATIC_ASSERT((alpha & (lower | upper)) == 0)
60 static const ctype_base::mask _S_classic_table[table_size] =
71 ctype_base::mask(space | cntrl) /* tab */,
72 ctype_base::mask(space | cntrl) /* LF */,
73 ctype_base::mask(space | cntrl) /* ^K */,
74 ctype_base::mask(space | cntrl) /* FF */,
75 ctype_base::mask(space | cntrl) /* ^M */,
94 ctype_base::mask (space | PRINTFLAG) /* */,
95 ctype_base::mask (punct | PRINTFLAG ) /* ! */,
96 ctype_base::mask (punct | PRINTFLAG ) /* " */,
97 ctype_base::mask (punct | PRINTFLAG ) /* # */,
98 ctype_base::mask (punct | PRINTFLAG ) /* $ */,
99 ctype_base::mask (punct | PRINTFLAG ) /* % */,
100 ctype_base::mask (punct | PRINTFLAG ) /* & */,
101 ctype_base::mask (punct | PRINTFLAG ) /* ' */,
102 ctype_base::mask (punct | PRINTFLAG ) /* ( */,
103 ctype_base::mask (punct | PRINTFLAG ) /* ) */,
104 ctype_base::mask (punct | PRINTFLAG ) /* * */,
105 ctype_base::mask (punct | PRINTFLAG ) /* + */,
106 ctype_base::mask (punct | PRINTFLAG ) /* , */,
107 ctype_base::mask (punct | PRINTFLAG ) /* - */,
108 ctype_base::mask (punct | PRINTFLAG ) /* . */,
109 ctype_base::mask (punct | PRINTFLAG ) /* / */,
110 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 0 */,
111 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 1 */,
112 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 2 */,
113 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 3 */,
114 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 4 */,
115 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 5 */,
116 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 6 */,
117 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 7 */,
118 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 8 */,
119 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 9 */,
120 ctype_base::mask (punct | PRINTFLAG ) /* : */,
121 ctype_base::mask (punct | PRINTFLAG ) /* ; */,
122 ctype_base::mask (punct | PRINTFLAG ) /* < */,
123 ctype_base::mask (punct | PRINTFLAG ) /* = */,
124 ctype_base::mask (punct | PRINTFLAG ) /* > */,
125 ctype_base::mask (punct | PRINTFLAG ) /* ? */,
126 ctype_base::mask (punct | PRINTFLAG ) /* ! */,
127 ctype_base::mask(alpha | PRINTFLAG | upper | xdigit) /* A */,
128 ctype_base::mask(alpha | PRINTFLAG | upper | xdigit) /* B */,
129 ctype_base::mask(alpha | PRINTFLAG | upper | xdigit) /* C */,
130 ctype_base::mask(alpha | PRINTFLAG | upper | xdigit) /* D */,
131 ctype_base::mask(alpha | PRINTFLAG | upper | xdigit) /* E */,
132 ctype_base::mask(alpha | PRINTFLAG | upper | xdigit) /* F */,
133 ctype_base::mask(alpha | PRINTFLAG | upper) /* G */,
134 ctype_base::mask(alpha | PRINTFLAG | upper) /* H */,
135 ctype_base::mask(alpha | PRINTFLAG | upper) /* I */,
136 ctype_base::mask(alpha | PRINTFLAG | upper) /* J */,
137 ctype_base::mask(alpha | PRINTFLAG | upper) /* K */,
138 ctype_base::mask(alpha | PRINTFLAG | upper) /* L */,
139 ctype_base::mask(alpha | PRINTFLAG | upper) /* M */,
140 ctype_base::mask(alpha | PRINTFLAG | upper) /* N */,
141 ctype_base::mask(alpha | PRINTFLAG | upper) /* O */,
142 ctype_base::mask(alpha | PRINTFLAG | upper) /* P */,
143 ctype_base::mask(alpha | PRINTFLAG | upper) /* Q */,
144 ctype_base::mask(alpha | PRINTFLAG | upper) /* R */,
145 ctype_base::mask(alpha | PRINTFLAG | upper) /* S */,
146 ctype_base::mask(alpha | PRINTFLAG | upper) /* T */,
147 ctype_base::mask(alpha | PRINTFLAG | upper) /* U */,
148 ctype_base::mask(alpha | PRINTFLAG | upper) /* V */,
149 ctype_base::mask(alpha | PRINTFLAG | upper) /* W */,
150 ctype_base::mask(alpha | PRINTFLAG | upper) /* X */,
151 ctype_base::mask(alpha | PRINTFLAG | upper) /* Y */,
152 ctype_base::mask(alpha | PRINTFLAG | upper) /* Z */,
153 ctype_base::mask (punct | PRINTFLAG ) /* [ */,
154 ctype_base::mask (punct | PRINTFLAG ) /* \ */,
155 ctype_base::mask (punct | PRINTFLAG ) /* ] */,
156 ctype_base::mask (punct | PRINTFLAG ) /* ^ */,
157 ctype_base::mask (punct | PRINTFLAG ) /* _ */,
158 ctype_base::mask (punct | PRINTFLAG ) /* ` */,
159 ctype_base::mask(alpha | PRINTFLAG | lower | xdigit) /* a */,
160 ctype_base::mask(alpha | PRINTFLAG | lower | xdigit) /* b */,
161 ctype_base::mask(alpha | PRINTFLAG | lower | xdigit) /* c */,
162 ctype_base::mask(alpha | PRINTFLAG | lower | xdigit) /* d */,
163 ctype_base::mask(alpha | PRINTFLAG | lower | xdigit) /* e */,
164 ctype_base::mask(alpha | PRINTFLAG | lower | xdigit) /* f */,
165 ctype_base::mask(alpha | PRINTFLAG | lower) /* g */,
166 ctype_base::mask(alpha | PRINTFLAG | lower) /* h */,
167 ctype_base::mask(alpha | PRINTFLAG | lower) /* i */,
168 ctype_base::mask(alpha | PRINTFLAG | lower) /* j */,
169 ctype_base::mask(alpha | PRINTFLAG | lower) /* k */,
170 ctype_base::mask(alpha | PRINTFLAG | lower) /* l */,
171 ctype_base::mask(alpha | PRINTFLAG | lower) /* m */,
172 ctype_base::mask(alpha | PRINTFLAG | lower) /* n */,
173 ctype_base::mask(alpha | PRINTFLAG | lower) /* o */,
174 ctype_base::mask(alpha | PRINTFLAG | lower) /* p */,
175 ctype_base::mask(alpha | PRINTFLAG | lower) /* q */,
176 ctype_base::mask(alpha | PRINTFLAG | lower) /* r */,
177 ctype_base::mask(alpha | PRINTFLAG | lower) /* s */,
178 ctype_base::mask(alpha | PRINTFLAG | lower) /* t */,
179 ctype_base::mask(alpha | PRINTFLAG | lower) /* u */,
180 ctype_base::mask(alpha | PRINTFLAG | lower) /* v */,
181 ctype_base::mask(alpha | PRINTFLAG | lower) /* w */,
182 ctype_base::mask(alpha | PRINTFLAG | lower) /* x */,
183 ctype_base::mask(alpha | PRINTFLAG | lower) /* y */,
184 ctype_base::mask(alpha | PRINTFLAG | lower) /* x */,
185 ctype_base::mask (punct | PRINTFLAG ) /* { */,
186 ctype_base::mask (punct | PRINTFLAG ) /* | */,
187 ctype_base::mask (punct | PRINTFLAG ) /* } */,
188 ctype_base::mask (punct | PRINTFLAG ) /* ~ */,
189 cntrl /* del (0x7f)*/,
190 /* ASCII is a 7-bit code, so everything else is non-ASCII */
191 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
192 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
193 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
194 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
195 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
196 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
197 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
198 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
199 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
200 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
201 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
202 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
203 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
204 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
205 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0),
206 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0)
208 return _S_classic_table;
211 // For every c in the range 0 <= c < 256, _S_upper[c] is the
212 // uppercased version of c and _S_lower[c] is the lowercased
213 // version. As before, these two tables assume the ASCII character
216 const unsigned char _S_upper[ctype<char>::table_size] =
218 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
219 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
220 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
221 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
222 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
223 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
224 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
225 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
226 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
227 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
228 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
229 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
230 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
231 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
232 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
233 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
234 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
235 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
236 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
237 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
238 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
239 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
240 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
241 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
242 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
243 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
244 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
245 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
246 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
247 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
248 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
249 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
252 const unsigned char _S_lower[ctype<char>::table_size] =
254 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
255 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
256 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
257 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
258 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
259 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
260 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
261 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
262 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
263 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
264 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
265 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
266 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
267 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
268 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
269 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
270 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
271 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
272 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
273 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
274 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
275 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
276 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
277 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
278 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
279 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
280 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
281 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
282 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
283 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
284 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
285 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
288 //An helper struct to check wchar_t index without generating warnings
289 //under some compilers (gcc) because of a limited range of value
290 //(when wchar_t is unsigned)
291 template <bool _IsSigned>
294 #if !defined (__BORLANDC__) && \
295 !(defined (__GNUC__) && (defined (__MINGW32__) || defined (__CYGWIN__))) && \
298 struct _WCharIndexT<true> {
299 static bool in_range(wchar_t c, size_t upperBound) {
300 return c >= 0 && size_t(c) < upperBound;
306 struct _WCharIndexT<false> {
307 static bool in_range(wchar_t c, size_t upperBound) {
308 return size_t(c) < upperBound;
312 typedef _WCharIndexT<wchar_t(-1) < 0> _WCharIndex;
314 // Some helper functions used in ctype<>::scan_is and scan_is_not.
316 struct _Ctype_is_mask {
317 typedef char argument_type;
318 typedef bool result_type;
320 ctype_base::mask _Mask;
321 const ctype_base::mask* _M_table;
323 _Ctype_is_mask(ctype_base::mask __m, const ctype_base::mask* __t) : _Mask(__m), _M_table(__t) {}
324 bool operator()(char __c) const { return (_M_table[(unsigned char) __c] & _Mask) != 0; }
327 struct _Ctype_not_mask {
328 typedef char argument_type;
329 typedef bool result_type;
331 ctype_base::mask _Mask;
332 const ctype_base::mask* _M_table;
334 _Ctype_not_mask(ctype_base::mask __m, const ctype_base::mask* __t) : _Mask(__m), _M_table(__t) {}
335 bool operator()(char __c) const { return (_M_table[(unsigned char) __c] & _Mask) == 0; }
338 ctype<char>::ctype(const ctype_base::mask * __tab, bool __del, size_t __refs) :
339 locale::facet(__refs),
340 _M_ctype_table(__tab ? __tab : classic_table()),
341 _M_delete(__tab && __del)
344 ctype<char>::~ctype() {
346 delete[] __CONST_CAST(ctype_base::mask *, _M_ctype_table);
350 ctype<char>::scan_is(ctype_base::mask __m, const char* __low, const char* __high) const {
351 return _STLP_STD::find_if(__low, __high, _Ctype_is_mask(__m, _M_ctype_table));
355 ctype<char>::scan_not(ctype_base::mask __m, const char* __low, const char* __high) const {
356 return _STLP_STD::find_if(__low, __high, _Ctype_not_mask(__m, _M_ctype_table));
359 char ctype<char>::do_toupper(char __c) const
360 { return (char) _S_upper[(unsigned char) __c]; }
361 char ctype<char>::do_tolower(char __c) const
362 { return (char) _S_lower[(unsigned char) __c]; }
364 const char* ctype<char>::do_toupper(char* __low, const char* __high) const {
365 for ( ; __low < __high; ++__low)
366 *__low = (char) _S_upper[(unsigned char) *__low];
369 const char* ctype<char>::do_tolower(char* __low, const char* __high) const {
370 for ( ; __low < __high; ++__low)
371 *__low = (char) _S_lower[(unsigned char) *__low];
376 ctype<char>::do_widen(char __c) const { return __c; }
379 ctype<char>::do_widen(const char* __low, const char* __high,
381 _STLP_PRIV __copy_trivial(__low, __high, __to);
385 ctype<char>::do_narrow(char __c, char /* dfault */ ) const { return __c; }
387 ctype<char>::do_narrow(const char* __low, const char* __high,
388 char /* dfault */, char* __to) const {
389 _STLP_PRIV __copy_trivial(__low, __high, __to);
394 #if !defined (_STLP_NO_WCHAR_T)
396 struct _Ctype_w_is_mask {
397 typedef wchar_t argument_type;
398 typedef bool result_type;
401 const ctype_base::mask* table;
403 _Ctype_w_is_mask(ctype_base::mask m, const ctype_base::mask* t)
405 bool operator()(wchar_t c) const {
406 return _WCharIndex::in_range(c, ctype<char>::table_size) && (table[c] & M);
410 //----------------------------------------------------------------------
413 ctype<wchar_t>::~ctype() {}
416 bool ctype<wchar_t>::do_is(ctype_base::mask m, wchar_t c) const {
417 const ctype_base::mask * table = ctype<char>::classic_table();
418 return _WCharIndex::in_range(c, ctype<char>::table_size) && (m & table[c]);
421 const wchar_t* ctype<wchar_t>::do_is(const wchar_t* low, const wchar_t* high,
422 ctype_base::mask * vec) const {
423 // boris : not clear if this is the right thing to do...
424 const ctype_base::mask * table = ctype<char>::classic_table();
425 for ( ; low < high; ++low, ++vec) {
427 *vec = _WCharIndex::in_range(c, ctype<char>::table_size) ? table[c] : ctype_base::mask(0);
433 ctype<wchar_t>::do_scan_is(ctype_base::mask m,
434 const wchar_t* low, const wchar_t* high) const {
435 return find_if(low, high, _Ctype_w_is_mask(m, ctype<char>::classic_table()));
440 ctype<wchar_t>::do_scan_not(ctype_base::mask m,
441 const wchar_t* low, const wchar_t* high) const {
442 return find_if(low, high, not1(_Ctype_w_is_mask(m, ctype<char>::classic_table())));
445 wchar_t ctype<wchar_t>::do_toupper(wchar_t c) const {
446 return _WCharIndex::in_range(c, ctype<char>::table_size) ? (wchar_t)_S_upper[c]
451 ctype<wchar_t>::do_toupper(wchar_t* low, const wchar_t* high) const {
452 for ( ; low < high; ++low) {
454 *low = _WCharIndex::in_range(c, ctype<char>::table_size) ? (wchar_t)_S_upper[c]
460 wchar_t ctype<wchar_t>::do_tolower(wchar_t c) const {
461 return _WCharIndex::in_range(c, ctype<char>::table_size) ? (wchar_t)_S_lower[c]
466 ctype<wchar_t>::do_tolower(wchar_t* low, const wchar_t* high) const {
467 for ( ; low < high; ++low) {
469 *low = _WCharIndex::in_range(c, ctype<char>::table_size) ? (wchar_t)_S_lower[c]
475 wchar_t ctype<wchar_t>::do_widen(char c) const {
476 return (wchar_t)(unsigned char)c;
480 ctype<wchar_t>::do_widen(const char* low, const char* high,
481 wchar_t* dest) const {
483 *dest++ = (wchar_t)(unsigned char)*low++;
487 char ctype<wchar_t>::do_narrow(wchar_t c, char dfault) const {
488 return (unsigned char) c == c ? c : dfault;
491 const wchar_t* ctype<wchar_t>::do_narrow(const wchar_t* low,
493 char dfault, char* dest) const {
494 while (low != high) {
496 *dest++ = (unsigned char) c == c ? c : dfault;