Chris@102
|
1 /*=============================================================================
|
Chris@102
|
2 Copyright (c) 2001-2014 Joel de Guzman
|
Chris@102
|
3
|
Chris@102
|
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@102
|
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@102
|
6 ==============================================================================*/
|
Chris@102
|
7 #if !defined(BOOST_SPIRIT_X3_LITERAL_STRING_APR_18_2006_1125PM)
|
Chris@102
|
8 #define BOOST_SPIRIT_X3_LITERAL_STRING_APR_18_2006_1125PM
|
Chris@102
|
9
|
Chris@102
|
10 #if defined(_MSC_VER)
|
Chris@102
|
11 #pragma once
|
Chris@102
|
12 #endif
|
Chris@102
|
13
|
Chris@102
|
14 #include <boost/spirit/home/x3/core/parser.hpp>
|
Chris@102
|
15 #include <boost/spirit/home/x3/core/skip_over.hpp>
|
Chris@102
|
16 #include <boost/spirit/home/x3/string/detail/string_parse.hpp>
|
Chris@102
|
17 #include <boost/spirit/home/x3/support/utility/utf8.hpp>
|
Chris@102
|
18 #include <boost/spirit/home/support/char_encoding/ascii.hpp>
|
Chris@102
|
19 #include <boost/spirit/home/support/char_encoding/standard.hpp>
|
Chris@102
|
20 #include <boost/spirit/home/support/char_encoding/standard_wide.hpp>
|
Chris@102
|
21
|
Chris@102
|
22 #include <boost/type_traits/is_same.hpp>
|
Chris@102
|
23 #include <boost/type_traits/add_reference.hpp>
|
Chris@102
|
24 #include <string>
|
Chris@102
|
25
|
Chris@102
|
26 namespace boost { namespace spirit { namespace x3
|
Chris@102
|
27 {
|
Chris@102
|
28 template <typename String, typename Encoding,
|
Chris@102
|
29 typename Attribute = std::basic_string<typename Encoding::char_type>>
|
Chris@102
|
30 struct literal_string : parser<literal_string<String, Encoding, Attribute>>
|
Chris@102
|
31 {
|
Chris@102
|
32 typedef typename Encoding::char_type char_type;
|
Chris@102
|
33 typedef Encoding encoding;
|
Chris@102
|
34 typedef Attribute attribute_type;
|
Chris@102
|
35 static bool const has_attribute =
|
Chris@102
|
36 !is_same<unused_type, attribute_type>::value;
|
Chris@102
|
37 static bool const handles_container = has_attribute;
|
Chris@102
|
38
|
Chris@102
|
39 literal_string(typename add_reference<String>::type str)
|
Chris@102
|
40 : str(str)
|
Chris@102
|
41 {}
|
Chris@102
|
42
|
Chris@102
|
43 template <typename Iterator, typename Context, typename Attribute_>
|
Chris@102
|
44 bool parse(Iterator& first, Iterator const& last
|
Chris@102
|
45 , Context const& context, unused_type, Attribute_& attr) const
|
Chris@102
|
46 {
|
Chris@102
|
47 x3::skip_over(first, last, context);
|
Chris@102
|
48 return detail::string_parse(str, first, last, attr);
|
Chris@102
|
49 }
|
Chris@102
|
50
|
Chris@102
|
51 String str;
|
Chris@102
|
52 };
|
Chris@102
|
53
|
Chris@102
|
54 namespace standard
|
Chris@102
|
55 {
|
Chris@102
|
56 inline literal_string<char const*, char_encoding::standard>
|
Chris@102
|
57 string(char const* s)
|
Chris@102
|
58 {
|
Chris@102
|
59 return literal_string<char const*, char_encoding::standard>(s);
|
Chris@102
|
60 }
|
Chris@102
|
61 }
|
Chris@102
|
62 using standard::string;
|
Chris@102
|
63
|
Chris@102
|
64 namespace extension
|
Chris@102
|
65 {
|
Chris@102
|
66 template <int N>
|
Chris@102
|
67 struct as_parser<char[N]>
|
Chris@102
|
68 {
|
Chris@102
|
69 typedef
|
Chris@102
|
70 literal_string<
|
Chris@102
|
71 char const*, char_encoding::standard, unused_type>
|
Chris@102
|
72 type;
|
Chris@102
|
73
|
Chris@102
|
74 typedef type value_type;
|
Chris@102
|
75
|
Chris@102
|
76 static type call(char const* s)
|
Chris@102
|
77 {
|
Chris@102
|
78 return type(s);
|
Chris@102
|
79 }
|
Chris@102
|
80 };
|
Chris@102
|
81
|
Chris@102
|
82 template <int N>
|
Chris@102
|
83 struct as_parser<char const[N]> : as_parser<char[N]> {};
|
Chris@102
|
84
|
Chris@102
|
85 template <int N>
|
Chris@102
|
86 struct as_parser<wchar_t[N]>
|
Chris@102
|
87 {
|
Chris@102
|
88 typedef
|
Chris@102
|
89 literal_string<
|
Chris@102
|
90 wchar_t const*, char_encoding::standard_wide, unused_type>
|
Chris@102
|
91 type;
|
Chris@102
|
92
|
Chris@102
|
93 typedef type value_type;
|
Chris@102
|
94
|
Chris@102
|
95 static type call(wchar_t const* s)
|
Chris@102
|
96 {
|
Chris@102
|
97 return type(s);
|
Chris@102
|
98 }
|
Chris@102
|
99 };
|
Chris@102
|
100
|
Chris@102
|
101 template <int N>
|
Chris@102
|
102 struct as_parser<wchar_t const[N]> : as_parser<wchar_t[N]> {};
|
Chris@102
|
103 }
|
Chris@102
|
104
|
Chris@102
|
105 using standard::string;
|
Chris@102
|
106
|
Chris@102
|
107 inline literal_string<char const*, char_encoding::standard, unused_type>
|
Chris@102
|
108 lit(char const* s)
|
Chris@102
|
109 {
|
Chris@102
|
110 return literal_string<char const*, char_encoding::standard, unused_type>(s);
|
Chris@102
|
111 }
|
Chris@102
|
112
|
Chris@102
|
113 template <typename String, typename Encoding, typename Attribute>
|
Chris@102
|
114 struct get_info<literal_string<String, Encoding, Attribute>>
|
Chris@102
|
115 {
|
Chris@102
|
116 typedef std::string result_type;
|
Chris@102
|
117 std::string operator()(literal_string<String, Encoding, Attribute> const& p) const
|
Chris@102
|
118 {
|
Chris@102
|
119 return '"' + to_utf8(p.str) + '"';
|
Chris@102
|
120 }
|
Chris@102
|
121 };
|
Chris@102
|
122 }}}
|
Chris@102
|
123
|
Chris@102
|
124 #endif
|