]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/spirit/home/support/char_class.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / spirit / home / support / char_class.hpp
1 /*=============================================================================
2 Copyright (c) 2001-2011 Joel de Guzman
3 Copyright (c) 2001-2011 Hartmut Kaiser
4
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
8 #if !defined(BOOST_SPIRIT_CHAR_CLASS_NOVEMBER_10_2006_0907AM)
9 #define BOOST_SPIRIT_CHAR_CLASS_NOVEMBER_10_2006_0907AM
10
11 #if defined(_MSC_VER)
12 #pragma once
13 #endif
14
15 #include <string>
16
17 #include <boost/spirit/include/phoenix_limits.hpp> // needs to be included before proto
18 #include <boost/proto/proto.hpp>
19 #include <boost/config.hpp>
20 #include <boost/mpl/bool.hpp>
21 #include <boost/spirit/home/support/unused.hpp>
22 #include <boost/spirit/home/support/detail/is_spirit_tag.hpp>
23 #include <boost/type_traits/is_signed.hpp>
24 #include <boost/type_traits/make_unsigned.hpp>
25 #include <boost/type_traits/make_signed.hpp>
26
27 #if defined(BOOST_MSVC)
28 # pragma warning(push)
29 # pragma warning(disable: 4127) // conditional expression is constant
30 # pragma warning(disable: 4800) // 'int' : forcing value to bool 'true' or 'false' warning
31 #endif
32
33 namespace boost { namespace spirit { namespace detail
34 {
35 // Here's the thing... typical encodings (except ASCII) deal with unsigned
36 // integers > 127. ASCII uses only 127. Yet, most char and wchar_t are signed.
37 // Thus, a char with value > 127 is negative (e.g. char 233 is -23). When you
38 // cast this to an unsigned int with 32 bits, you get 4294967273!
39 //
40 // The trick is to cast to an unsigned version of the source char first
41 // before casting to the target. {P.S. Don't worry about the code, the
42 // optimizer will optimize the if-else branches}
43
44 template <typename TargetChar, typename SourceChar>
45 TargetChar cast_char(SourceChar ch)
46 {
47 if (is_signed<TargetChar>::value != is_signed<SourceChar>::value)
48 {
49 if (is_signed<SourceChar>::value)
50 {
51 // source is signed, target is unsigned
52 typedef typename make_unsigned<SourceChar>::type USourceChar;
53 return TargetChar(USourceChar(ch));
54 }
55 else
56 {
57 // source is unsigned, target is signed
58 typedef typename make_signed<SourceChar>::type SSourceChar;
59 return TargetChar(SSourceChar(ch));
60 }
61 }
62 else
63 {
64 // source and target has same signedness
65 return TargetChar(ch); // just cast
66 }
67 }
68 }}}
69
70 namespace boost { namespace spirit { namespace tag
71 {
72 struct char_ { BOOST_SPIRIT_IS_TAG() };
73 struct string { BOOST_SPIRIT_IS_TAG() };
74
75 ///////////////////////////////////////////////////////////////////////////
76 // classification tags
77 struct alnum { BOOST_SPIRIT_IS_TAG() };
78 struct alpha { BOOST_SPIRIT_IS_TAG() };
79 struct digit { BOOST_SPIRIT_IS_TAG() };
80 struct xdigit { BOOST_SPIRIT_IS_TAG() };
81 struct cntrl { BOOST_SPIRIT_IS_TAG() };
82 struct graph { BOOST_SPIRIT_IS_TAG() };
83 struct print { BOOST_SPIRIT_IS_TAG() };
84 struct punct { BOOST_SPIRIT_IS_TAG() };
85 struct space { BOOST_SPIRIT_IS_TAG() };
86 struct blank { BOOST_SPIRIT_IS_TAG() };
87
88 ///////////////////////////////////////////////////////////////////////////
89 // classification/conversion tags
90 struct no_case { BOOST_SPIRIT_IS_TAG() };
91 struct lower { BOOST_SPIRIT_IS_TAG() };
92 struct upper { BOOST_SPIRIT_IS_TAG() };
93 struct lowernum { BOOST_SPIRIT_IS_TAG() };
94 struct uppernum { BOOST_SPIRIT_IS_TAG() };
95 struct ucs4 { BOOST_SPIRIT_IS_TAG() };
96 struct encoding { BOOST_SPIRIT_IS_TAG() };
97
98 #if defined(BOOST_SPIRIT_UNICODE)
99 ///////////////////////////////////////////////////////////////////////////
100 // Unicode Major Categories
101 ///////////////////////////////////////////////////////////////////////////
102 struct letter { BOOST_SPIRIT_IS_TAG() };
103 struct mark { BOOST_SPIRIT_IS_TAG() };
104 struct number { BOOST_SPIRIT_IS_TAG() };
105 struct separator { BOOST_SPIRIT_IS_TAG() };
106 struct other { BOOST_SPIRIT_IS_TAG() };
107 struct punctuation { BOOST_SPIRIT_IS_TAG() };
108 struct symbol { BOOST_SPIRIT_IS_TAG() };
109
110 ///////////////////////////////////////////////////////////////////////////
111 // Unicode General Categories
112 ///////////////////////////////////////////////////////////////////////////
113 struct uppercase_letter { BOOST_SPIRIT_IS_TAG() };
114 struct lowercase_letter { BOOST_SPIRIT_IS_TAG() };
115 struct titlecase_letter { BOOST_SPIRIT_IS_TAG() };
116 struct modifier_letter { BOOST_SPIRIT_IS_TAG() };
117 struct other_letter { BOOST_SPIRIT_IS_TAG() };
118
119 struct nonspacing_mark { BOOST_SPIRIT_IS_TAG() };
120 struct enclosing_mark { BOOST_SPIRIT_IS_TAG() };
121 struct spacing_mark { BOOST_SPIRIT_IS_TAG() };
122
123 struct decimal_number { BOOST_SPIRIT_IS_TAG() };
124 struct letter_number { BOOST_SPIRIT_IS_TAG() };
125 struct other_number { BOOST_SPIRIT_IS_TAG() };
126
127 struct space_separator { BOOST_SPIRIT_IS_TAG() };
128 struct line_separator { BOOST_SPIRIT_IS_TAG() };
129 struct paragraph_separator { BOOST_SPIRIT_IS_TAG() };
130
131 struct control { BOOST_SPIRIT_IS_TAG() };
132 struct format { BOOST_SPIRIT_IS_TAG() };
133 struct private_use { BOOST_SPIRIT_IS_TAG() };
134 struct surrogate { BOOST_SPIRIT_IS_TAG() };
135 struct unassigned { BOOST_SPIRIT_IS_TAG() };
136
137 struct dash_punctuation { BOOST_SPIRIT_IS_TAG() };
138 struct open_punctuation { BOOST_SPIRIT_IS_TAG() };
139 struct close_punctuation { BOOST_SPIRIT_IS_TAG() };
140 struct connector_punctuation { BOOST_SPIRIT_IS_TAG() };
141 struct other_punctuation { BOOST_SPIRIT_IS_TAG() };
142 struct initial_punctuation { BOOST_SPIRIT_IS_TAG() };
143 struct final_punctuation { BOOST_SPIRIT_IS_TAG() };
144
145 struct math_symbol { BOOST_SPIRIT_IS_TAG() };
146 struct currency_symbol { BOOST_SPIRIT_IS_TAG() };
147 struct modifier_symbol { BOOST_SPIRIT_IS_TAG() };
148 struct other_symbol { BOOST_SPIRIT_IS_TAG() };
149
150 ///////////////////////////////////////////////////////////////////////////
151 // Unicode Derived Categories
152 ///////////////////////////////////////////////////////////////////////////
153 struct alphabetic { BOOST_SPIRIT_IS_TAG() };
154 struct uppercase { BOOST_SPIRIT_IS_TAG() };
155 struct lowercase { BOOST_SPIRIT_IS_TAG() };
156 struct white_space { BOOST_SPIRIT_IS_TAG() };
157 struct hex_digit { BOOST_SPIRIT_IS_TAG() };
158 struct noncharacter_code_point { BOOST_SPIRIT_IS_TAG() };
159 struct default_ignorable_code_point { BOOST_SPIRIT_IS_TAG() };
160
161 ///////////////////////////////////////////////////////////////////////////
162 // Unicode Scripts
163 ///////////////////////////////////////////////////////////////////////////
164 struct arabic { BOOST_SPIRIT_IS_TAG() };
165 struct imperial_aramaic { BOOST_SPIRIT_IS_TAG() };
166 struct armenian { BOOST_SPIRIT_IS_TAG() };
167 struct avestan { BOOST_SPIRIT_IS_TAG() };
168 struct balinese { BOOST_SPIRIT_IS_TAG() };
169 struct bamum { BOOST_SPIRIT_IS_TAG() };
170 struct bengali { BOOST_SPIRIT_IS_TAG() };
171 struct bopomofo { BOOST_SPIRIT_IS_TAG() };
172 struct braille { BOOST_SPIRIT_IS_TAG() };
173 struct buginese { BOOST_SPIRIT_IS_TAG() };
174 struct buhid { BOOST_SPIRIT_IS_TAG() };
175 struct canadian_aboriginal { BOOST_SPIRIT_IS_TAG() };
176 struct carian { BOOST_SPIRIT_IS_TAG() };
177 struct cham { BOOST_SPIRIT_IS_TAG() };
178 struct cherokee { BOOST_SPIRIT_IS_TAG() };
179 struct coptic { BOOST_SPIRIT_IS_TAG() };
180 struct cypriot { BOOST_SPIRIT_IS_TAG() };
181 struct cyrillic { BOOST_SPIRIT_IS_TAG() };
182 struct devanagari { BOOST_SPIRIT_IS_TAG() };
183 struct deseret { BOOST_SPIRIT_IS_TAG() };
184 struct egyptian_hieroglyphs { BOOST_SPIRIT_IS_TAG() };
185 struct ethiopic { BOOST_SPIRIT_IS_TAG() };
186 struct georgian { BOOST_SPIRIT_IS_TAG() };
187 struct glagolitic { BOOST_SPIRIT_IS_TAG() };
188 struct gothic { BOOST_SPIRIT_IS_TAG() };
189 struct greek { BOOST_SPIRIT_IS_TAG() };
190 struct gujarati { BOOST_SPIRIT_IS_TAG() };
191 struct gurmukhi { BOOST_SPIRIT_IS_TAG() };
192 struct hangul { BOOST_SPIRIT_IS_TAG() };
193 struct han { BOOST_SPIRIT_IS_TAG() };
194 struct hanunoo { BOOST_SPIRIT_IS_TAG() };
195 struct hebrew { BOOST_SPIRIT_IS_TAG() };
196 struct hiragana { BOOST_SPIRIT_IS_TAG() };
197 struct katakana_or_hiragana { BOOST_SPIRIT_IS_TAG() };
198 struct old_italic { BOOST_SPIRIT_IS_TAG() };
199 struct javanese { BOOST_SPIRIT_IS_TAG() };
200 struct kayah_li { BOOST_SPIRIT_IS_TAG() };
201 struct katakana { BOOST_SPIRIT_IS_TAG() };
202 struct kharoshthi { BOOST_SPIRIT_IS_TAG() };
203 struct khmer { BOOST_SPIRIT_IS_TAG() };
204 struct kannada { BOOST_SPIRIT_IS_TAG() };
205 struct kaithi { BOOST_SPIRIT_IS_TAG() };
206 struct tai_tham { BOOST_SPIRIT_IS_TAG() };
207 struct lao { BOOST_SPIRIT_IS_TAG() };
208 struct latin { BOOST_SPIRIT_IS_TAG() };
209 struct lepcha { BOOST_SPIRIT_IS_TAG() };
210 struct limbu { BOOST_SPIRIT_IS_TAG() };
211 struct linear_b { BOOST_SPIRIT_IS_TAG() };
212 struct lisu { BOOST_SPIRIT_IS_TAG() };
213 struct lycian { BOOST_SPIRIT_IS_TAG() };
214 struct lydian { BOOST_SPIRIT_IS_TAG() };
215 struct malayalam { BOOST_SPIRIT_IS_TAG() };
216 struct mongolian { BOOST_SPIRIT_IS_TAG() };
217 struct meetei_mayek { BOOST_SPIRIT_IS_TAG() };
218 struct myanmar { BOOST_SPIRIT_IS_TAG() };
219 struct nko { BOOST_SPIRIT_IS_TAG() };
220 struct ogham { BOOST_SPIRIT_IS_TAG() };
221 struct ol_chiki { BOOST_SPIRIT_IS_TAG() };
222 struct old_turkic { BOOST_SPIRIT_IS_TAG() };
223 struct oriya { BOOST_SPIRIT_IS_TAG() };
224 struct osmanya { BOOST_SPIRIT_IS_TAG() };
225 struct phags_pa { BOOST_SPIRIT_IS_TAG() };
226 struct inscriptional_pahlavi { BOOST_SPIRIT_IS_TAG() };
227 struct phoenician { BOOST_SPIRIT_IS_TAG() };
228 struct inscriptional_parthian { BOOST_SPIRIT_IS_TAG() };
229 struct rejang { BOOST_SPIRIT_IS_TAG() };
230 struct runic { BOOST_SPIRIT_IS_TAG() };
231 struct samaritan { BOOST_SPIRIT_IS_TAG() };
232 struct old_south_arabian { BOOST_SPIRIT_IS_TAG() };
233 struct saurashtra { BOOST_SPIRIT_IS_TAG() };
234 struct shavian { BOOST_SPIRIT_IS_TAG() };
235 struct sinhala { BOOST_SPIRIT_IS_TAG() };
236 struct sundanese { BOOST_SPIRIT_IS_TAG() };
237 struct syloti_nagri { BOOST_SPIRIT_IS_TAG() };
238 struct syriac { BOOST_SPIRIT_IS_TAG() };
239 struct tagbanwa { BOOST_SPIRIT_IS_TAG() };
240 struct tai_le { BOOST_SPIRIT_IS_TAG() };
241 struct new_tai_lue { BOOST_SPIRIT_IS_TAG() };
242 struct tamil { BOOST_SPIRIT_IS_TAG() };
243 struct tai_viet { BOOST_SPIRIT_IS_TAG() };
244 struct telugu { BOOST_SPIRIT_IS_TAG() };
245 struct tifinagh { BOOST_SPIRIT_IS_TAG() };
246 struct tagalog { BOOST_SPIRIT_IS_TAG() };
247 struct thaana { BOOST_SPIRIT_IS_TAG() };
248 struct thai { BOOST_SPIRIT_IS_TAG() };
249 struct tibetan { BOOST_SPIRIT_IS_TAG() };
250 struct ugaritic { BOOST_SPIRIT_IS_TAG() };
251 struct vai { BOOST_SPIRIT_IS_TAG() };
252 struct old_persian { BOOST_SPIRIT_IS_TAG() };
253 struct cuneiform { BOOST_SPIRIT_IS_TAG() };
254 struct yi { BOOST_SPIRIT_IS_TAG() };
255 struct inherited { BOOST_SPIRIT_IS_TAG() };
256 struct common { BOOST_SPIRIT_IS_TAG() };
257 struct unknown { BOOST_SPIRIT_IS_TAG() };
258 #endif
259
260 ///////////////////////////////////////////////////////////////////////////
261 // This composite tag type encodes both the character
262 // set and the specific char tag (used for classification
263 // or conversion). char_code_base and char_encoding_base
264 // can be used to test for modifier membership (see modifier.hpp)
265 template <typename CharClass>
266 struct char_code_base {};
267
268 template <typename CharEncoding>
269 struct char_encoding_base {};
270
271 template <typename CharClass, typename CharEncoding>
272 struct char_code
273 : char_code_base<CharClass>, char_encoding_base<CharEncoding>
274 {
275 BOOST_SPIRIT_IS_TAG()
276 typedef CharEncoding char_encoding; // e.g. ascii
277 typedef CharClass char_class; // e.g. tag::alnum
278 };
279 }}}
280
281 namespace boost { namespace spirit { namespace char_class
282 {
283 ///////////////////////////////////////////////////////////////////////////
284 // Test characters for classification
285 template <typename CharEncoding>
286 struct classify
287 {
288 typedef typename CharEncoding::char_type char_type;
289
290 #define BOOST_SPIRIT_CLASSIFY(name, isname) \
291 template <typename Char> \
292 static bool \
293 is(tag::name, Char ch) \
294 { \
295 return CharEncoding::isname \
296 BOOST_PREVENT_MACRO_SUBSTITUTION \
297 (detail::cast_char<char_type>(ch)); \
298 } \
299 /***/
300
301 BOOST_SPIRIT_CLASSIFY(char_, ischar)
302 BOOST_SPIRIT_CLASSIFY(alnum, isalnum)
303 BOOST_SPIRIT_CLASSIFY(alpha, isalpha)
304 BOOST_SPIRIT_CLASSIFY(digit, isdigit)
305 BOOST_SPIRIT_CLASSIFY(xdigit, isxdigit)
306 BOOST_SPIRIT_CLASSIFY(cntrl, iscntrl)
307 BOOST_SPIRIT_CLASSIFY(graph, isgraph)
308 BOOST_SPIRIT_CLASSIFY(lower, islower)
309 BOOST_SPIRIT_CLASSIFY(print, isprint)
310 BOOST_SPIRIT_CLASSIFY(punct, ispunct)
311 BOOST_SPIRIT_CLASSIFY(space, isspace)
312 BOOST_SPIRIT_CLASSIFY(blank, isblank)
313 BOOST_SPIRIT_CLASSIFY(upper, isupper)
314
315 #undef BOOST_SPIRIT_CLASSIFY
316
317 template <typename Char>
318 static bool
319 is(tag::lowernum, Char ch)
320 {
321 return CharEncoding::islower(detail::cast_char<char_type>(ch)) ||
322 CharEncoding::isdigit(detail::cast_char<char_type>(ch));
323 }
324
325 template <typename Char>
326 static bool
327 is(tag::uppernum, Char ch)
328 {
329 return CharEncoding::isupper(detail::cast_char<char_type>(ch)) ||
330 CharEncoding::isdigit(detail::cast_char<char_type>(ch));
331 }
332
333 #if defined(BOOST_SPIRIT_UNICODE)
334
335 #define BOOST_SPIRIT_UNICODE_CLASSIFY(name) \
336 template <typename Char> \
337 static bool \
338 is(tag::name, Char ch) \
339 { \
340 return CharEncoding::is_##name(detail::cast_char<char_type>(ch)); \
341 } \
342 /***/
343
344 ///////////////////////////////////////////////////////////////////////////
345 // Unicode Major Categories
346 ///////////////////////////////////////////////////////////////////////////
347 BOOST_SPIRIT_UNICODE_CLASSIFY(letter)
348 BOOST_SPIRIT_UNICODE_CLASSIFY(mark)
349 BOOST_SPIRIT_UNICODE_CLASSIFY(number)
350 BOOST_SPIRIT_UNICODE_CLASSIFY(separator)
351 BOOST_SPIRIT_UNICODE_CLASSIFY(other)
352 BOOST_SPIRIT_UNICODE_CLASSIFY(punctuation)
353 BOOST_SPIRIT_UNICODE_CLASSIFY(symbol)
354
355 ///////////////////////////////////////////////////////////////////////////
356 // Unicode General Categories
357 ///////////////////////////////////////////////////////////////////////////
358 BOOST_SPIRIT_UNICODE_CLASSIFY(uppercase_letter)
359 BOOST_SPIRIT_UNICODE_CLASSIFY(lowercase_letter)
360 BOOST_SPIRIT_UNICODE_CLASSIFY(titlecase_letter)
361 BOOST_SPIRIT_UNICODE_CLASSIFY(modifier_letter)
362 BOOST_SPIRIT_UNICODE_CLASSIFY(other_letter)
363
364 BOOST_SPIRIT_UNICODE_CLASSIFY(nonspacing_mark)
365 BOOST_SPIRIT_UNICODE_CLASSIFY(enclosing_mark)
366 BOOST_SPIRIT_UNICODE_CLASSIFY(spacing_mark)
367
368 BOOST_SPIRIT_UNICODE_CLASSIFY(decimal_number)
369 BOOST_SPIRIT_UNICODE_CLASSIFY(letter_number)
370 BOOST_SPIRIT_UNICODE_CLASSIFY(other_number)
371
372 BOOST_SPIRIT_UNICODE_CLASSIFY(space_separator)
373 BOOST_SPIRIT_UNICODE_CLASSIFY(line_separator)
374 BOOST_SPIRIT_UNICODE_CLASSIFY(paragraph_separator)
375
376 BOOST_SPIRIT_UNICODE_CLASSIFY(control)
377 BOOST_SPIRIT_UNICODE_CLASSIFY(format)
378 BOOST_SPIRIT_UNICODE_CLASSIFY(private_use)
379 BOOST_SPIRIT_UNICODE_CLASSIFY(surrogate)
380 BOOST_SPIRIT_UNICODE_CLASSIFY(unassigned)
381
382 BOOST_SPIRIT_UNICODE_CLASSIFY(dash_punctuation)
383 BOOST_SPIRIT_UNICODE_CLASSIFY(open_punctuation)
384 BOOST_SPIRIT_UNICODE_CLASSIFY(close_punctuation)
385 BOOST_SPIRIT_UNICODE_CLASSIFY(connector_punctuation)
386 BOOST_SPIRIT_UNICODE_CLASSIFY(other_punctuation)
387 BOOST_SPIRIT_UNICODE_CLASSIFY(initial_punctuation)
388 BOOST_SPIRIT_UNICODE_CLASSIFY(final_punctuation)
389
390 BOOST_SPIRIT_UNICODE_CLASSIFY(math_symbol)
391 BOOST_SPIRIT_UNICODE_CLASSIFY(currency_symbol)
392 BOOST_SPIRIT_UNICODE_CLASSIFY(modifier_symbol)
393 BOOST_SPIRIT_UNICODE_CLASSIFY(other_symbol)
394
395 ///////////////////////////////////////////////////////////////////////////
396 // Unicode Derived Categories
397 ///////////////////////////////////////////////////////////////////////////
398 BOOST_SPIRIT_UNICODE_CLASSIFY(alphabetic)
399 BOOST_SPIRIT_UNICODE_CLASSIFY(uppercase)
400 BOOST_SPIRIT_UNICODE_CLASSIFY(lowercase)
401 BOOST_SPIRIT_UNICODE_CLASSIFY(white_space)
402 BOOST_SPIRIT_UNICODE_CLASSIFY(hex_digit)
403 BOOST_SPIRIT_UNICODE_CLASSIFY(noncharacter_code_point)
404 BOOST_SPIRIT_UNICODE_CLASSIFY(default_ignorable_code_point)
405
406 ///////////////////////////////////////////////////////////////////////////
407 // Unicode Scripts
408 ///////////////////////////////////////////////////////////////////////////
409 BOOST_SPIRIT_UNICODE_CLASSIFY(arabic)
410 BOOST_SPIRIT_UNICODE_CLASSIFY(imperial_aramaic)
411 BOOST_SPIRIT_UNICODE_CLASSIFY(armenian)
412 BOOST_SPIRIT_UNICODE_CLASSIFY(avestan)
413 BOOST_SPIRIT_UNICODE_CLASSIFY(balinese)
414 BOOST_SPIRIT_UNICODE_CLASSIFY(bamum)
415 BOOST_SPIRIT_UNICODE_CLASSIFY(bengali)
416 BOOST_SPIRIT_UNICODE_CLASSIFY(bopomofo)
417 BOOST_SPIRIT_UNICODE_CLASSIFY(braille)
418 BOOST_SPIRIT_UNICODE_CLASSIFY(buginese)
419 BOOST_SPIRIT_UNICODE_CLASSIFY(buhid)
420 BOOST_SPIRIT_UNICODE_CLASSIFY(canadian_aboriginal)
421 BOOST_SPIRIT_UNICODE_CLASSIFY(carian)
422 BOOST_SPIRIT_UNICODE_CLASSIFY(cham)
423 BOOST_SPIRIT_UNICODE_CLASSIFY(cherokee)
424 BOOST_SPIRIT_UNICODE_CLASSIFY(coptic)
425 BOOST_SPIRIT_UNICODE_CLASSIFY(cypriot)
426 BOOST_SPIRIT_UNICODE_CLASSIFY(cyrillic)
427 BOOST_SPIRIT_UNICODE_CLASSIFY(devanagari)
428 BOOST_SPIRIT_UNICODE_CLASSIFY(deseret)
429 BOOST_SPIRIT_UNICODE_CLASSIFY(egyptian_hieroglyphs)
430 BOOST_SPIRIT_UNICODE_CLASSIFY(ethiopic)
431 BOOST_SPIRIT_UNICODE_CLASSIFY(georgian)
432 BOOST_SPIRIT_UNICODE_CLASSIFY(glagolitic)
433 BOOST_SPIRIT_UNICODE_CLASSIFY(gothic)
434 BOOST_SPIRIT_UNICODE_CLASSIFY(greek)
435 BOOST_SPIRIT_UNICODE_CLASSIFY(gujarati)
436 BOOST_SPIRIT_UNICODE_CLASSIFY(gurmukhi)
437 BOOST_SPIRIT_UNICODE_CLASSIFY(hangul)
438 BOOST_SPIRIT_UNICODE_CLASSIFY(han)
439 BOOST_SPIRIT_UNICODE_CLASSIFY(hanunoo)
440 BOOST_SPIRIT_UNICODE_CLASSIFY(hebrew)
441 BOOST_SPIRIT_UNICODE_CLASSIFY(hiragana)
442 BOOST_SPIRIT_UNICODE_CLASSIFY(katakana_or_hiragana)
443 BOOST_SPIRIT_UNICODE_CLASSIFY(old_italic)
444 BOOST_SPIRIT_UNICODE_CLASSIFY(javanese)
445 BOOST_SPIRIT_UNICODE_CLASSIFY(kayah_li)
446 BOOST_SPIRIT_UNICODE_CLASSIFY(katakana)
447 BOOST_SPIRIT_UNICODE_CLASSIFY(kharoshthi)
448 BOOST_SPIRIT_UNICODE_CLASSIFY(khmer)
449 BOOST_SPIRIT_UNICODE_CLASSIFY(kannada)
450 BOOST_SPIRIT_UNICODE_CLASSIFY(kaithi)
451 BOOST_SPIRIT_UNICODE_CLASSIFY(tai_tham)
452 BOOST_SPIRIT_UNICODE_CLASSIFY(lao)
453 BOOST_SPIRIT_UNICODE_CLASSIFY(latin)
454 BOOST_SPIRIT_UNICODE_CLASSIFY(lepcha)
455 BOOST_SPIRIT_UNICODE_CLASSIFY(limbu)
456 BOOST_SPIRIT_UNICODE_CLASSIFY(linear_b)
457 BOOST_SPIRIT_UNICODE_CLASSIFY(lisu)
458 BOOST_SPIRIT_UNICODE_CLASSIFY(lycian)
459 BOOST_SPIRIT_UNICODE_CLASSIFY(lydian)
460 BOOST_SPIRIT_UNICODE_CLASSIFY(malayalam)
461 BOOST_SPIRIT_UNICODE_CLASSIFY(mongolian)
462 BOOST_SPIRIT_UNICODE_CLASSIFY(meetei_mayek)
463 BOOST_SPIRIT_UNICODE_CLASSIFY(myanmar)
464 BOOST_SPIRIT_UNICODE_CLASSIFY(nko)
465 BOOST_SPIRIT_UNICODE_CLASSIFY(ogham)
466 BOOST_SPIRIT_UNICODE_CLASSIFY(ol_chiki)
467 BOOST_SPIRIT_UNICODE_CLASSIFY(old_turkic)
468 BOOST_SPIRIT_UNICODE_CLASSIFY(oriya)
469 BOOST_SPIRIT_UNICODE_CLASSIFY(osmanya)
470 BOOST_SPIRIT_UNICODE_CLASSIFY(phags_pa)
471 BOOST_SPIRIT_UNICODE_CLASSIFY(inscriptional_pahlavi)
472 BOOST_SPIRIT_UNICODE_CLASSIFY(phoenician)
473 BOOST_SPIRIT_UNICODE_CLASSIFY(inscriptional_parthian)
474 BOOST_SPIRIT_UNICODE_CLASSIFY(rejang)
475 BOOST_SPIRIT_UNICODE_CLASSIFY(runic)
476 BOOST_SPIRIT_UNICODE_CLASSIFY(samaritan)
477 BOOST_SPIRIT_UNICODE_CLASSIFY(old_south_arabian)
478 BOOST_SPIRIT_UNICODE_CLASSIFY(saurashtra)
479 BOOST_SPIRIT_UNICODE_CLASSIFY(shavian)
480 BOOST_SPIRIT_UNICODE_CLASSIFY(sinhala)
481 BOOST_SPIRIT_UNICODE_CLASSIFY(sundanese)
482 BOOST_SPIRIT_UNICODE_CLASSIFY(syloti_nagri)
483 BOOST_SPIRIT_UNICODE_CLASSIFY(syriac)
484 BOOST_SPIRIT_UNICODE_CLASSIFY(tagbanwa)
485 BOOST_SPIRIT_UNICODE_CLASSIFY(tai_le)
486 BOOST_SPIRIT_UNICODE_CLASSIFY(new_tai_lue)
487 BOOST_SPIRIT_UNICODE_CLASSIFY(tamil)
488 BOOST_SPIRIT_UNICODE_CLASSIFY(tai_viet)
489 BOOST_SPIRIT_UNICODE_CLASSIFY(telugu)
490 BOOST_SPIRIT_UNICODE_CLASSIFY(tifinagh)
491 BOOST_SPIRIT_UNICODE_CLASSIFY(tagalog)
492 BOOST_SPIRIT_UNICODE_CLASSIFY(thaana)
493 BOOST_SPIRIT_UNICODE_CLASSIFY(thai)
494 BOOST_SPIRIT_UNICODE_CLASSIFY(tibetan)
495 BOOST_SPIRIT_UNICODE_CLASSIFY(ugaritic)
496 BOOST_SPIRIT_UNICODE_CLASSIFY(vai)
497 BOOST_SPIRIT_UNICODE_CLASSIFY(old_persian)
498 BOOST_SPIRIT_UNICODE_CLASSIFY(cuneiform)
499 BOOST_SPIRIT_UNICODE_CLASSIFY(yi)
500 BOOST_SPIRIT_UNICODE_CLASSIFY(inherited)
501 BOOST_SPIRIT_UNICODE_CLASSIFY(common)
502 BOOST_SPIRIT_UNICODE_CLASSIFY(unknown)
503
504 #undef BOOST_SPIRIT_UNICODE_CLASSIFY
505 #endif
506
507 };
508
509 ///////////////////////////////////////////////////////////////////////////
510 // Convert characters
511 template <typename CharEncoding>
512 struct convert
513 {
514 typedef typename CharEncoding::char_type char_type;
515
516 template <typename Char>
517 static Char
518 to(tag::lower, Char ch)
519 {
520 return static_cast<Char>(
521 CharEncoding::tolower(detail::cast_char<char_type>(ch)));
522 }
523
524 template <typename Char>
525 static Char
526 to(tag::upper, Char ch)
527 {
528 return static_cast<Char>(
529 CharEncoding::toupper(detail::cast_char<char_type>(ch)));
530 }
531
532 template <typename Char>
533 static Char
534 to(tag::ucs4, Char ch)
535 {
536 return static_cast<Char>(
537 CharEncoding::toucs4(detail::cast_char<char_type>(ch)));
538 }
539
540 template <typename Char>
541 static Char
542 to(unused_type, Char ch)
543 {
544 return ch;
545 }
546 };
547
548 ///////////////////////////////////////////////////////////////////////////
549 // Info on character classification
550 template <typename CharEncoding>
551 struct what
552 {
553 #define BOOST_SPIRIT_CLASSIFY_WHAT(name, isname) \
554 static char const* is(tag::name) \
555 { \
556 return isname; \
557 } \
558 /***/
559
560 BOOST_SPIRIT_CLASSIFY_WHAT(char_, "char")
561 BOOST_SPIRIT_CLASSIFY_WHAT(alnum, "alnum")
562 BOOST_SPIRIT_CLASSIFY_WHAT(alpha, "alpha")
563 BOOST_SPIRIT_CLASSIFY_WHAT(digit, "digit")
564 BOOST_SPIRIT_CLASSIFY_WHAT(xdigit, "xdigit")
565 BOOST_SPIRIT_CLASSIFY_WHAT(cntrl, "cntrl")
566 BOOST_SPIRIT_CLASSIFY_WHAT(graph, "graph")
567 BOOST_SPIRIT_CLASSIFY_WHAT(lower, "lower")
568 BOOST_SPIRIT_CLASSIFY_WHAT(lowernum, "lowernum")
569 BOOST_SPIRIT_CLASSIFY_WHAT(print, "print")
570 BOOST_SPIRIT_CLASSIFY_WHAT(punct, "punct")
571 BOOST_SPIRIT_CLASSIFY_WHAT(space, "space")
572 BOOST_SPIRIT_CLASSIFY_WHAT(blank, "blank")
573 BOOST_SPIRIT_CLASSIFY_WHAT(upper, "upper")
574 BOOST_SPIRIT_CLASSIFY_WHAT(uppernum, "uppernum")
575 BOOST_SPIRIT_CLASSIFY_WHAT(ucs4, "ucs4")
576
577 #undef BOOST_SPIRIT_CLASSIFY_WHAT
578
579 #if defined(BOOST_SPIRIT_UNICODE)
580
581 #define BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(name) \
582 static char const* is(tag::name) \
583 { \
584 return BOOST_PP_STRINGIZE(name); \
585 } \
586 /***/
587
588 ///////////////////////////////////////////////////////////////////////////
589 // Unicode Major Categories
590 ///////////////////////////////////////////////////////////////////////////
591 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(letter)
592 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(mark)
593 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(number)
594 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(separator)
595 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other)
596 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(punctuation)
597 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(symbol)
598
599 ///////////////////////////////////////////////////////////////////////////
600 // Unicode General Categories
601 ///////////////////////////////////////////////////////////////////////////
602 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(uppercase_letter)
603 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lowercase_letter)
604 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(titlecase_letter)
605 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(modifier_letter)
606 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_letter)
607
608 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(nonspacing_mark)
609 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(enclosing_mark)
610 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(spacing_mark)
611
612 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(decimal_number)
613 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(letter_number)
614 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_number)
615
616 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(space_separator)
617 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(line_separator)
618 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(paragraph_separator)
619
620 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(control)
621 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(format)
622 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(private_use)
623 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(surrogate)
624 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(unassigned)
625
626 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(dash_punctuation)
627 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(open_punctuation)
628 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(close_punctuation)
629 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(connector_punctuation)
630 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_punctuation)
631 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(initial_punctuation)
632 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(final_punctuation)
633
634 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(math_symbol)
635 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(currency_symbol)
636 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(modifier_symbol)
637 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_symbol)
638
639 ///////////////////////////////////////////////////////////////////////////
640 // Unicode Derived Categories
641 ///////////////////////////////////////////////////////////////////////////
642 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(alphabetic)
643 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(uppercase)
644 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lowercase)
645 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(white_space)
646 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hex_digit)
647 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(noncharacter_code_point)
648 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(default_ignorable_code_point)
649
650 ///////////////////////////////////////////////////////////////////////////
651 // Unicode Scripts
652 ///////////////////////////////////////////////////////////////////////////
653 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(arabic)
654 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(imperial_aramaic)
655 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(armenian)
656 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(avestan)
657 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(balinese)
658 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bamum)
659 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bengali)
660 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bopomofo)
661 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(braille)
662 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(buginese)
663 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(buhid)
664 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(canadian_aboriginal)
665 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(carian)
666 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cham)
667 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cherokee)
668 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(coptic)
669 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cypriot)
670 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cyrillic)
671 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(devanagari)
672 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(deseret)
673 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(egyptian_hieroglyphs)
674 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ethiopic)
675 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(georgian)
676 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(glagolitic)
677 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gothic)
678 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(greek)
679 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gujarati)
680 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gurmukhi)
681 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hangul)
682 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(han)
683 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hanunoo)
684 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hebrew)
685 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hiragana)
686 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(katakana_or_hiragana)
687 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_italic)
688 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(javanese)
689 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kayah_li)
690 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(katakana)
691 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kharoshthi)
692 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(khmer)
693 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kannada)
694 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kaithi)
695 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_tham)
696 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lao)
697 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(latin)
698 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lepcha)
699 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(limbu)
700 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(linear_b)
701 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lisu)
702 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lycian)
703 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lydian)
704 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(malayalam)
705 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(mongolian)
706 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(meetei_mayek)
707 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(myanmar)
708 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(nko)
709 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ogham)
710 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ol_chiki)
711 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_turkic)
712 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(oriya)
713 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(osmanya)
714 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(phags_pa)
715 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inscriptional_pahlavi)
716 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(phoenician)
717 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inscriptional_parthian)
718 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(rejang)
719 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(runic)
720 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(samaritan)
721 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_south_arabian)
722 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(saurashtra)
723 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(shavian)
724 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(sinhala)
725 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(sundanese)
726 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(syloti_nagri)
727 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(syriac)
728 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tagbanwa)
729 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_le)
730 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(new_tai_lue)
731 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tamil)
732 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_viet)
733 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(telugu)
734 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tifinagh)
735 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tagalog)
736 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(thaana)
737 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(thai)
738 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tibetan)
739 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ugaritic)
740 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(vai)
741 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_persian)
742 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cuneiform)
743 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(yi)
744 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inherited)
745 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(common)
746 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(unknown)
747
748 #undef BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT
749 #endif
750
751 };
752 }}}
753
754 namespace boost { namespace spirit { namespace traits
755 {
756 ///////////////////////////////////////////////////////////////////////////
757 template <typename CharParam, typename CharEncoding>
758 struct ischar
759 {
760 static bool call(CharParam const& ch)
761 {
762 return CharEncoding::ischar(int(ch));
763 }
764 };
765 }}}
766
767 #if defined(BOOST_MSVC)
768 # pragma warning(pop)
769 #endif
770
771 #endif
772
773