// detail/buffer_sequence_adapter.hpp
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
-// Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+// Copyright (c) 2003-2022 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)
#include <boost/asio/buffer.hpp>
#include <boost/asio/detail/array_fwd.hpp>
#include <boost/asio/detail/socket_types.hpp>
+#include <boost/asio/registered_buffer.hpp>
#include <boost/asio/detail/push_options.hpp>
{
public:
enum { is_single_buffer = false };
+ enum { is_registered_buffer = false };
explicit buffer_sequence_adapter(const Buffers& buffer_sequence)
: count_(0), total_buffer_size_(0)
return total_buffer_size_;
}
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
bool all_empty() const
{
return total_buffer_size_ == 0;
{
public:
enum { is_single_buffer = true };
+ enum { is_registered_buffer = false };
explicit buffer_sequence_adapter(
const boost::asio::mutable_buffer& buffer_sequence)
return total_buffer_size_;
}
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
bool all_empty() const
{
return total_buffer_size_ == 0;
{
public:
enum { is_single_buffer = true };
+ enum { is_registered_buffer = false };
explicit buffer_sequence_adapter(
const boost::asio::const_buffer& buffer_sequence)
return total_buffer_size_;
}
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
bool all_empty() const
{
return total_buffer_size_ == 0;
{
public:
enum { is_single_buffer = true };
+ enum { is_registered_buffer = false };
explicit buffer_sequence_adapter(
const boost::asio::mutable_buffers_1& buffer_sequence)
return total_buffer_size_;
}
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
bool all_empty() const
{
return total_buffer_size_ == 0;
{
public:
enum { is_single_buffer = true };
+ enum { is_registered_buffer = false };
explicit buffer_sequence_adapter(
const boost::asio::const_buffers_1& buffer_sequence)
return total_buffer_size_;
}
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
bool all_empty() const
{
return total_buffer_size_ == 0;
#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
+template <typename Buffer>
+class buffer_sequence_adapter<Buffer, boost::asio::mutable_registered_buffer>
+ : buffer_sequence_adapter_base
+{
+public:
+ enum { is_single_buffer = true };
+ enum { is_registered_buffer = true };
+
+ explicit buffer_sequence_adapter(
+ const boost::asio::mutable_registered_buffer& buffer_sequence)
+ {
+ init_native_buffer(buffer_, buffer_sequence.buffer());
+ total_buffer_size_ = buffer_sequence.size();
+ registered_id_ = buffer_sequence.id();
+ }
+
+ native_buffer_type* buffers()
+ {
+ return &buffer_;
+ }
+
+ std::size_t count() const
+ {
+ return 1;
+ }
+
+ std::size_t total_size() const
+ {
+ return total_buffer_size_;
+ }
+
+ registered_buffer_id registered_id() const
+ {
+ return registered_id_;
+ }
+
+ bool all_empty() const
+ {
+ return total_buffer_size_ == 0;
+ }
+
+ static bool all_empty(
+ const boost::asio::mutable_registered_buffer& buffer_sequence)
+ {
+ return buffer_sequence.size() == 0;
+ }
+
+ static void validate(
+ const boost::asio::mutable_registered_buffer& buffer_sequence)
+ {
+ buffer_sequence.data();
+ }
+
+ static Buffer first(
+ const boost::asio::mutable_registered_buffer& buffer_sequence)
+ {
+ return Buffer(buffer_sequence.buffer());
+ }
+
+ enum { linearisation_storage_size = 1 };
+
+ static Buffer linearise(
+ const boost::asio::mutable_registered_buffer& buffer_sequence,
+ const Buffer&)
+ {
+ return Buffer(buffer_sequence.buffer());
+ }
+
+private:
+ native_buffer_type buffer_;
+ std::size_t total_buffer_size_;
+ registered_buffer_id registered_id_;
+};
+
+template <typename Buffer>
+class buffer_sequence_adapter<Buffer, boost::asio::const_registered_buffer>
+ : buffer_sequence_adapter_base
+{
+public:
+ enum { is_single_buffer = true };
+ enum { is_registered_buffer = true };
+
+ explicit buffer_sequence_adapter(
+ const boost::asio::const_registered_buffer& buffer_sequence)
+ {
+ init_native_buffer(buffer_, buffer_sequence.buffer());
+ total_buffer_size_ = buffer_sequence.size();
+ registered_id_ = buffer_sequence.id();
+ }
+
+ native_buffer_type* buffers()
+ {
+ return &buffer_;
+ }
+
+ std::size_t count() const
+ {
+ return 1;
+ }
+
+ std::size_t total_size() const
+ {
+ return total_buffer_size_;
+ }
+
+ registered_buffer_id registered_id() const
+ {
+ return registered_id_;
+ }
+
+ bool all_empty() const
+ {
+ return total_buffer_size_ == 0;
+ }
+
+ static bool all_empty(
+ const boost::asio::const_registered_buffer& buffer_sequence)
+ {
+ return buffer_sequence.size() == 0;
+ }
+
+ static void validate(
+ const boost::asio::const_registered_buffer& buffer_sequence)
+ {
+ buffer_sequence.data();
+ }
+
+ static Buffer first(
+ const boost::asio::const_registered_buffer& buffer_sequence)
+ {
+ return Buffer(buffer_sequence.buffer());
+ }
+
+ enum { linearisation_storage_size = 1 };
+
+ static Buffer linearise(
+ const boost::asio::const_registered_buffer& buffer_sequence,
+ const Buffer&)
+ {
+ return Buffer(buffer_sequence.buffer());
+ }
+
+private:
+ native_buffer_type buffer_;
+ std::size_t total_buffer_size_;
+ registered_buffer_id registered_id_;
+};
+
template <typename Buffer, typename Elem>
class buffer_sequence_adapter<Buffer, boost::array<Elem, 2> >
: buffer_sequence_adapter_base
{
public:
enum { is_single_buffer = false };
+ enum { is_registered_buffer = false };
explicit buffer_sequence_adapter(
const boost::array<Elem, 2>& buffer_sequence)
return total_buffer_size_;
}
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
bool all_empty() const
{
return total_buffer_size_ == 0;
{
public:
enum { is_single_buffer = false };
+ enum { is_registered_buffer = false };
explicit buffer_sequence_adapter(
const std::array<Elem, 2>& buffer_sequence)
return total_buffer_size_;
}
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
bool all_empty() const
{
return total_buffer_size_ == 0;