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  
//
3  
//
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
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)
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  
//
6  
//
7  
// Official repository: https://github.com/boostorg/http_proto
7  
// Official repository: https://github.com/boostorg/http_proto
8  
//
8  
//
9  

9  

10  
#ifndef BOOST_URL_IMPL_GRAMMAR_TOKEN_RULE_HPP
10  
#ifndef BOOST_URL_IMPL_GRAMMAR_TOKEN_RULE_HPP
11  
#define BOOST_URL_IMPL_GRAMMAR_TOKEN_RULE_HPP
11  
#define BOOST_URL_IMPL_GRAMMAR_TOKEN_RULE_HPP
12  

12  

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

14  

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

18  

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

41  

42  
} // grammar
42  
} // grammar
43  
} // urls
43  
} // urls
44  
} // boost
44  
} // boost
45  

45  

46  
#endif
46  
#endif