1  
//
1  
//
2  
// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
2  
// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
 
3 +
// Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
3  
//
4  
//
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
5  
// 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  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  
//
7  
//
7  
// Official repository: https://github.com/boostorg/url
8  
// Official repository: https://github.com/boostorg/url
8  
//
9  
//
9  

10  

10  
#ifndef BOOST_URL_GRAMMAR_IMPL_PARSE_HPP
11  
#ifndef BOOST_URL_GRAMMAR_IMPL_PARSE_HPP
11  
#define BOOST_URL_GRAMMAR_IMPL_PARSE_HPP
12  
#define BOOST_URL_GRAMMAR_IMPL_PARSE_HPP
12  

13  

13  
#include <boost/url/grammar/error.hpp>
14  
#include <boost/url/grammar/error.hpp>
14  
#include <boost/url/grammar/type_traits.hpp>
15  
#include <boost/url/grammar/type_traits.hpp>
15  

16  

16  
namespace boost {
17  
namespace boost {
17  
namespace urls {
18  
namespace urls {
18  
namespace grammar {
19  
namespace grammar {
19  

20  

20  
template<BOOST_URL_CONSTRAINT(Rule) R>
21  
template<BOOST_URL_CONSTRAINT(Rule) R>
21 -
BOOST_URL_NO_INLINE
22 +
BOOST_URL_CXX14_CONSTEXPR
22  
auto
23  
auto
23  
parse(
24  
parse(
24  
    char const*& it,
25  
    char const*& it,
25  
    char const* end,
26  
    char const* end,
26  
    R const& r) ->
27  
    R const& r) ->
27  
        system::result<typename R::value_type>
28  
        system::result<typename R::value_type>
28  
{
29  
{
29  
    // If this goes off, it means the rule
30  
    // If this goes off, it means the rule
30  
    // passed in did not meet the requirements.
31  
    // passed in did not meet the requirements.
31  
    // Please check the documentation.
32  
    // Please check the documentation.
32  
    static_assert(
33  
    static_assert(
33  
        is_rule<R>::value,
34  
        is_rule<R>::value,
34  
        "Rule requirements not met");
35  
        "Rule requirements not met");
35  

36  

36  
    return r.parse(it, end);
37  
    return r.parse(it, end);
37  
}
38  
}
38  

39  

39  
template<BOOST_URL_CONSTRAINT(Rule) R>
40  
template<BOOST_URL_CONSTRAINT(Rule) R>
40 -
BOOST_URL_NO_INLINE
41 +
BOOST_URL_CXX14_CONSTEXPR
41  
auto
42  
auto
42  
parse(
43  
parse(
43  
    core::string_view s,
44  
    core::string_view s,
44  
    R const& r) ->
45  
    R const& r) ->
45  
        system::result<typename R::value_type>
46  
        system::result<typename R::value_type>
46  
{
47  
{
47  
    // If this goes off, it means the rule
48  
    // If this goes off, it means the rule
48  
    // passed in did not meet the requirements.
49  
    // passed in did not meet the requirements.
49  
    // Please check the documentation.
50  
    // Please check the documentation.
50  
    static_assert(
51  
    static_assert(
51  
        is_rule<R>::value,
52  
        is_rule<R>::value,
52  
        "Rule requirements not met");
53  
        "Rule requirements not met");
53  

54  

54  
    auto it = s.data();
55  
    auto it = s.data();
55  
    auto const end = it + s.size();
56  
    auto const end = it + s.size();
56  
    auto rv = r.parse(it, end);
57  
    auto rv = r.parse(it, end);
57  
    if( rv &&
58  
    if( rv &&
58  
        it != end)
59  
        it != end)
59  
        return error::leftover;
60  
        return error::leftover;
60  
    return rv;
61  
    return rv;
61  
}
62  
}
62  

63  

63  
} // grammar
64  
} // grammar
64  
} // urls
65  
} // urls
65  
} // boost
66  
} // boost
66  

67  

67  
#endif
68  
#endif