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_SEGMENTS_BASE_HPP 12 : #define BOOST_URL_IMPL_SEGMENTS_BASE_HPP 13 : 14 : #include <boost/url/detail/segments_iter_impl.hpp> 15 : #include <boost/assert.hpp> 16 : #include <iterator> 17 : 18 : namespace boost { 19 : namespace urls { 20 : 21 : class segments_base::iterator 22 : { 23 : detail::segments_iter_impl it_; 24 : 25 : friend class segments_base; 26 : friend class segments_ref; 27 : 28 : iterator(detail::path_ref const&) noexcept; 29 : iterator(detail::path_ref const&, int) noexcept; 30 : 31 156 : iterator( 32 : detail::segments_iter_impl const& it) noexcept 33 156 : : it_(it) 34 : { 35 156 : } 36 : 37 : public: 38 : using value_type = segments_base::value_type; 39 : using reference = segments_base::reference; 40 : using pointer = reference; 41 : using difference_type = 42 : segments_base::difference_type; 43 : using iterator_category = 44 : std::bidirectional_iterator_tag; 45 : 46 : iterator() = default; 47 : iterator(iterator const&) = default; 48 : iterator& operator=( 49 : iterator const&) noexcept = default; 50 : 51 : BOOST_URL_DECL 52 : reference 53 : operator*() const; 54 : 55 : // the return value is too expensive 56 : pointer operator->() const = delete; 57 : 58 : iterator& 59 802 : operator++() noexcept 60 : { 61 802 : it_.increment(); 62 802 : return *this; 63 : } 64 : 65 : iterator& 66 69 : operator--() noexcept 67 : { 68 69 : it_.decrement(); 69 69 : return *this; 70 : } 71 : 72 : iterator 73 30 : operator++(int) noexcept 74 : { 75 30 : auto tmp = *this; 76 30 : ++*this; 77 30 : return tmp; 78 : } 79 : 80 : iterator 81 21 : operator--(int) noexcept 82 : { 83 21 : auto tmp = *this; 84 21 : --*this; 85 21 : return tmp; 86 : } 87 : 88 : bool 89 56 : operator==( 90 : iterator const& other) const noexcept 91 : { 92 56 : return it_.equal(other.it_); 93 : } 94 : 95 : bool 96 906 : operator!=( 97 : iterator const& other) const noexcept 98 : { 99 906 : return ! it_.equal(other.it_); 100 : } 101 : }; 102 : 103 : //------------------------------------------------ 104 : 105 : inline 106 : std::string 107 27 : segments_base:: 108 : front() const noexcept 109 : { 110 27 : BOOST_ASSERT(! empty()); 111 27 : return *begin(); 112 : } 113 : 114 : inline 115 : std::string 116 20 : segments_base:: 117 : back() const noexcept 118 : { 119 20 : BOOST_ASSERT(! empty()); 120 20 : return *--end(); 121 : } 122 : 123 : } // urls 124 : } // boost 125 : 126 : #endif