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