params_base.hpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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. #ifndef BOOST_URL_IMPL_PARAMS_BASE_HPP
  11. #define BOOST_URL_IMPL_PARAMS_BASE_HPP
  12. #include <boost/url/detail/params_iter_impl.hpp>
  13. #include <iterator>
  14. namespace boost {
  15. namespace urls {
  16. //------------------------------------------------
  17. class params_base::iterator
  18. {
  19. detail::params_iter_impl it_;
  20. bool space_as_plus_ = true;
  21. friend class params_base;
  22. friend class params_ref;
  23. iterator(
  24. detail::query_ref const& ref,
  25. encoding_opts opt) noexcept;
  26. iterator(
  27. detail::query_ref const& impl,
  28. encoding_opts opt,
  29. int) noexcept;
  30. iterator(
  31. detail::params_iter_impl const& it,
  32. encoding_opts opt) noexcept
  33. : it_(it)
  34. , space_as_plus_(opt.space_as_plus)
  35. {
  36. }
  37. public:
  38. using value_type = params_base::value_type;
  39. using reference = params_base::reference;
  40. using pointer = reference;
  41. using difference_type =
  42. params_base::difference_type;
  43. using iterator_category =
  44. std::bidirectional_iterator_tag;
  45. iterator() = default;
  46. iterator(iterator const&) = default;
  47. iterator& operator=(
  48. iterator const&) noexcept = default;
  49. iterator&
  50. operator++() noexcept
  51. {
  52. it_.increment();
  53. return *this;
  54. }
  55. iterator
  56. operator++(int) noexcept
  57. {
  58. auto tmp = *this;
  59. ++*this;
  60. return tmp;
  61. }
  62. iterator&
  63. operator--() noexcept
  64. {
  65. it_.decrement();
  66. return *this;
  67. }
  68. iterator
  69. operator--(int) noexcept
  70. {
  71. auto tmp = *this;
  72. --*this;
  73. return tmp;
  74. }
  75. BOOST_URL_DECL
  76. reference
  77. operator*() const;
  78. // the return value is too expensive
  79. pointer operator->() const = delete;
  80. bool
  81. operator==(
  82. iterator const& other) const noexcept
  83. {
  84. return it_.equal(other.it_);
  85. }
  86. bool
  87. operator!=(
  88. iterator const& other) const noexcept
  89. {
  90. return ! it_.equal(other.it_);
  91. }
  92. };
  93. //------------------------------------------------
  94. inline
  95. params_base::
  96. params_base() noexcept
  97. // space_as_plus = true
  98. : opt_(true, false, false)
  99. {
  100. }
  101. inline
  102. bool
  103. params_base::
  104. contains(
  105. string_view key,
  106. ignore_case_param ic) const noexcept
  107. {
  108. return find(
  109. begin(),key, ic) != end();
  110. }
  111. inline
  112. auto
  113. params_base::
  114. find(
  115. string_view key,
  116. ignore_case_param ic) const noexcept ->
  117. iterator
  118. {
  119. return iterator(
  120. find_impl(
  121. begin().it_, key, ic),
  122. opt_);
  123. }
  124. inline
  125. auto
  126. params_base::
  127. find(
  128. iterator it,
  129. string_view key,
  130. ignore_case_param ic) const noexcept ->
  131. iterator
  132. {
  133. return iterator(
  134. find_impl(
  135. it.it_, key, ic),
  136. opt_);
  137. }
  138. inline
  139. auto
  140. params_base::
  141. find_last(
  142. string_view key,
  143. ignore_case_param ic) const noexcept ->
  144. iterator
  145. {
  146. return iterator(
  147. find_last_impl(
  148. end().it_, key, ic),
  149. opt_);
  150. }
  151. inline
  152. auto
  153. params_base::
  154. find_last(
  155. iterator it,
  156. string_view key,
  157. ignore_case_param ic) const noexcept ->
  158. iterator
  159. {
  160. return iterator(
  161. find_last_impl(
  162. it.it_, key, ic),
  163. opt_);
  164. }
  165. } // urls
  166. } // boost
  167. #endif