Imported Upstream version 1.72.0
[platform/upstream/boost.git] / 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