2 // Copyright (c) 2016-2017 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_IPP
11 #define BOOST_BEAST_IMPL_BUFFERS_SUFFIX_IPP
13 #include <boost/beast/core/type_traits.hpp>
17 #include <type_traits>
23 template<class Buffers>
24 class buffers_suffix<Buffers>::const_iterator
26 friend class buffers_suffix<Buffers>;
28 using iter_type = typename
29 detail::buffer_sequence_iterator<Buffers>::type;
32 buffers_suffix const* b_ = nullptr;
35 using value_type = typename std::conditional<
36 std::is_convertible<typename
37 std::iterator_traits<iter_type>::value_type,
38 boost::asio::mutable_buffer>::value,
39 boost::asio::mutable_buffer,
40 boost::asio::const_buffer>::type;
41 using pointer = value_type const*;
42 using reference = value_type;
43 using difference_type = std::ptrdiff_t;
44 using iterator_category =
45 std::bidirectional_iterator_tag;
47 const_iterator() = default;
48 const_iterator(const_iterator&& other) = default;
49 const_iterator(const_iterator const& other) = default;
50 const_iterator& operator=(const_iterator&& other) = default;
51 const_iterator& operator=(const_iterator const& other) = default;
54 operator==(const_iterator const& other) const
56 return b_ == other.b_ && it_ == other.it_;
60 operator!=(const_iterator const& other) const
62 return !(*this == other);
68 return it_ == b_->begin_
69 ? value_type{*it_} + b_->skip_
74 operator->() const = delete;
107 const_iterator(buffers_suffix const& b,
115 //------------------------------------------------------------------------------
117 template<class Buffers>
118 buffers_suffix<Buffers>::
120 : begin_(boost::asio::buffer_sequence_begin(bs_))
124 template<class Buffers>
125 buffers_suffix<Buffers>::
126 buffers_suffix(buffers_suffix&& other)
127 : buffers_suffix(std::move(other),
128 std::distance<iter_type>(
129 boost::asio::buffer_sequence_begin(
130 other.bs_), other.begin_))
134 template<class Buffers>
135 buffers_suffix<Buffers>::
136 buffers_suffix(buffers_suffix const& other)
137 : buffers_suffix(other,
138 std::distance<iter_type>(
139 boost::asio::buffer_sequence_begin(
140 other.bs_), other.begin_))
144 template<class Buffers>
145 buffers_suffix<Buffers>::
146 buffers_suffix(Buffers const& bs)
148 , begin_(boost::asio::buffer_sequence_begin(bs_))
151 boost::asio::is_const_buffer_sequence<Buffers>::value||
152 boost::asio::is_mutable_buffer_sequence<Buffers>::value,
153 "BufferSequence requirements not met");
156 template<class Buffers>
157 template<class... Args>
158 buffers_suffix<Buffers>::
159 buffers_suffix(boost::in_place_init_t, Args&&... args)
160 : bs_(std::forward<Args>(args)...)
161 , begin_(boost::asio::buffer_sequence_begin(bs_))
163 static_assert(sizeof...(Args) > 0,
164 "Missing constructor arguments");
166 std::is_constructible<Buffers, Args...>::value,
167 "Buffers not constructible from arguments");
170 template<class Buffers>
172 buffers_suffix<Buffers>::
173 operator=(buffers_suffix&& other) ->
176 auto const dist = std::distance<iter_type>(
177 boost::asio::buffer_sequence_begin(other.bs_),
179 bs_ = std::move(other.bs_);
181 boost::asio::buffer_sequence_begin(bs_),
187 template<class Buffers>
189 buffers_suffix<Buffers>::
190 operator=(buffers_suffix const& other) ->
193 auto const dist = std::distance<iter_type>(
194 boost::asio::buffer_sequence_begin(other.bs_),
198 boost::asio::buffer_sequence_begin(bs_), dist);
203 template<class Buffers>
206 buffers_suffix<Buffers>::
210 return const_iterator{*this, begin_};
213 template<class Buffers>
216 buffers_suffix<Buffers>::
220 return const_iterator{*this,
221 boost::asio::buffer_sequence_end(bs_)};
224 template<class Buffers>
226 buffers_suffix<Buffers>::
227 consume(std::size_t amount)
229 using boost::asio::buffer_size;
231 boost::asio::buffer_sequence_end(bs_);
232 for(;amount > 0 && begin_ != end; ++begin_)
235 buffer_size(*begin_) - skip_;