]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/include/boost/asio/detail/buffered_stream_storage.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / asio / include / boost / asio / detail / buffered_stream_storage.hpp
1 //
2 // detail/buffered_stream_storage.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6 //
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)
9 //
10
11 #ifndef BOOST_ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP
12 #define BOOST_ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP
13
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
15 # pragma once
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17
18 #include <boost/asio/detail/config.hpp>
19 #include <boost/asio/buffer.hpp>
20 #include <boost/asio/detail/assert.hpp>
21 #include <cstddef>
22 #include <cstring>
23 #include <vector>
24
25 #include <boost/asio/detail/push_options.hpp>
26
27 namespace boost {
28 namespace asio {
29 namespace detail {
30
31 class buffered_stream_storage
32 {
33 public:
34 // The type of the bytes stored in the buffer.
35 typedef unsigned char byte_type;
36
37 // The type used for offsets into the buffer.
38 typedef std::size_t size_type;
39
40 // Constructor.
41 explicit buffered_stream_storage(std::size_t buffer_capacity)
42 : begin_offset_(0),
43 end_offset_(0),
44 buffer_(buffer_capacity)
45 {
46 }
47
48 /// Clear the buffer.
49 void clear()
50 {
51 begin_offset_ = 0;
52 end_offset_ = 0;
53 }
54
55 // Return a pointer to the beginning of the unread data.
56 mutable_buffer data()
57 {
58 return boost::asio::buffer(buffer_) + begin_offset_;
59 }
60
61 // Return a pointer to the beginning of the unread data.
62 const_buffer data() const
63 {
64 return boost::asio::buffer(buffer_) + begin_offset_;
65 }
66
67 // Is there no unread data in the buffer.
68 bool empty() const
69 {
70 return begin_offset_ == end_offset_;
71 }
72
73 // Return the amount of unread data the is in the buffer.
74 size_type size() const
75 {
76 return end_offset_ - begin_offset_;
77 }
78
79 // Resize the buffer to the specified length.
80 void resize(size_type length)
81 {
82 BOOST_ASIO_ASSERT(length <= capacity());
83 if (begin_offset_ + length <= capacity())
84 {
85 end_offset_ = begin_offset_ + length;
86 }
87 else
88 {
89 using namespace std; // For memmove.
90 memmove(&buffer_[0], &buffer_[0] + begin_offset_, size());
91 end_offset_ = length;
92 begin_offset_ = 0;
93 }
94 }
95
96 // Return the maximum size for data in the buffer.
97 size_type capacity() const
98 {
99 return buffer_.size();
100 }
101
102 // Consume multiple bytes from the beginning of the buffer.
103 void consume(size_type count)
104 {
105 BOOST_ASIO_ASSERT(begin_offset_ + count <= end_offset_);
106 begin_offset_ += count;
107 if (empty())
108 clear();
109 }
110
111 private:
112 // The offset to the beginning of the unread data.
113 size_type begin_offset_;
114
115 // The offset to the end of the unread data.
116 size_type end_offset_;
117
118 // The data in the buffer.
119 std::vector<byte_type> buffer_;
120 };
121
122 } // namespace detail
123 } // namespace asio
124 } // namespace boost
125
126 #include <boost/asio/detail/pop_options.hpp>
127
128 #endif // BOOST_ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP