Skip to content

Instantly share code, notes, and snippets.

@nlyan
Created May 19, 2023 07:58
Show Gist options
  • Save nlyan/26c135a26a0dedc2f20fee1d83d61291 to your computer and use it in GitHub Desktop.
Save nlyan/26c135a26a0dedc2f20fee1d83d61291 to your computer and use it in GitHub Desktop.
#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