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)));
}