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_LITERAL_STRING_APR_18_2006_1125PM) Chris@102: #define BOOST_SPIRIT_X3_LITERAL_STRING_APR_18_2006_1125PM 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: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost { namespace spirit { namespace x3 Chris@102: { Chris@102: template > Chris@102: struct literal_string : parser> Chris@102: { Chris@102: typedef typename Encoding::char_type char_type; Chris@102: typedef Encoding encoding; Chris@102: typedef Attribute attribute_type; Chris@102: static bool const has_attribute = Chris@102: !is_same::value; Chris@102: static bool const handles_container = has_attribute; Chris@102: Chris@102: literal_string(typename add_reference::type str) Chris@102: : str(str) Chris@102: {} Chris@102: Chris@102: template Chris@102: bool parse(Iterator& first, Iterator const& last Chris@102: , Context const& context, unused_type, Attribute_& attr) const Chris@102: { Chris@102: x3::skip_over(first, last, context); Chris@102: return detail::string_parse(str, first, last, attr); Chris@102: } Chris@102: Chris@102: String str; Chris@102: }; Chris@102: Chris@102: namespace standard Chris@102: { Chris@102: inline literal_string Chris@102: string(char const* s) Chris@102: { Chris@102: return literal_string(s); Chris@102: } Chris@102: } Chris@102: using standard::string; Chris@102: Chris@102: namespace extension Chris@102: { Chris@102: template Chris@102: struct as_parser Chris@102: { Chris@102: typedef Chris@102: literal_string< Chris@102: char const*, char_encoding::standard, unused_type> Chris@102: type; Chris@102: Chris@102: typedef type value_type; Chris@102: Chris@102: static type call(char const* s) Chris@102: { Chris@102: return type(s); Chris@102: } Chris@102: }; Chris@102: Chris@102: template Chris@102: struct as_parser : as_parser {}; Chris@102: Chris@102: template Chris@102: struct as_parser Chris@102: { Chris@102: typedef Chris@102: literal_string< Chris@102: wchar_t const*, char_encoding::standard_wide, unused_type> Chris@102: type; Chris@102: Chris@102: typedef type value_type; Chris@102: Chris@102: static type call(wchar_t const* s) Chris@102: { Chris@102: return type(s); Chris@102: } Chris@102: }; Chris@102: Chris@102: template Chris@102: struct as_parser : as_parser {}; Chris@102: } Chris@102: Chris@102: using standard::string; Chris@102: Chris@102: inline literal_string Chris@102: lit(char const* s) Chris@102: { Chris@102: return literal_string(s); Chris@102: } Chris@102: Chris@102: template Chris@102: struct get_info> Chris@102: { Chris@102: typedef std::string result_type; Chris@102: std::string operator()(literal_string const& p) const Chris@102: { Chris@102: return '"' + to_utf8(p.str) + '"'; Chris@102: } Chris@102: }; Chris@102: }}} Chris@102: Chris@102: #endif