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_PREFIX_IPP
11 #define BOOST_BEAST_IMPL_BUFFERS_PREFIX_IPP
17 #include <type_traits>
26 boost::asio::const_buffer
27 buffers_prefix(std::size_t size,
28 boost::asio::const_buffer buffer)
30 return {buffer.data(),
31 (std::min)(size, buffer.size())};
35 boost::asio::mutable_buffer
36 buffers_prefix(std::size_t size,
37 boost::asio::mutable_buffer buffer)
39 return {buffer.data(),
40 (std::min)(size, buffer.size())};
45 template<class BufferSequence>
46 class buffers_prefix_view<BufferSequence>::const_iterator
48 friend class buffers_prefix_view<BufferSequence>;
50 buffers_prefix_view const* b_ = nullptr;
55 using value_type = typename std::conditional<
56 std::is_convertible<typename
57 std::iterator_traits<iter_type>::value_type,
58 boost::asio::mutable_buffer>::value,
59 boost::asio::mutable_buffer,
60 boost::asio::const_buffer>::type;
61 using pointer = value_type const*;
62 using reference = value_type;
63 using difference_type = std::ptrdiff_t;
64 using iterator_category =
65 std::bidirectional_iterator_tag;
67 const_iterator() = default;
68 const_iterator(const_iterator&& other) = default;
69 const_iterator(const_iterator const& other) = default;
70 const_iterator& operator=(const_iterator&& other) = default;
71 const_iterator& operator=(const_iterator const& other) = default;
74 operator==(const_iterator const& other) const
76 return b_ == other.b_ && it_ == other.it_;
80 operator!=(const_iterator const& other) const
82 return !(*this == other);
88 return detail::buffers_prefix(remain_, *it_);
92 operator->() const = delete;
97 remain_ -= boost::asio::buffer_size(*it_++);
105 remain_ -= boost::asio::buffer_size(*it_++);
112 remain_ += boost::asio::buffer_size(*--it_);
120 remain_ += boost::asio::buffer_size(*--it_);
125 const_iterator(buffers_prefix_view const& b,
133 const_iterator(buffers_prefix_view const& b,
137 , it_(boost::asio::buffer_sequence_begin(b_->bs_))
142 template<class BufferSequence>
144 buffers_prefix_view<BufferSequence>::
145 setup(std::size_t size)
148 end_ = boost::asio::buffer_sequence_begin(bs_);
149 auto const last = bs_.end();
153 boost::asio::buffer_size(*end_++);
164 template<class BufferSequence>
165 buffers_prefix_view<BufferSequence>::
166 buffers_prefix_view(buffers_prefix_view&& other)
167 : buffers_prefix_view(std::move(other),
168 std::distance<iter_type>(
169 boost::asio::buffer_sequence_begin(other.bs_),
174 template<class BufferSequence>
175 buffers_prefix_view<BufferSequence>::
176 buffers_prefix_view(buffers_prefix_view const& other)
177 : buffers_prefix_view(other,
178 std::distance<iter_type>(
179 boost::asio::buffer_sequence_begin(other.bs_),
184 template<class BufferSequence>
186 buffers_prefix_view<BufferSequence>::
187 operator=(buffers_prefix_view&& other) ->
190 auto const dist = std::distance<iter_type>(
191 boost::asio::buffer_sequence_begin(other.bs_),
193 bs_ = std::move(other.bs_);
196 boost::asio::buffer_sequence_begin(bs_),
201 template<class BufferSequence>
203 buffers_prefix_view<BufferSequence>::
204 operator=(buffers_prefix_view const& other) ->
207 auto const dist = std::distance<iter_type>(
208 boost::asio::buffer_sequence_begin(other.bs_),
213 boost::asio::buffer_sequence_begin(bs_),
218 template<class BufferSequence>
219 buffers_prefix_view<BufferSequence>::
220 buffers_prefix_view(std::size_t size,
221 BufferSequence const& bs)
227 template<class BufferSequence>
228 template<class... Args>
229 buffers_prefix_view<BufferSequence>::
230 buffers_prefix_view(std::size_t size,
231 boost::in_place_init_t, Args&&... args)
232 : bs_(std::forward<Args>(args)...)
237 template<class BufferSequence>
240 buffers_prefix_view<BufferSequence>::begin() const ->
243 return const_iterator{*this, std::false_type{}};
246 template<class BufferSequence>
249 buffers_prefix_view<BufferSequence>::end() const ->
252 return const_iterator{*this, std::true_type{}};