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  
// Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
4  
//
4  
//
5  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
5  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
6  
// 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)
7  
//
7  
//
8  
// Official repository: https://github.com/boostorg/http_proto
8  
// Official repository: https://github.com/boostorg/http_proto
9  
//
9  
//
10  

10  

11  
#ifndef BOOST_URL_IMPL_GRAMMAR_TOKEN_RULE_HPP
11  
#ifndef BOOST_URL_IMPL_GRAMMAR_TOKEN_RULE_HPP
12  
#define BOOST_URL_IMPL_GRAMMAR_TOKEN_RULE_HPP
12  
#define BOOST_URL_IMPL_GRAMMAR_TOKEN_RULE_HPP
13  

13  

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

15  

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

19  

20  
template<class CharSet>
20  
template<class CharSet>
21  
BOOST_URL_CXX20_CONSTEXPR
21  
BOOST_URL_CXX20_CONSTEXPR
22  
auto
22  
auto
23  
implementation_defined::token_rule_t<CharSet>::
23  
implementation_defined::token_rule_t<CharSet>::
24  
parse(
24  
parse(
25  
    char const*& it,
25  
    char const*& it,
26  
    char const* end
26  
    char const* end
27  
        ) const noexcept ->
27  
        ) const noexcept ->
28  
    system::result<value_type>
28  
    system::result<value_type>
29  
{
29  
{
30  
    auto const it0 = it;
30  
    auto const it0 = it;
31  
    if(it == end)
31  
    if(it == end)
32  
    {
32  
    {
33  
        BOOST_URL_CONSTEXPR_RETURN_EC(
33  
        BOOST_URL_CONSTEXPR_RETURN_EC(
34  
            error::need_more);
34  
            error::need_more);
35  
    }
35  
    }
36  
    auto const& cs = this->get();
36  
    auto const& cs = this->get();
37  
    it = grammar::find_if_not(it, end, cs);
37  
    it = grammar::find_if_not(it, end, cs);
38  
    if(it != it0)
38  
    if(it != it0)
39  
        return core::string_view(it0, it - it0);
39  
        return core::string_view(it0, it - it0);
40  
    BOOST_URL_CONSTEXPR_RETURN_EC(
40  
    BOOST_URL_CONSTEXPR_RETURN_EC(
41  
        error::mismatch);
41  
        error::mismatch);
42  
}
42  
}
43  

43  

44  
} // grammar
44  
} // grammar
45  
} // urls
45  
} // urls
46  
} // boost
46  
} // boost
47  

47  

48  
#endif
48  
#endif