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