diff options
Diffstat (limited to '3rdparty/asio/include/asio/detail/buffer_sequence_adapter.hpp')
-rw-r--r-- | 3rdparty/asio/include/asio/detail/buffer_sequence_adapter.hpp | 307 |
1 files changed, 300 insertions, 7 deletions
diff --git a/3rdparty/asio/include/asio/detail/buffer_sequence_adapter.hpp b/3rdparty/asio/include/asio/detail/buffer_sequence_adapter.hpp index f81e312a47c..8ea904e7023 100644 --- a/3rdparty/asio/include/asio/detail/buffer_sequence_adapter.hpp +++ b/3rdparty/asio/include/asio/detail/buffer_sequence_adapter.hpp @@ -2,7 +2,7 @@ // detail/buffer_sequence_adapter.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2024 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) @@ -19,6 +19,7 @@ #include "asio/buffer.hpp" #include "asio/detail/array_fwd.hpp" #include "asio/detail/socket_types.hpp" +#include "asio/registered_buffer.hpp" #include "asio/detail/push_options.hpp" @@ -104,6 +105,9 @@ class buffer_sequence_adapter : buffer_sequence_adapter_base { 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) { @@ -127,6 +131,11 @@ public: return total_buffer_size_; } + registered_buffer_id registered_id() const + { + return registered_buffer_id(); + } + bool all_empty() const { return total_buffer_size_ == 0; @@ -153,6 +162,16 @@ public: asio::buffer_sequence_end(buffer_sequence)); } + enum { linearisation_storage_size = 8192 }; + + static Buffer linearise(const Buffers& buffer_sequence, + const asio::mutable_buffer& storage) + { + return buffer_sequence_adapter::linearise( + asio::buffer_sequence_begin(buffer_sequence), + asio::buffer_sequence_end(buffer_sequence), storage); + } + private: template <typename Iterator> void init(Iterator begin, Iterator end) @@ -201,6 +220,30 @@ private: return Buffer(); } + template <typename Iterator> + static Buffer linearise(Iterator begin, Iterator end, + const asio::mutable_buffer& storage) + { + asio::mutable_buffer unused_storage = storage; + Iterator iter = begin; + while (iter != end && unused_storage.size() != 0) + { + Buffer buffer(*iter); + ++iter; + if (buffer.size() == 0) + continue; + if (unused_storage.size() == storage.size()) + { + if (iter == end) + return buffer; + if (buffer.size() >= unused_storage.size()) + return buffer; + } + unused_storage += asio::buffer_copy(unused_storage, buffer); + } + return Buffer(storage.data(), storage.size() - unused_storage.size()); + } + native_buffer_type buffers_[max_buffers]; std::size_t count_; std::size_t total_buffer_size_; @@ -211,6 +254,9 @@ class buffer_sequence_adapter<Buffer, asio::mutable_buffer> : buffer_sequence_adapter_base { public: + enum { is_single_buffer = true }; + enum { is_registered_buffer = false }; + explicit buffer_sequence_adapter( const asio::mutable_buffer& buffer_sequence) { @@ -233,6 +279,11 @@ public: return total_buffer_size_; } + registered_buffer_id registered_id() const + { + return registered_buffer_id(); + } + bool all_empty() const { return total_buffer_size_ == 0; @@ -253,6 +304,14 @@ public: return Buffer(buffer_sequence); } + enum { linearisation_storage_size = 1 }; + + static Buffer linearise(const asio::mutable_buffer& buffer_sequence, + const Buffer&) + { + return Buffer(buffer_sequence); + } + private: native_buffer_type buffer_; std::size_t total_buffer_size_; @@ -263,6 +322,9 @@ class buffer_sequence_adapter<Buffer, asio::const_buffer> : buffer_sequence_adapter_base { public: + enum { is_single_buffer = true }; + enum { is_registered_buffer = false }; + explicit buffer_sequence_adapter( const asio::const_buffer& buffer_sequence) { @@ -285,6 +347,11 @@ public: return total_buffer_size_; } + registered_buffer_id registered_id() const + { + return registered_buffer_id(); + } + bool all_empty() const { return total_buffer_size_ == 0; @@ -305,6 +372,14 @@ public: return Buffer(buffer_sequence); } + enum { linearisation_storage_size = 1 }; + + static Buffer linearise(const asio::const_buffer& buffer_sequence, + const Buffer&) + { + return Buffer(buffer_sequence); + } + private: native_buffer_type buffer_; std::size_t total_buffer_size_; @@ -317,6 +392,9 @@ class buffer_sequence_adapter<Buffer, asio::mutable_buffers_1> : buffer_sequence_adapter_base { public: + enum { is_single_buffer = true }; + enum { is_registered_buffer = false }; + explicit buffer_sequence_adapter( const asio::mutable_buffers_1& buffer_sequence) { @@ -339,6 +417,11 @@ public: return total_buffer_size_; } + registered_buffer_id registered_id() const + { + return registered_buffer_id(); + } + bool all_empty() const { return total_buffer_size_ == 0; @@ -359,6 +442,14 @@ public: return Buffer(buffer_sequence); } + enum { linearisation_storage_size = 1 }; + + static Buffer linearise(const asio::mutable_buffers_1& buffer_sequence, + const Buffer&) + { + return Buffer(buffer_sequence); + } + private: native_buffer_type buffer_; std::size_t total_buffer_size_; @@ -369,6 +460,9 @@ class buffer_sequence_adapter<Buffer, asio::const_buffers_1> : buffer_sequence_adapter_base { public: + enum { is_single_buffer = true }; + enum { is_registered_buffer = false }; + explicit buffer_sequence_adapter( const asio::const_buffers_1& buffer_sequence) { @@ -391,6 +485,11 @@ public: return total_buffer_size_; } + registered_buffer_id registered_id() const + { + return registered_buffer_id(); + } + bool all_empty() const { return total_buffer_size_ == 0; @@ -411,6 +510,14 @@ public: return Buffer(buffer_sequence); } + enum { linearisation_storage_size = 1 }; + + static Buffer linearise(const asio::const_buffers_1& buffer_sequence, + const Buffer&) + { + return Buffer(buffer_sequence); + } + private: native_buffer_type buffer_; std::size_t total_buffer_size_; @@ -418,11 +525,162 @@ private: #endif // !defined(ASIO_NO_DEPRECATED) +template <typename Buffer> +class buffer_sequence_adapter<Buffer, asio::mutable_registered_buffer> + : buffer_sequence_adapter_base +{ +public: + enum { is_single_buffer = true }; + enum { is_registered_buffer = true }; + + explicit buffer_sequence_adapter( + const 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 asio::mutable_registered_buffer& buffer_sequence) + { + return buffer_sequence.size() == 0; + } + + static void validate( + const asio::mutable_registered_buffer& buffer_sequence) + { + buffer_sequence.data(); + } + + static Buffer first( + const asio::mutable_registered_buffer& buffer_sequence) + { + return Buffer(buffer_sequence.buffer()); + } + + enum { linearisation_storage_size = 1 }; + + static Buffer linearise( + const 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, asio::const_registered_buffer> + : buffer_sequence_adapter_base +{ +public: + enum { is_single_buffer = true }; + enum { is_registered_buffer = true }; + + explicit buffer_sequence_adapter( + const 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 asio::const_registered_buffer& buffer_sequence) + { + return buffer_sequence.size() == 0; + } + + static void validate( + const asio::const_registered_buffer& buffer_sequence) + { + buffer_sequence.data(); + } + + static Buffer first( + const asio::const_registered_buffer& buffer_sequence) + { + return Buffer(buffer_sequence.buffer()); + } + + enum { linearisation_storage_size = 1 }; + + static Buffer linearise( + const 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> > +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) { @@ -446,6 +704,11 @@ public: return total_buffer_size_; } + registered_buffer_id registered_id() const + { + return registered_buffer_id(); + } + bool all_empty() const { return total_buffer_size_ == 0; @@ -468,18 +731,32 @@ public: ? buffer_sequence[0] : buffer_sequence[1]); } + enum { linearisation_storage_size = 8192 }; + + static Buffer linearise(const boost::array<Elem, 2>& buffer_sequence, + const asio::mutable_buffer& storage) + { + if (buffer_sequence[0].size() == 0) + return Buffer(buffer_sequence[1]); + if (buffer_sequence[1].size() == 0) + return Buffer(buffer_sequence[0]); + return Buffer(storage.data(), + asio::buffer_copy(storage, buffer_sequence)); + } + private: native_buffer_type buffers_[2]; std::size_t total_buffer_size_; }; -#if defined(ASIO_HAS_STD_ARRAY) - template <typename Buffer, typename Elem> -class buffer_sequence_adapter<Buffer, std::array<Elem, 2> > +class buffer_sequence_adapter<Buffer, std::array<Elem, 2>> : buffer_sequence_adapter_base { public: + enum { is_single_buffer = false }; + enum { is_registered_buffer = false }; + explicit buffer_sequence_adapter( const std::array<Elem, 2>& buffer_sequence) { @@ -503,6 +780,11 @@ public: return total_buffer_size_; } + registered_buffer_id registered_id() const + { + return registered_buffer_id(); + } + bool all_empty() const { return total_buffer_size_ == 0; @@ -525,13 +807,24 @@ public: ? buffer_sequence[0] : buffer_sequence[1]); } + enum { linearisation_storage_size = 8192 }; + + static Buffer linearise(const std::array<Elem, 2>& buffer_sequence, + const asio::mutable_buffer& storage) + { + if (buffer_sequence[0].size() == 0) + return Buffer(buffer_sequence[1]); + if (buffer_sequence[1].size() == 0) + return Buffer(buffer_sequence[0]); + return Buffer(storage.data(), + asio::buffer_copy(storage, buffer_sequence)); + } + private: native_buffer_type buffers_[2]; std::size_t total_buffer_size_; }; -#endif // defined(ASIO_HAS_STD_ARRAY) - } // namespace detail } // namespace asio |