2 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // Official repository: https://github.com/boostorg/beast
10 #ifndef BOOST_BEAST_IMPL_BUFFERS_SUFFIX_HPP
11 #define BOOST_BEAST_IMPL_BUFFERS_SUFFIX_HPP
13 #include <boost/beast/core/buffer_traits.hpp>
14 #include <boost/beast/core/buffer_traits.hpp>
15 #include <boost/type_traits.hpp>
19 #include <type_traits>
25 template<class Buffers>
26 class buffers_suffix<Buffers>::const_iterator
28 friend class buffers_suffix<Buffers>;
30 using iter_type = buffers_iterator_type<Buffers>;
33 buffers_suffix const* b_ = nullptr;
36 #if BOOST_WORKAROUND(BOOST_MSVC, < 1910)
37 using value_type = typename std::conditional<
38 boost::is_convertible<typename
39 std::iterator_traits<iter_type>::value_type,
40 net::mutable_buffer>::value,
42 net::const_buffer>::type;
44 using value_type = buffers_type<Buffers>;
46 using pointer = value_type const*;
47 using reference = value_type;
48 using difference_type = std::ptrdiff_t;
49 using iterator_category =
50 std::bidirectional_iterator_tag;
52 const_iterator() = default;
54 const_iterator const& other) = default;
55 const_iterator& operator=(
56 const_iterator const& other) = default;
59 operator==(const_iterator const& other) const
61 return b_ == other.b_ && it_ == other.it_;
65 operator!=(const_iterator const& other) const
67 return !(*this == other);
74 return value_type(*it_) + b_->skip_;
75 return value_type(*it_);
79 operator->() const = delete;
113 buffers_suffix const& b,
121 //------------------------------------------------------------------------------
123 template<class Buffers>
124 buffers_suffix<Buffers>::
126 : begin_(net::buffer_sequence_begin(bs_))
130 template<class Buffers>
131 buffers_suffix<Buffers>::
132 buffers_suffix(buffers_suffix const& other)
133 : buffers_suffix(other,
134 std::distance<iter_type>(
135 net::buffer_sequence_begin(
136 other.bs_), other.begin_))
140 template<class Buffers>
141 buffers_suffix<Buffers>::
142 buffers_suffix(Buffers const& bs)
144 , begin_(net::buffer_sequence_begin(bs_))
147 net::is_const_buffer_sequence<Buffers>::value ||
148 net::is_mutable_buffer_sequence<Buffers>::value,
149 "BufferSequence type requirements not met");
152 template<class Buffers>
153 template<class... Args>
154 buffers_suffix<Buffers>::
155 buffers_suffix(boost::in_place_init_t, Args&&... args)
156 : bs_(std::forward<Args>(args)...)
157 , begin_(net::buffer_sequence_begin(bs_))
159 static_assert(sizeof...(Args) > 0,
160 "Missing constructor arguments");
162 std::is_constructible<Buffers, Args...>::value,
163 "Buffers not constructible from arguments");
166 template<class Buffers>
168 buffers_suffix<Buffers>::
169 operator=(buffers_suffix const& other) ->
172 auto const dist = std::distance<iter_type>(
173 net::buffer_sequence_begin(other.bs_),
177 net::buffer_sequence_begin(bs_), dist);
182 template<class Buffers>
184 buffers_suffix<Buffers>::
188 return const_iterator{*this, begin_};
191 template<class Buffers>
193 buffers_suffix<Buffers>::
197 return const_iterator{*this,
198 net::buffer_sequence_end(bs_)};
201 template<class Buffers>
203 buffers_suffix<Buffers>::
204 consume(std::size_t amount)
207 net::buffer_sequence_end(bs_);
208 for(;amount > 0 && begin_ != end; ++begin_)
211 buffer_bytes(*begin_) - skip_;