Program Listing for File SendMessageUnbuffered.cpp

Return to documentation for file (BackendAsyncmsg/SendMessageUnbuffered.cpp)

#include "SendMessageUnbuffered.hpp"

#include <algorithm>

netio3::asyncmsg::SendMessageUnbuffered::SendMessageUnbuffered(
  const std::span<const std::uint8_t> data,
  const std::span<const std::uint8_t> header_data,
  const std::uint64_t key) :
  m_data{data}, m_header_data{header_data.begin(), header_data.end()}, m_key{key}
{}

netio3::asyncmsg::SendMessageUnbuffered::SendMessageUnbuffered(
  const std::span<const iovec> data,
  const std::span<const std::uint8_t> header_data,
  const std::uint64_t key) :
  m_data{[data]() {
    auto transformed = std::vector<std::span<const std::uint8_t>>{};
    std::ranges::transform(
      data,
      std::back_inserter(transformed),
      [](const auto& entry) -> decltype(transformed)::value_type {
        return {static_cast<const std::uint8_t*>(entry.iov_base), entry.iov_len};
      });
    return transformed;
  }()},
  m_header_data{header_data.begin(), header_data.end()},
  m_key{key}
{}

void netio3::asyncmsg::SendMessageUnbuffered::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);
  std::ranges::transform(m_data, std::back_inserter(buffers), [](const auto& entry) {
    return boost::asio::const_buffer(entry.data(), std::size(entry));
  });
}