diff options
Diffstat (limited to 'boost/spirit/home/x3/string/literal_string.hpp')
-rw-r--r-- | boost/spirit/home/x3/string/literal_string.hpp | 162 |
1 files changed, 143 insertions, 19 deletions
diff --git a/boost/spirit/home/x3/string/literal_string.hpp b/boost/spirit/home/x3/string/literal_string.hpp index bf05a9a08e..c562721b2e 100644 --- a/boost/spirit/home/x3/string/literal_string.hpp +++ b/boost/spirit/home/x3/string/literal_string.hpp @@ -7,13 +7,11 @@ #if !defined(BOOST_SPIRIT_X3_LITERAL_STRING_APR_18_2006_1125PM) #define BOOST_SPIRIT_X3_LITERAL_STRING_APR_18_2006_1125PM -#if defined(_MSC_VER) -#pragma once -#endif - #include <boost/spirit/home/x3/core/parser.hpp> #include <boost/spirit/home/x3/core/skip_over.hpp> #include <boost/spirit/home/x3/string/detail/string_parse.hpp> +#include <boost/spirit/home/x3/support/no_case.hpp> +#include <boost/spirit/home/x3/string/detail/no_case_string_parse.hpp> #include <boost/spirit/home/x3/support/utility/utf8.hpp> #include <boost/spirit/home/support/char_encoding/ascii.hpp> #include <boost/spirit/home/support/char_encoding/standard.hpp> @@ -36,7 +34,7 @@ namespace boost { namespace spirit { namespace x3 !is_same<unused_type, attribute_type>::value; static bool const handles_container = has_attribute; - literal_string(typename add_reference<String>::type str) + literal_string(typename add_reference< typename add_const<String>::type >::type str) : str(str) {} @@ -45,7 +43,7 @@ namespace boost { namespace spirit { namespace x3 , Context const& context, unused_type, Attribute_& attr) const { x3::skip_over(first, last, context); - return detail::string_parse(str, first, last, attr); + return detail::string_parse(str, first, last, attr, get_case_compare<encoding>(context)); } String str; @@ -56,19 +54,124 @@ namespace boost { namespace spirit { namespace x3 inline literal_string<char const*, char_encoding::standard> string(char const* s) { - return literal_string<char const*, char_encoding::standard>(s); + return { s }; + } + + inline literal_string<std::basic_string<char>, char_encoding::standard> + string(std::basic_string<char> const& s) + { + return { s }; + } + + inline literal_string<char const*, char_encoding::standard, unused_type> + lit(char const* s) + { + return { s }; + } + + template <typename Char> + literal_string<Char const*, char_encoding::standard, unused_type> + lit(std::basic_string<Char> const& s) + { + return { s.c_str() }; + } + } + + namespace standard_wide + { + inline literal_string<wchar_t const*, char_encoding::standard_wide> + string(wchar_t const* s) + { + return { s }; + } + + inline literal_string<std::basic_string<wchar_t>, char_encoding::standard_wide> + string(std::basic_string<wchar_t> const& s) + { + return { s }; + } + + inline literal_string<wchar_t const*, char_encoding::standard_wide, unused_type> + lit(wchar_t const* s) + { + return { s }; + } + + inline literal_string<wchar_t const*, char_encoding::standard_wide, unused_type> + lit(std::basic_string<wchar_t> const& s) + { + return { s.c_str() }; } } + + namespace ascii + { + inline literal_string<wchar_t const*, char_encoding::ascii> + string(wchar_t const* s) + { + return { s }; + } + + inline literal_string<std::basic_string<wchar_t>, char_encoding::ascii> + string(std::basic_string<wchar_t> const& s) + { + return { s }; + } + + inline literal_string<char const*, char_encoding::ascii, unused_type> + lit(char const* s) + { + return { s }; + } + + template <typename Char> + literal_string<Char const*, char_encoding::ascii, unused_type> + lit(std::basic_string<Char> const& s) + { + return { s.c_str() }; + } + } + + namespace iso8859_1 + { + inline literal_string<wchar_t const*, char_encoding::iso8859_1> + string(wchar_t const* s) + { + return { s }; + } + + inline literal_string<std::basic_string<wchar_t>, char_encoding::iso8859_1> + string(std::basic_string<wchar_t> const& s) + { + return { s }; + } + + inline literal_string<char const*, char_encoding::iso8859_1, unused_type> + lit(char const* s) + { + return { s }; + } + + template <typename Char> + literal_string<Char const*, char_encoding::iso8859_1, unused_type> + lit(std::basic_string<Char> const& s) + { + return { s.c_str() }; + } + } + using standard::string; + using standard::lit; + using standard_wide::string; + using standard_wide::lit; namespace extension { template <int N> struct as_parser<char[N]> { - typedef - literal_string< - char const*, char_encoding::standard, unused_type> + typedef literal_string< + char const*, char_encoding::standard, unused_type> type; typedef type value_type; @@ -85,9 +188,8 @@ namespace boost { namespace spirit { namespace x3 template <int N> struct as_parser<wchar_t[N]> { - typedef - literal_string< - wchar_t const*, char_encoding::standard_wide, unused_type> + typedef literal_string< + wchar_t const*, char_encoding::standard_wide, unused_type> type; typedef type value_type; @@ -100,14 +202,36 @@ namespace boost { namespace spirit { namespace x3 template <int N> struct as_parser<wchar_t const[N]> : as_parser<wchar_t[N]> {}; - } - using standard::string; + template <> + struct as_parser<char const*> + { + typedef literal_string< + char const*, char_encoding::standard, unused_type> + type; - inline literal_string<char const*, char_encoding::standard, unused_type> - lit(char const* s) - { - return literal_string<char const*, char_encoding::standard, unused_type>(s); + typedef type value_type; + + static type call(char const* s) + { + return type(s); + } + }; + + template <typename Char> + struct as_parser< std::basic_string<Char> > + { + typedef literal_string< + Char const*, char_encoding::standard, unused_type> + type; + + typedef type value_type; + + static type call(std::basic_string<Char> const& s) + { + return type(s.c_str()); + } + }; } template <typename String, typename Encoding, typename Attribute> |