params_encoded_base.hpp 3.3 KB

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