src/decode_view.cpp

100.0% Lines (96/96) 100.0% Functions (10/10)
src/decode_view.cpp
Line TLA Hits Source Code
1 //
2 // Copyright (c) 2022 Alan de Freitas (alandefreitas@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
11 #include <boost/url/detail/config.hpp>
12 #include <boost/url/decode_view.hpp>
13 #include <boost/url/grammar/hexdig_chars.hpp>
14 #include <ostream>
15
16 namespace boost {
17 namespace urls {
18
19 //------------------------------------------------
20
21 auto
22 1181712 decode_view::
23 iterator::
24 operator*() const noexcept ->
25 reference
26 {
27 1181712 if (space_as_plus_ &&
28 73 *pos_ == '+')
29 8 return ' ';
30 1181704 if (*pos_ != '%')
31 958035 return *pos_;
32 223669 auto d0 = grammar::hexdig_value(pos_[1]);
33 223669 auto d1 = grammar::hexdig_value(pos_[2]);
34 return static_cast<char>(
35 223669 ((static_cast<
36 223669 unsigned char>(d0) << 4) +
37 223669 (static_cast<
38 223669 unsigned char>(d1))));
39 }
40
41 void
42 21 decode_view::
43 write(std::ostream& os) const
44 {
45 21 auto it = begin();
46 21 auto const end_ = end();
47 226 while(it != end_)
48 205 os.put(*it++);
49 21 }
50
51 void
52 4 decode_view::
53 remove_prefix( size_type n )
54 {
55 4 BOOST_ASSERT(n <= dn_);
56 4 auto it = begin();
57 4 auto n0 = n;
58 24 while (n)
59 {
60 20 ++it;
61 20 --n;
62 }
63 4 n_ -= (it.base() - begin().base());
64 4 dn_ -= n0;
65 4 p_ = it.base();
66 4 }
67
68 void
69 4 decode_view::
70 remove_suffix( size_type n )
71 {
72 4 BOOST_ASSERT(n <= dn_);
73 4 auto it = end();
74 4 auto n0 = n;
75 25 while (n)
76 {
77 21 --it;
78 21 --n;
79 }
80 4 n_ -= (end().base() - it.base());
81 4 dn_ -= n0;
82 4 }
83
84 bool
85 4 decode_view::
86 starts_with( core::string_view s ) const noexcept
87 {
88 4 if (s.size() > size())
89 1 return false;
90 3 auto it0 = begin();
91 3 auto it1 = s.begin();
92 3 std::size_t n = s.size();
93 19 while (n)
94 {
95 17 if (*it0 != *it1)
96 1 return false;
97 16 ++it0;
98 16 ++it1;
99 16 --n;
100 }
101 2 return true;
102 }
103
104 bool
105 6 decode_view::
106 ends_with( core::string_view s ) const noexcept
107 {
108 6 if (s.empty())
109 2 return true;
110 4 if (s.size() > size())
111 1 return false;
112 3 auto it0 = end();
113 3 auto it1 = s.end();
114 3 std::size_t n = s.size();
115 3 --it0;
116 3 --it1;
117 19 while (n - 1)
118 {
119 17 if (*it0 != *it1)
120 1 return false;
121 16 --it0;
122 16 --it1;
123 16 --n;
124 }
125 2 return *it0 == *it1;
126 }
127
128 bool
129 2 decode_view::
130 starts_with( char ch ) const noexcept
131 {
132 return
133 4 !empty() &&
134 4 front() == ch;
135 }
136
137 bool
138 2 decode_view::
139 ends_with( char ch ) const noexcept
140 {
141 return
142 4 !empty() &&
143 4 back() == ch;
144 }
145
146 decode_view::const_iterator
147 2 decode_view::
148 find( char ch ) const noexcept
149 {
150 2 auto it = begin();
151 2 auto end = this->end();
152 8 while (it != end)
153 {
154 7 if (*it == ch)
155 1 return it;
156 6 ++it;
157 }
158 1 return it;
159 }
160
161 decode_view::const_iterator
162 5 decode_view::
163 rfind( char ch ) const noexcept
164 {
165 5 if (empty())
166 1 return end();
167 4 auto it = end();
168 4 auto begin = this->begin();
169 4 --it;
170 27 while (it != begin)
171 {
172 25 if (*it == ch)
173 2 return it;
174 23 --it;
175 }
176 2 if (*it == ch)
177 1 return it;
178 1 return end();
179 }
180
181 } // urls
182 } // boost
183
184