2
// const_buffers_iterator.hpp
3
// ~~~~~~~~~~~~~~~~~~~~~~~~~~
5
// Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
7
// Distributed under the Boost Software License, Version 1.0. (See accompanying
8
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
11
#ifndef ASIO_DETAIL_CONST_BUFFERS_ITERATOR_HPP
12
#define ASIO_DETAIL_CONST_BUFFERS_ITERATOR_HPP
14
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
16
#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
18
#include "asio/detail/push_options.hpp"
20
#include "asio/detail/push_options.hpp"
22
#include <boost/config.hpp>
23
#include <boost/iterator/iterator_facade.hpp>
24
#include "asio/detail/pop_options.hpp"
26
#include "asio/buffer.hpp"
31
// A proxy iterator for a sub-range in a list of buffers.
32
template <typename ConstBufferSequence>
33
class const_buffers_iterator
34
: public boost::iterator_facade<const_buffers_iterator<ConstBufferSequence>,
35
const char, boost::bidirectional_traversal_tag>
38
// Default constructor creates an iterator in an undefined state.
39
const_buffers_iterator()
43
// Create an iterator for the specified position.
44
const_buffers_iterator(const ConstBufferSequence& buffers,
46
: begin_(buffers.begin()),
47
current_(buffers.begin()),
51
while (current_ != end_)
53
current_buffer_ = *current_;
54
std::size_t buffer_size = asio::buffer_size(current_buffer_);
55
if (position - position_ < buffer_size)
57
current_buffer_position_ = position - position_;
61
position_ += buffer_size;
64
current_buffer_ = asio::const_buffer();
65
current_buffer_position_ = 0;
68
std::size_t position() const
74
friend class boost::iterator_core_access;
83
++current_buffer_position_;
84
if (current_buffer_position_ != asio::buffer_size(current_buffer_))
88
current_buffer_position_ = 0;
89
while (current_ != end_)
91
current_buffer_ = *current_;
92
if (asio::buffer_size(current_buffer_) > 0)
105
if (current_buffer_position_ != 0)
107
--current_buffer_position_;
111
typename ConstBufferSequence::const_iterator iter = current_;
112
while (iter != begin_)
115
asio::const_buffer buffer = *iter;
116
std::size_t buffer_size = asio::buffer_size(buffer);
120
current_buffer_ = buffer;
121
current_buffer_position_ = buffer_size - 1;
127
bool equal(const const_buffers_iterator& other) const
129
return position_ == other.position_;
132
const char& dereference() const
134
return asio::buffer_cast<const char*>(
135
current_buffer_)[current_buffer_position_];
138
asio::const_buffer current_buffer_;
139
std::size_t current_buffer_position_;
140
typename ConstBufferSequence::const_iterator begin_;
141
typename ConstBufferSequence::const_iterator current_;
142
typename ConstBufferSequence::const_iterator end_;
143
std::size_t position_;
146
} // namespace detail
149
#include "asio/detail/pop_options.hpp"
151
#endif // ASIO_DETAIL_CONST_BUFFERS_ITERATOR_HPP