127 lines
2.8 KiB
C++
127 lines
2.8 KiB
C++
//
|
|
// detail/buffered_stream_storage.hpp
|
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
// Copyright (c) 2003-2021 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
|