Program Listing for File SendMessageUnbufferedCopy.cpp
↰ Return to documentation for file (BackendAsyncmsg/SendMessageUnbufferedCopy.cpp
)
#include "SendMessageUnbufferedCopy.hpp"
#include <numeric>
netio3::asyncmsg::SendMessageUnbufferedCopy::SendMessageUnbufferedCopy(
const std::span<const std::uint8_t> data,
const std::span<const std::uint8_t> header_data,
const std::uint64_t key) :
m_data{std::vector<std::uint8_t>(data.begin(), data.end())},
m_header_data{header_data.begin(), header_data.end()},
m_key{key}
{}
netio3::asyncmsg::SendMessageUnbufferedCopy::SendMessageUnbufferedCopy(
const std::span<const iovec> data,
const std::span<const std::uint8_t> header_data,
const std::uint64_t key) :
m_data{[data]() {
size_t total_size =
std::accumulate(data.begin(), data.end(), 0ULL, [](size_t sum, const iovec& entry) {
return sum + entry.iov_len;
});
std::vector<std::uint8_t> result;
result.reserve(total_size);
for (const auto& entry : data) {
const auto* src = static_cast<const std::uint8_t*>(entry.iov_base);
result.insert(result.end(), src, src + entry.iov_len);
}
return result;
}()},
m_header_data{header_data.begin(), header_data.end()},
m_key{key}
{}
void netio3::asyncmsg::SendMessageUnbufferedCopy::toBuffers(
std::vector<boost::asio::const_buffer>& buffers) const
{
const boost::asio::const_buffer headerDataBuffer(m_header_data.data(), std::size(m_header_data));
buffers.push_back(headerDataBuffer);
buffers.push_back(boost::asio::const_buffer(m_data.data(), std::size(m_data)));
}