Line data Source code
1 : // 2 : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) 3 : // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com) 4 : // 5 : // Distributed under the Boost Software License, Version 1.0. (See accompanying 6 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 : // 8 : // Official repository: https://github.com/boostorg/url 9 : // 10 : 11 : 12 : #include <boost/url/detail/config.hpp> 13 : #include <boost/url/decode_view.hpp> 14 : #include <boost/url/params_encoded_base.hpp> 15 : #include <boost/url/grammar/ci_string.hpp> 16 : #include <ostream> 17 : 18 : namespace boost { 19 : namespace urls { 20 : 21 277 : params_encoded_base:: 22 : iterator:: 23 : iterator( 24 277 : detail::query_ref const& ref) noexcept 25 277 : : it_(ref) 26 : { 27 277 : } 28 : 29 217 : params_encoded_base:: 30 : iterator:: 31 : iterator( 32 217 : detail::query_ref const& ref, int) noexcept 33 217 : : it_(ref, 0) 34 : { 35 217 : } 36 : 37 : //------------------------------------------------ 38 : // 39 : // params_encoded_base 40 : // 41 : //------------------------------------------------ 42 : 43 864 : params_encoded_base:: 44 : params_encoded_base( 45 864 : detail::query_ref const& ref) noexcept 46 864 : : ref_(ref) 47 : { 48 864 : } 49 : 50 : //------------------------------------------------ 51 : // 52 : // Observers 53 : // 54 : //------------------------------------------------ 55 : 56 : pct_string_view 57 441 : params_encoded_base:: 58 : buffer() const noexcept 59 : { 60 441 : return ref_.buffer(); 61 : } 62 : 63 : bool 64 5 : params_encoded_base:: 65 : empty() const noexcept 66 : { 67 5 : return ref_.nparam() == 0; 68 : } 69 : 70 : std::size_t 71 724 : params_encoded_base:: 72 : size() const noexcept 73 : { 74 724 : return ref_.nparam(); 75 : } 76 : 77 : auto 78 277 : params_encoded_base:: 79 : begin() const noexcept -> 80 : iterator 81 : { 82 277 : return { ref_ }; 83 : } 84 : 85 : auto 86 217 : params_encoded_base:: 87 : end() const noexcept -> 88 : iterator 89 : { 90 217 : return { ref_, 0 }; 91 : } 92 : 93 : //------------------------------------------------ 94 : 95 : std::size_t 96 29 : params_encoded_base:: 97 : count( 98 : pct_string_view key, 99 : ignore_case_param ic) const noexcept 100 : { 101 29 : std::size_t n = 0; 102 29 : auto it = find(key, ic); 103 29 : auto const end_ = end(); 104 57 : while(it != end_) 105 : { 106 28 : ++n; 107 28 : ++it; 108 28 : it = find(it, key, ic); 109 : } 110 29 : return n; 111 : } 112 : 113 : //------------------------------------------------ 114 : // 115 : // (implementation) 116 : // 117 : //------------------------------------------------ 118 : 119 : detail::params_iter_impl 120 98 : params_encoded_base:: 121 : find_impl( 122 : detail::params_iter_impl it, 123 : pct_string_view key, 124 : ignore_case_param ic) const noexcept 125 : { 126 98 : detail::params_iter_impl end_(ref_, 0); 127 98 : if(! ic) 128 : { 129 : for(;;) 130 : { 131 299 : if(it.equal(end_)) 132 31 : return it; 133 268 : if(*it.key() == *key) 134 30 : return it; 135 238 : it.increment(); 136 : } 137 : } 138 : for(;;) 139 : { 140 128 : if(it.equal(end_)) 141 10 : return it; 142 118 : if( grammar::ci_is_equal( 143 236 : *it.key(), *key)) 144 27 : return it; 145 91 : it.increment(); 146 : } 147 : } 148 : 149 : detail::params_iter_impl 150 13 : params_encoded_base:: 151 : find_last_impl( 152 : detail::params_iter_impl it, 153 : pct_string_view key, 154 : ignore_case_param ic) const noexcept 155 : { 156 13 : detail::params_iter_impl begin_(ref_); 157 13 : if(! ic) 158 : { 159 : for(;;) 160 : { 161 13 : if(it.equal(begin_)) 162 2 : return { ref_, 0 }; 163 11 : it.decrement(); 164 11 : if(*it.key() == *key) 165 5 : return it; 166 : } 167 : } 168 : for(;;) 169 : { 170 9 : if(it.equal(begin_)) 171 1 : return { ref_, 0 }; 172 8 : it.decrement(); 173 8 : if(grammar::ci_is_equal( 174 16 : *it.key(), *key)) 175 5 : return it; 176 : } 177 : } 178 : 179 : //------------------------------------------------ 180 : 181 : std::ostream& 182 1 : operator<<( 183 : std::ostream& os, 184 : params_encoded_base const& qp) 185 : { 186 1 : os << qp.buffer(); 187 1 : return os; 188 : } 189 : 190 : } // urls 191 : } // boost 192 :