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_LITERAL_RULE_HPP
11 : #define BOOST_URL_GRAMMAR_LITERAL_RULE_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 <cstdlib>
17 :
18 : namespace boost {
19 : namespace urls {
20 : namespace grammar {
21 :
22 : /** Match a string literal exactly
23 :
24 : If there is no more input, or if the
25 : end of the input is reached, and a prefix
26 : of the literal matches exactly, the error
27 : returned is @ref error::need_more.
28 :
29 : @par Value Type
30 : @code
31 : using value_type = core::string_view;
32 : @endcode
33 :
34 : @par Example
35 : Rules are used with the function @ref parse.
36 : @code
37 : system::result< core::string_view > rv = parse( "HTTP", literal_rule( "HTTP" ) );
38 : @endcode
39 :
40 : @see
41 : @ref delim_rule,
42 : @ref parse.
43 : */
44 : #ifdef BOOST_URL_DOCS
45 : constexpr
46 : __implementation_defined__
47 : literal_rule( char const* s );
48 : #else
49 : class literal_rule
50 : {
51 : char const* s_ = nullptr;
52 : std::size_t n_ = 0;
53 :
54 : constexpr
55 : static
56 : std::size_t
57 48 : len(char const* s) noexcept
58 : {
59 48 : return *s
60 48 : ? 1 + len(s + 1)
61 48 : : 0;
62 : }
63 :
64 : public:
65 : using value_type = core::string_view;
66 :
67 : constexpr
68 : explicit
69 10 : literal_rule(
70 : char const* s) noexcept
71 10 : : s_(s)
72 10 : , n_(len(s))
73 : {
74 10 : }
75 :
76 : BOOST_URL_DECL
77 : system::result<value_type>
78 : parse(
79 : char const*& it,
80 : char const* end) const noexcept;
81 : };
82 : #endif
83 :
84 : } // grammar
85 : } // urls
86 : } // boost
87 :
88 : #endif
|