Line data Source code
1 : //
2 : // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3 : //
4 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 : //
7 : // Official repository: https://github.com/boostorg/url
8 : //
9 :
10 : #ifndef BOOST_URL_GRAMMAR_PARSE_HPP
11 : #define BOOST_URL_GRAMMAR_PARSE_HPP
12 :
13 : #include <boost/url/detail/config.hpp>
14 : #include <boost/url/error_types.hpp>
15 : #include <boost/core/detail/string_view.hpp>
16 : #include <boost/url/grammar/type_traits.hpp>
17 :
18 : namespace boost {
19 : namespace urls {
20 : namespace grammar {
21 :
22 : //------------------------------------------------
23 :
24 : /** Parse a character buffer using a rule
25 :
26 : @param it A pointer to the start. The
27 : caller's variable is changed to
28 : reflect the amount of input consumed.
29 :
30 : @param end A pointer to the end.
31 :
32 : @param r The rule to use
33 :
34 : @return The parsed value upon success,
35 : otherwise an error.
36 :
37 : @see
38 : @ref result.
39 : */
40 : template<class Rule>
41 : system::result<typename Rule::value_type>
42 : parse(
43 : char const*& it,
44 : char const* end,
45 : Rule const& r);
46 :
47 : /** Parse a character buffer using a rule
48 :
49 : This function parses a complete string into
50 : the specified sequence of rules. If the
51 : string is not completely consumed, an
52 : error is returned instead.
53 :
54 : @param s The input string
55 :
56 : @param r The rule to use
57 :
58 : @return The parsed value upon success,
59 : otherwise an error.
60 :
61 : @see
62 : @ref result.
63 : */
64 : template<class Rule>
65 : system::result<typename Rule::value_type>
66 : parse(
67 : core::string_view s,
68 : Rule const& r);
69 :
70 : //------------------------------------------------
71 :
72 : #ifndef BOOST_URL_DOCS
73 : namespace detail {
74 :
75 : template<class Rule>
76 : struct rule_ref
77 : {
78 : Rule const& r_;
79 :
80 : using value_type =
81 : typename Rule::value_type;
82 :
83 : system::result<value_type>
84 1 : parse(
85 : char const*& it,
86 : char const* end) const
87 : {
88 1 : return r_.parse(it, end);
89 : }
90 : };
91 :
92 : } // detail
93 : #endif
94 :
95 : /** Return a reference to a rule
96 :
97 : This function returns a rule which
98 : references the specified object. This is
99 : used to reduce the number of bytes of
100 : storage (`sizeof`) required by a combinator
101 : when it stores a copy of the object.
102 : <br>
103 : Ownership of the object is not transferred;
104 : the caller is responsible for ensuring the
105 : lifetime of the object is extended until it
106 : is no longer referenced. For best results,
107 : `ref` should only be used with compile-time
108 : constants.
109 :
110 : @param r The rule to use
111 : */
112 : template<class Rule>
113 : constexpr
114 : #ifdef BOOST_URL_DOCS
115 : __implementation_defined__
116 : #else
117 : typename std::enable_if<
118 : is_rule<Rule>::value &&
119 : ! std::is_same<Rule,
120 : detail::rule_ref<Rule> >::value,
121 : detail::rule_ref<Rule> >::type
122 : #endif
123 1 : ref(Rule const& r) noexcept
124 : {
125 : return detail::rule_ref<
126 1 : Rule>{r};
127 : }
128 :
129 : #ifndef BOOST_URL_DOCS
130 : // If you get a compile error here it
131 : // means you called ref with something
132 : // that is not a CharSet or Rule!
133 : constexpr
134 : void
135 : ref(...) = delete;
136 : #endif
137 :
138 : } // grammar
139 : } // urls
140 : } // boost
141 :
142 : #include <boost/url/grammar/impl/parse.hpp>
143 :
144 : #endif
|