Line data Source code
1 : //
2 : // Copyright (c) 2022 Vinnie Falco (vinnie.falco@gmail.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_DETAIL_URL_IMPL_HPP
11 : #define BOOST_URL_DETAIL_URL_IMPL_HPP
12 :
13 : #include <boost/url/host_type.hpp>
14 : #include <boost/url/pct_string_view.hpp>
15 : #include <boost/url/scheme.hpp>
16 : #include <boost/core/detail/string_view.hpp>
17 : #include <boost/url/detail/parts_base.hpp>
18 : #include <boost/assert.hpp>
19 : #include <cstdint>
20 :
21 : namespace boost {
22 : namespace urls {
23 :
24 : class url_view;
25 : class authority_view;
26 :
27 : namespace detail {
28 :
29 : constexpr char const* const empty_c_str_ = "";
30 :
31 : // This is the private 'guts' of a
32 : // url_view, exposed so different parts
33 : // of the implementation can work on it.
34 : struct BOOST_URL_DECL url_impl : parts_base
35 : {
36 : static
37 : constexpr
38 : std::size_t const zero_ = 0;
39 :
40 : // never nullptr
41 : char const* cs_ = empty_c_str_;
42 :
43 : std::size_t offset_[id_end + 1] = {};
44 : std::size_t decoded_[id_end] = {};
45 : std::size_t nseg_ = 0;
46 : std::size_t nparam_ = 0;
47 : unsigned char ip_addr_[16] = {};
48 : // VFALCO don't we need a bool?
49 : std::uint16_t port_number_ = 0;
50 : host_type host_type_ =
51 : urls::host_type::none;
52 : scheme scheme_ =
53 : urls::scheme::none;
54 :
55 : from from_ = from::string;
56 :
57 16757 : url_impl(
58 : from b) noexcept
59 16757 : : from_(b)
60 : {
61 16757 : }
62 :
63 : // in url_view.ipp
64 : url_view construct() const noexcept;
65 :
66 : // in authority_view.ipp
67 : authority_view
68 : construct_authority() const noexcept;
69 :
70 : std::size_t len(int, int) const noexcept;
71 : std::size_t len(int) const noexcept;
72 : std::size_t offset(int) const noexcept;
73 : core::string_view get(int) const noexcept;
74 : core::string_view get(int, int) const noexcept;
75 : pct_string_view pct_get(int) const noexcept;
76 : pct_string_view pct_get(int, int) const noexcept;
77 : void set_size(int, std::size_t) noexcept;
78 : void split(int, std::size_t) noexcept;
79 : void adjust_right(int first, int last, std::size_t n) noexcept;
80 : void adjust_left(int first, int last, std::size_t n) noexcept;
81 : void collapse(int, int, std::size_t) noexcept;
82 :
83 : void apply_scheme(core::string_view) noexcept;
84 : void apply_userinfo(pct_string_view const&,
85 : pct_string_view const*) noexcept;
86 : void apply_host(host_type, pct_string_view,
87 : unsigned char const*) noexcept;
88 : void apply_port(core::string_view, unsigned short) noexcept;
89 : void apply_authority(authority_view const&) noexcept;
90 : void apply_path(pct_string_view, std::size_t) noexcept;
91 : void apply_query(pct_string_view, std::size_t) noexcept;
92 : void apply_frag(pct_string_view) noexcept;
93 : };
94 :
95 : //------------------------------------------------
96 :
97 : // this allows a path to come from a
98 : // url_impl or a separate core::string_view
99 : class path_ref
100 : : private parts_base
101 : {
102 : url_impl const* impl_ = nullptr;
103 : char const* data_ = nullptr;
104 : std::size_t size_ = 0;
105 : std::size_t nseg_ = 0;
106 : std::size_t dn_ = 0;
107 :
108 : public:
109 : path_ref() = default;
110 : path_ref(url_impl const& impl) noexcept;
111 : path_ref(core::string_view,
112 : std::size_t, std::size_t) noexcept;
113 : pct_string_view buffer() const noexcept;
114 : std::size_t size() const noexcept;
115 : char const* data() const noexcept;
116 : char const* end() const noexcept;
117 : std::size_t nseg() const noexcept;
118 :
119 : bool
120 1194 : alias_of(
121 : url_impl const& impl) const noexcept
122 : {
123 1194 : return impl_ == &impl;
124 : }
125 :
126 : bool
127 5082 : alias_of(
128 : path_ref const& ref) const noexcept
129 : {
130 5082 : if(impl_)
131 2463 : return impl_ == ref.impl_;
132 2619 : BOOST_ASSERT(data_ != ref.data_ || (
133 : size_ == ref.size_ &&
134 : nseg_ == ref.nseg_ &&
135 : dn_ == ref.dn_));
136 2619 : return data_ == ref.data_;
137 : }
138 : };
139 :
140 : //------------------------------------------------
141 :
142 : // this allows a params to come from a
143 : // url_impl or a separate core::string_view
144 : class BOOST_URL_DECL query_ref
145 : : private parts_base
146 : {
147 : url_impl const* impl_ = nullptr;
148 : char const* data_ = nullptr;
149 : std::size_t size_ = 0;
150 : std::size_t nparam_ = 0;
151 : std::size_t dn_ = 0;
152 : bool question_mark_ = false;
153 :
154 : public:
155 : query_ref(
156 : core::string_view s, // buffer, no '?'
157 : std::size_t dn, // decoded size
158 : std::size_t nparam
159 : ) noexcept;
160 9 : query_ref() = default;
161 : query_ref(url_impl const& impl) noexcept;
162 : pct_string_view buffer() const noexcept;
163 : std::size_t size() const noexcept; // with '?'
164 : char const* begin() const noexcept; // no '?'
165 : char const* end() const noexcept;
166 : std::size_t nparam() const noexcept;
167 :
168 : bool
169 276 : alias_of(
170 : url_impl const& impl) const noexcept
171 : {
172 276 : return impl_ == &impl;
173 : }
174 :
175 : bool
176 2449 : alias_of(
177 : query_ref const& ref) const noexcept
178 : {
179 2449 : if(impl_)
180 718 : return impl_ == ref.impl_;
181 1731 : BOOST_ASSERT(data_ != ref.data_ || (
182 : size_ == ref.size_ &&
183 : nparam_ == ref.nparam_ &&
184 : dn_ == ref.dn_));
185 1731 : return data_ == ref.data_;
186 : }
187 : };
188 :
189 : } // detail
190 :
191 : } // urls
192 : } // boost
193 :
194 : #endif
|