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