Chris@102: /*============================================================================= Chris@102: Copyright (c) 2001-2014 Joel de Guzman Chris@102: Chris@102: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@102: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@102: ==============================================================================*/ Chris@102: #if !defined(BOOST_SPIRIT_X3_CHAR_CLASS_APRIL_16_2006_1051AM) Chris@102: #define BOOST_SPIRIT_X3_CHAR_CLASS_APRIL_16_2006_1051AM Chris@102: Chris@102: #if defined(_MSC_VER) Chris@102: #pragma once Chris@102: #endif Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost { namespace spirit { namespace x3 Chris@102: { Chris@102: /////////////////////////////////////////////////////////////////////////// Chris@102: struct char_tag {}; Chris@102: struct alnum_tag {}; Chris@102: struct alpha_tag {}; Chris@102: struct blank_tag {}; Chris@102: struct cntrl_tag {}; Chris@102: struct digit_tag {}; Chris@102: struct graph_tag {}; Chris@102: struct print_tag {}; Chris@102: struct punct_tag {}; Chris@102: struct space_tag {}; Chris@102: struct xdigit_tag {}; Chris@102: struct lower_tag {}; Chris@102: struct upper_tag {}; Chris@102: Chris@102: /////////////////////////////////////////////////////////////////////////// Chris@102: template Chris@102: struct char_class_base Chris@102: { Chris@102: typedef typename Encoding::char_type char_type; Chris@102: Chris@102: #define BOOST_SPIRIT_X3_CLASSIFY(name) \ Chris@102: template \ Chris@102: static bool \ Chris@102: is(name##_tag, Char ch) \ Chris@102: { \ Chris@102: return Encoding::is##name \ Chris@102: BOOST_PREVENT_MACRO_SUBSTITUTION \ Chris@102: (detail::cast_char(ch)); \ Chris@102: } \ Chris@102: /***/ Chris@102: Chris@102: BOOST_SPIRIT_X3_CLASSIFY(char) Chris@102: BOOST_SPIRIT_X3_CLASSIFY(alnum) Chris@102: BOOST_SPIRIT_X3_CLASSIFY(alpha) Chris@102: BOOST_SPIRIT_X3_CLASSIFY(digit) Chris@102: BOOST_SPIRIT_X3_CLASSIFY(xdigit) Chris@102: BOOST_SPIRIT_X3_CLASSIFY(cntrl) Chris@102: BOOST_SPIRIT_X3_CLASSIFY(graph) Chris@102: BOOST_SPIRIT_X3_CLASSIFY(lower) Chris@102: BOOST_SPIRIT_X3_CLASSIFY(print) Chris@102: BOOST_SPIRIT_X3_CLASSIFY(punct) Chris@102: BOOST_SPIRIT_X3_CLASSIFY(space) Chris@102: BOOST_SPIRIT_X3_CLASSIFY(blank) Chris@102: BOOST_SPIRIT_X3_CLASSIFY(upper) Chris@102: Chris@102: #undef BOOST_SPIRIT_X3_CLASSIFY Chris@102: }; Chris@102: Chris@102: template Chris@102: struct char_class Chris@102: : char_parser> Chris@102: { Chris@102: typedef Encoding encoding; Chris@102: typedef Tag tag; Chris@102: typedef typename Encoding::char_type char_type; Chris@102: typedef char_type attribute_type; Chris@102: static bool const has_attribute = true; Chris@102: Chris@102: template Chris@102: bool test(Char ch, Context const&) const Chris@102: { Chris@102: return ((sizeof(Char) <= sizeof(char_type)) || encoding::ischar(ch)) Chris@102: && char_class_base::is(tag(), ch); Chris@102: } Chris@102: }; Chris@102: Chris@102: #define BOOST_SPIRIT_X3_CHAR_CLASS(encoding, name) \ Chris@102: typedef char_class name##_type; \ Chris@102: name##_type const name = name##_type(); \ Chris@102: /***/ Chris@102: Chris@102: #define BOOST_SPIRIT_X3_CHAR_CLASSES(encoding) \ Chris@102: namespace encoding \ Chris@102: { \ Chris@102: BOOST_SPIRIT_X3_CHAR_CLASS(encoding, alnum) \ Chris@102: BOOST_SPIRIT_X3_CHAR_CLASS(encoding, alpha) \ Chris@102: BOOST_SPIRIT_X3_CHAR_CLASS(encoding, digit) \ Chris@102: BOOST_SPIRIT_X3_CHAR_CLASS(encoding, xdigit) \ Chris@102: BOOST_SPIRIT_X3_CHAR_CLASS(encoding, cntrl) \ Chris@102: BOOST_SPIRIT_X3_CHAR_CLASS(encoding, graph) \ Chris@102: BOOST_SPIRIT_X3_CHAR_CLASS(encoding, lower) \ Chris@102: BOOST_SPIRIT_X3_CHAR_CLASS(encoding, print) \ Chris@102: BOOST_SPIRIT_X3_CHAR_CLASS(encoding, punct) \ Chris@102: BOOST_SPIRIT_X3_CHAR_CLASS(encoding, space) \ Chris@102: BOOST_SPIRIT_X3_CHAR_CLASS(encoding, blank) \ Chris@102: BOOST_SPIRIT_X3_CHAR_CLASS(encoding, upper) \ Chris@102: } \ Chris@102: /***/ Chris@102: Chris@102: BOOST_SPIRIT_X3_CHAR_CLASSES(standard) Chris@102: BOOST_SPIRIT_X3_CHAR_CLASSES(standard_wide) Chris@102: BOOST_SPIRIT_X3_CHAR_CLASSES(ascii) Chris@102: BOOST_SPIRIT_X3_CHAR_CLASSES(iso8859_1) Chris@102: Chris@102: #undef BOOST_SPIRIT_X3_CHAR_CLASS Chris@102: #undef BOOST_SPIRIT_X3_CHAR_CLASSES Chris@102: Chris@102: using standard::alnum_type; Chris@102: using standard::alpha_type; Chris@102: using standard::digit_type; Chris@102: using standard::xdigit_type; Chris@102: using standard::cntrl_type; Chris@102: using standard::graph_type; Chris@102: using standard::lower_type; Chris@102: using standard::print_type; Chris@102: using standard::punct_type; Chris@102: using standard::space_type; Chris@102: using standard::blank_type; Chris@102: using standard::upper_type; Chris@102: Chris@102: using standard::alnum; Chris@102: using standard::alpha; Chris@102: using standard::digit; Chris@102: using standard::xdigit; Chris@102: using standard::cntrl; Chris@102: using standard::graph; Chris@102: using standard::lower; Chris@102: using standard::print; Chris@102: using standard::punct; Chris@102: using standard::space; Chris@102: using standard::blank; Chris@102: using standard::upper; Chris@102: }}} Chris@102: Chris@102: #endif