GCC Code Coverage Report


Directory: libs/url/
File: boost/url/impl/decode_view.hpp
Date: 2024-08-19 20:08:56
Exec Total Coverage
Lines: 44 44 100.0%
Functions: 13 13 100.0%
Branches: 10 14 71.4%

Line Branch Exec Source
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 #ifndef BOOST_URL_IMPL_PCT_ENCODED_VIEW_HPP
11 #define BOOST_URL_IMPL_PCT_ENCODED_VIEW_HPP
12
13 #include <boost/url/grammar/type_traits.hpp>
14 #include <boost/static_assert.hpp>
15
16 namespace boost {
17 namespace urls {
18
19 class decode_view::iterator
20 {
21 char const* begin_ = nullptr;
22 char const* pos_ = nullptr;
23 bool space_as_plus_ = true;
24
25 friend decode_view;
26
27 6356 iterator(
28 char const* str,
29 bool space_as_plus) noexcept
30 6356 : begin_(str)
31 6356 , pos_(str)
32 6356 , space_as_plus_(
33 space_as_plus)
34 {
35 6356 }
36
37 // end ctor
38 885 iterator(
39 char const* str,
40 size_type n,
41 bool space_as_plus) noexcept
42 885 : begin_(str)
43 885 , pos_(str + n)
44 885 , space_as_plus_(space_as_plus)
45 {
46 885 }
47
48 public:
49 using value_type = char;
50 using reference = char;
51 using pointer = void const*;
52 using const_reference = char;
53 using size_type = std::size_t;
54 using difference_type = std::ptrdiff_t;
55 using iterator_category =
56 std::bidirectional_iterator_tag;
57
58 2 iterator() = default;
59
60 iterator(iterator const&) = default;
61
62 iterator&
63 operator=(iterator const&) = default;
64
65 BOOST_URL_DECL
66 reference
67 operator*() const noexcept;
68
69 iterator&
70 4835 operator++() noexcept
71 {
72
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4835 times.
4835 BOOST_ASSERT(pos_ != nullptr);
73
2/2
✓ Branch 0 taken 4538 times.
✓ Branch 1 taken 297 times.
4835 if (*pos_ != '%')
74 4538 ++pos_;
75 else
76 297 pos_ += 3;
77 4835 return *this;
78 }
79
80 iterator&
81 1182 operator--() noexcept
82 {
83
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1182 times.
1182 BOOST_ASSERT(pos_ != begin_);
84
2/2
✓ Branch 0 taken 679 times.
✓ Branch 1 taken 503 times.
1182 if (pos_ - begin_ < 3 ||
85
2/2
✓ Branch 0 taken 627 times.
✓ Branch 1 taken 52 times.
679 pos_[-3] != '%')
86 1130 --pos_;
87 else
88 52 pos_ -= 3;
89 1182 return *this;
90 }
91
92 iterator
93 4668 operator++(int) noexcept
94 {
95 4668 auto tmp = *this;
96 4668 ++*this;
97 4668 return tmp;
98 }
99
100 iterator
101 operator--(int) noexcept
102 {
103 auto tmp = *this;
104 --*this;
105 return tmp;
106 }
107
108 char const*
109 7 base()
110 {
111 7 return pos_;
112 }
113
114 bool
115 2992 operator==(
116 iterator const& other) const noexcept
117 {
118 2992 return pos_ == other.pos_;
119 }
120
121 bool
122 1962 operator!=(
123 iterator const& other) const noexcept
124 {
125 1962 return !(*this == other);
126 }
127 };
128
129 //------------------------------------------------
130
131 inline
132 auto
133 6356 decode_view::
134 begin() const noexcept ->
135 const_iterator
136 {
137 6356 return {p_, space_as_plus_};
138 }
139
140 inline
141 auto
142 885 decode_view::
143 end() const noexcept ->
144 const_iterator
145 {
146 885 return {p_, n_, space_as_plus_};
147 }
148
149 inline
150 auto
151 3 decode_view::
152 front() const noexcept ->
153 const_reference
154 {
155
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 BOOST_ASSERT( !empty() );
156 3 return *begin();
157 }
158
159 inline
160 auto
161 3 decode_view::
162 back() const noexcept ->
163 const_reference
164 {
165
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 BOOST_ASSERT( !empty() );
166 3 return *--end();
167 }
168
169 } // urls
170 } // boost
171
172 #endif
173