Program Listing for File utility.hpp

Return to documentation for file (network/utility.hpp)

#ifndef FELIX_NETWORK_UTILITY_HPP
#define FELIX_NETWORK_UTILITY_HPP

#include <memory>

#include "bus.hpp"
#include "config.hpp"
#include "netio_buffered_publisher.hpp"
#include "netio_buffered_receiver.hpp"
#include "netio_unbuffered_receiver.hpp"
#include "netio_zerocopy_publisher.hpp"
#include "publisher.hpp"
#include "receiver.hpp"

namespace network::utility {
[[nodiscard]] inline std::unique_ptr<Publisher>
create_buffered_publisher(EventLoopType evloop_type, const std::string &ip,
                          uint32_t port, Bus &bus, unsigned int netio_pn,
                          unsigned int netio_ps, unsigned int netio_wm,
                          unsigned int netio_to, std::uint32_t max_chunk_size) {
  switch (evloop_type) {
  case EventLoopType::netio_next:
    return std::make_unique<NetioBufferedPublisher>(
        ip, port, bus, netio_pn, netio_ps, netio_wm, netio_to, max_chunk_size);
  case EventLoopType::netio3_native:
  case EventLoopType::netio3_asio:
    throw std::runtime_error("Netio3 not implemented");
  default:
    throw std::logic_error("Invalid EventLoopType");
  }
}

[[nodiscard]] inline std::unique_ptr<Publisher>
create_zero_copy_publisher(EventLoopType evloop_type, const std::string &ip,
                           uint32_t port, Bus &bus, unsigned int netio_pn,
                           unsigned int netio_ps, std::uint32_t max_chunk_size,
                           uint64_t dma_buffer_vaddr, size_t dma_size) {

  switch (evloop_type) {
  case EventLoopType::netio_next:
    return std::make_unique<NetioZerocopyPublisher>(ip, port, bus, netio_pn,
                                                    netio_ps, max_chunk_size,
                                                    dma_buffer_vaddr, dma_size);
  case EventLoopType::netio3_native:
  case EventLoopType::netio3_asio:
    throw std::runtime_error("Netio3 not implemented");
  default:
    throw std::logic_error("Invalid EventLoopType");
  }
}

[[nodiscard]] inline std::unique_ptr<Receiver>
create_buffered_receiver(EventLoopType evloop_type, const std::string &ip,
                         uint32_t port, Bus &bus, unsigned int netio_pn,
                         unsigned int netio_ps) {

  switch (evloop_type) {
  case EventLoopType::netio_next:
    return std::make_unique<NetioBufferedReceiver>(ip, port, bus, netio_pn,
                                                   netio_ps);
  case EventLoopType::netio3_native:
  case EventLoopType::netio3_asio:
    throw std::runtime_error("Netio3 not implemented");
  default:
    throw std::logic_error("Invalid EventLoopType");
  }
}

[[nodiscard]] inline std::unique_ptr<Receiver>
create_unbuffered_receiver(EventLoopType evloop_type, const std::string &ip,
                           uint32_t port, Bus &bus, unsigned int netio_pn,
                           unsigned int netio_ps) {

  switch (evloop_type) {
  case EventLoopType::netio_next:
    return std::make_unique<NetioUnbufferedReceiver>(ip, port, bus, netio_pn,
                                                     netio_ps);
  case EventLoopType::netio3_native:
  case EventLoopType::netio3_asio:
    throw std::runtime_error("Netio3 not implemented");
  default:
    throw std::logic_error("Invalid EventLoopType");
  }
}
} // namespace network::utility

#endif