1  
//
1  
//
2  
// Copyright (c) 2021 Vinnie Falco (vinnie.falco@gmail.com)
2  
// Copyright (c) 2021 Vinnie Falco (vinnie.falco@gmail.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/cppalliance/http
7  
// Official repository: https://github.com/cppalliance/http
8  
//
8  
//
9  

9  

10  
#ifndef BOOST_HTTP_RFC_QUOTED_TOKEN_VIEW_HPP
10  
#ifndef BOOST_HTTP_RFC_QUOTED_TOKEN_VIEW_HPP
11  
#define BOOST_HTTP_RFC_QUOTED_TOKEN_VIEW_HPP
11  
#define BOOST_HTTP_RFC_QUOTED_TOKEN_VIEW_HPP
12  

12  

13  
#include <boost/http/detail/config.hpp>
13  
#include <boost/http/detail/config.hpp>
14  
#include <boost/url/grammar/string_view_base.hpp>
14  
#include <boost/url/grammar/string_view_base.hpp>
15  
#include <boost/core/detail/string_view.hpp>
15  
#include <boost/core/detail/string_view.hpp>
16  

16  

17  
namespace boost {
17  
namespace boost {
18  
namespace http {
18  
namespace http {
19  

19  

20  
namespace implementation_defined {
20  
namespace implementation_defined {
21  
struct quoted_token_rule_t;
21  
struct quoted_token_rule_t;
22  
} // implementation_defined
22  
} // implementation_defined
23  

23  

24  
/** A view into a quoted string token, which may
24  
/** A view into a quoted string token, which may
25  
    contain escape sequences.
25  
    contain escape sequences.
26  

26  

27  
    @see
27  
    @see
28  
        @ref quoted_token_view.
28  
        @ref quoted_token_view.
29  
*/
29  
*/
30  
class quoted_token_view final
30  
class quoted_token_view final
31  
    : public grammar::string_view_base
31  
    : public grammar::string_view_base
32  
{
32  
{
33  
    std::size_t n_ = 0;
33  
    std::size_t n_ = 0;
34  

34  

35  
    friend struct implementation_defined::quoted_token_rule_t;
35  
    friend struct implementation_defined::quoted_token_rule_t;
36  

36  

37  
    // unquoted
37  
    // unquoted
38  
    explicit
38  
    explicit
39  
    quoted_token_view(
39  
    quoted_token_view(
40  
        core::string_view s) noexcept
40  
        core::string_view s) noexcept
41  
        : string_view_base(s)
41  
        : string_view_base(s)
42  
        , n_(s.size())
42  
        , n_(s.size())
43  
    {
43  
    {
44  
    }
44  
    }
45  

45  

46  
    // maybe quoted
46  
    // maybe quoted
47  
    quoted_token_view(
47  
    quoted_token_view(
48  
        core::string_view s,
48  
        core::string_view s,
49  
        std::size_t n) noexcept
49  
        std::size_t n) noexcept
50  
        : string_view_base(s)
50  
        : string_view_base(s)
51  
        , n_(n)
51  
        , n_(n)
52  
    {
52  
    {
53  
        BOOST_ASSERT(s.size() >= 2);
53  
        BOOST_ASSERT(s.size() >= 2);
54  
        BOOST_ASSERT(s.front() == '\"');
54  
        BOOST_ASSERT(s.front() == '\"');
55  
        BOOST_ASSERT(s.back() == '\"');
55  
        BOOST_ASSERT(s.back() == '\"');
56  
        BOOST_ASSERT(n_ <= s_.size() - 2);
56  
        BOOST_ASSERT(n_ <= s_.size() - 2);
57  
    }
57  
    }
58  

58  

59  
public:
59  
public:
60  
    quoted_token_view() = default;
60  
    quoted_token_view() = default;
61  

61  

62  
    quoted_token_view(
62  
    quoted_token_view(
63  
        quoted_token_view const&) noexcept = default;
63  
        quoted_token_view const&) noexcept = default;
64  

64  

65  
    quoted_token_view& operator=(
65  
    quoted_token_view& operator=(
66  
        quoted_token_view const&) noexcept = default;
66  
        quoted_token_view const&) noexcept = default;
67  

67  

68  
    /** Return true if the token contains escape
68  
    /** Return true if the token contains escape
69  
        sequences.
69  
        sequences.
70  

70  

71  
        @par Complexity
71  
        @par Complexity
72  
        Constant.
72  
        Constant.
73  

73  

74  
        @Return true if the token contains
74  
        @Return true if the token contains
75  
        escape sequences.
75  
        escape sequences.
76  
    */
76  
    */
77  
    bool
77  
    bool
78  
    has_escapes() const noexcept
78  
    has_escapes() const noexcept
79  
    {
79  
    {
80  
        return n_ != s_.size();
80  
        return n_ != s_.size();
81  
    }
81  
    }
82  

82  

83  
    /** Return the size of the unescaped content.
83  
    /** Return the size of the unescaped content.
84  

84  

85  
        @par Complexity
85  
        @par Complexity
86  
        Constant.
86  
        Constant.
87  

87  

88  
         @return Size of the unescaped string content.
88  
         @return Size of the unescaped string content.
89  
    */
89  
    */
90  
    std::size_t
90  
    std::size_t
91  
    unescaped_size() const noexcept
91  
    unescaped_size() const noexcept
92  
    {
92  
    {
93  
        return n_;
93  
        return n_;
94  
    }
94  
    }
95  
};
95  
};
96  

96  

97  
} // http
97  
} // http
98  
} // boost
98  
} // boost
99  

99  

100  
#endif
100  
#endif