Created
May 19, 2023 07:58
-
-
Save nlyan/26c135a26a0dedc2f20fee1d83d61291 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <boost/asio/buffer.hpp> | |
#include <boost/container/deque.hpp> | |
#include <boost/iterator/iterator_adaptor.hpp> | |
#include <string> | |
struct strings_deque_buffer_reference | |
{ | |
std::string& str; | |
operator boost::asio::mutable_buffer() const noexcept { return boost::asio::buffer(str); } | |
operator boost::asio::const_buffer() const noexcept { return boost::asio::buffer(str); } | |
}; | |
template <typename BaseIterator, typename Buffer> | |
struct strings_buffer_sequence_iterator final: | |
boost::iterator_adaptor <strings_buffer_sequence_iterator<BaseIterator, Buffer>, | |
BaseIterator, | |
Buffer, | |
boost::use_default, | |
strings_deque_buffer_reference> | |
{ | |
strings_buffer_sequence_iterator (BaseIterator base) noexcept: | |
strings_buffer_sequence_iterator::iterator_adaptor_(std::move(base)) {} | |
strings_deque_buffer_reference dereference() const noexcept { return {*this->base_reference()}; } | |
}; | |
template <typename C> | |
struct mutable_buffer_sequence_of_strings | |
{ | |
using value_type = boost::asio::mutable_buffer; | |
using const_iterator = strings_buffer_sequence_iterator<typename C::iterator, | |
value_type>; | |
mutable_buffer_sequence_of_strings(C& c): c_(c) {} | |
auto begin() const noexcept { return const_iterator(c_.begin()); } | |
auto end() const noexcept { return const_iterator(c_.end()); } | |
C& c_; | |
}; | |
static_assert(boost::asio::is_mutable_buffer_sequence<mutable_buffer_sequence_of_strings | |
<boost::container::deque<std::string>>>::value); | |
#include <boost/asio/ip/tcp.hpp> | |
#include <boost/asio/read.hpp> | |
#include <iostream> | |
int | |
main() | |
{ | |
boost::container::deque<std::string> deque; | |
mutable_buffer_sequence_of_strings deque_buf_seq{deque}; | |
auto it = boost::asio::buffer_sequence_begin (deque_buf_seq); | |
auto end = boost::asio::buffer_sequence_end (deque_buf_seq); | |
while (it != end) | |
{ | |
++it; | |
--it; | |
++it; | |
boost::asio::mutable_buffer buf = *it; | |
} | |
boost::asio::io_context io_context; | |
boost::asio::ip::tcp::socket socket {io_context}; | |
boost::system::error_code ec; | |
deque.emplace_back().resize(100); | |
std::cout << boost::asio::read (socket, deque_buf_seq, ec) << "\n"; | |
std::cout << ec.message() << "\n"; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment