123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- //
- // detail/buffered_stream_storage.hpp
- // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- // Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- //
- #ifndef ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP
- #define ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP
- #if defined(_MSC_VER) && (_MSC_VER >= 1200)
- # pragma once
- #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
- #include "asio/detail/config.hpp"
- #include "asio/buffer.hpp"
- #include "asio/detail/assert.hpp"
- #include <cstddef>
- #include <cstring>
- #include <vector>
- #include "asio/detail/push_options.hpp"
- namespace asio {
- namespace detail {
- class buffered_stream_storage
- {
- public:
- // The type of the bytes stored in the buffer.
- typedef unsigned char byte_type;
- // The type used for offsets into the buffer.
- typedef std::size_t size_type;
- // Constructor.
- explicit buffered_stream_storage(std::size_t buffer_capacity)
- : begin_offset_(0),
- end_offset_(0),
- buffer_(buffer_capacity)
- {
- }
- /// Clear the buffer.
- void clear()
- {
- begin_offset_ = 0;
- end_offset_ = 0;
- }
- // Return a pointer to the beginning of the unread data.
- mutable_buffer data()
- {
- return asio::buffer(buffer_) + begin_offset_;
- }
- // Return a pointer to the beginning of the unread data.
- const_buffer data() const
- {
- return asio::buffer(buffer_) + begin_offset_;
- }
- // Is there no unread data in the buffer.
- bool empty() const
- {
- return begin_offset_ == end_offset_;
- }
- // Return the amount of unread data the is in the buffer.
- size_type size() const
- {
- return end_offset_ - begin_offset_;
- }
- // Resize the buffer to the specified length.
- void resize(size_type length)
- {
- ASIO_ASSERT(length <= capacity());
- if (begin_offset_ + length <= capacity())
- {
- end_offset_ = begin_offset_ + length;
- }
- else
- {
- using namespace std; // For memmove.
- memmove(&buffer_[0], &buffer_[0] + begin_offset_, size());
- end_offset_ = length;
- begin_offset_ = 0;
- }
- }
- // Return the maximum size for data in the buffer.
- size_type capacity() const
- {
- return buffer_.size();
- }
- // Consume multiple bytes from the beginning of the buffer.
- void consume(size_type count)
- {
- ASIO_ASSERT(begin_offset_ + count <= end_offset_);
- begin_offset_ += count;
- if (empty())
- clear();
- }
- private:
- // The offset to the beginning of the unread data.
- size_type begin_offset_;
- // The offset to the end of the unread data.
- size_type end_offset_;
-
- // The data in the buffer.
- std::vector<byte_type> buffer_;
- };
- } // namespace detail
- } // namespace asio
- #include "asio/detail/pop_options.hpp"
- #endif // ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP
|