1#include "packet_variant.hpp"
2#include <boost/variant.hpp>
7byte_view_range create_byte_view(
const ChunkPacket& packet, OsiLayer layer)
9 return create_byte_view(packet[layer]);
12byte_view_range create_byte_view(
const CohesivePacket& packet, OsiLayer layer)
14 CohesivePacket::buffer_const_range range = packet[layer];
15 return byte_view_range { range.begin(), range.end() };
18byte_view_range create_byte_view(
const ChunkPacket& packet, OsiLayer from, OsiLayer to)
20 ByteBuffer buffer_range;
21 for (
auto layer : osi_layer_range(from, to)) {
22 ByteBuffer buffer_layer;
23 packet[layer].convert(buffer_layer);
24 buffer_range.insert(buffer_range.end(), buffer_layer.begin(), buffer_layer.end());
26 return create_byte_view(std::move(buffer_range));
29byte_view_range create_byte_view(
const CohesivePacket& packet, OsiLayer from, OsiLayer to)
31 ByteBuffer::const_iterator from_begin = packet[from].begin();
32 ByteBuffer::const_iterator to_end = packet[to].end();
33 return byte_view_range(from_begin, to_end);
37void serialize(OutputArchive& oa,
const ChunkPacket& packet)
40 for (
auto layer : osi_layers) {
42 packet[layer].convert(buf);
43 oa.save_binary(buf.data(), buf.size());
47void serialize(OutputArchive& oa,
const CohesivePacket& packet)
49 oa.save_binary(packet.buffer().data(), packet.buffer().size());
57using namespace vanetza;
59std::size_t size(
const PacketVariant& packet, OsiLayer layer)
61 struct size_visitor :
public boost::static_visitor<std::size_t>
63 size_visitor(OsiLayer layer) : m_layer(layer) {}
67 return size(packet, m_layer);
72 return size(packet, m_layer);
78 size_visitor visitor(layer);
79 return boost::apply_visitor(visitor, packet);
82std::size_t size(
const PacketVariant& packet, OsiLayer from, OsiLayer to)
84 struct size_visitor :
public boost::static_visitor<std::size_t>
86 size_visitor(OsiLayer from, OsiLayer to) : m_from(from), m_to(to) {}
90 return size(packet, m_from, m_to);
95 return size(packet, m_from, m_to);
102 size_visitor visitor(from, to);
103 return boost::apply_visitor(visitor, packet);
106std::size_t size(
const PacketVariant& packet)
108 struct size_visitor :
public boost::static_visitor<std::size_t>
112 return packet.
size();
117 return packet.
size();
121 size_visitor visitor;
122 return boost::apply_visitor(visitor, packet);
125byte_view_range create_byte_view(
const PacketVariant& packet, OsiLayer layer)
127 struct payload_visitor :
public boost::static_visitor<byte_view_range>
129 payload_visitor(OsiLayer layer) : m_layer(layer) {}
133 return create_byte_view(packet, m_layer);
138 return create_byte_view(packet, m_layer);
144 payload_visitor visitor(layer);
145 return boost::apply_visitor(visitor, packet);
148byte_view_range create_byte_view(
const PacketVariant& packet, OsiLayer from, OsiLayer to)
150 struct payload_visitor :
public boost::static_visitor<byte_view_range>
152 payload_visitor(OsiLayer from, OsiLayer to) : m_from(from), m_to(to) {}
156 return create_byte_view(packet, m_from, m_to);
161 return create_byte_view(packet, m_from, m_to);
168 payload_visitor visitor(from, to);
169 return boost::apply_visitor(visitor, packet);
172void serialize(
OutputArchive& ar,
const PacketVariant& packet)
174 struct serialize_visitor :
public boost::static_visitor<>
180 serialize(oa, packet);
185 serialize(oa, packet);
191 serialize_visitor visitor(ar);
192 boost::apply_visitor(visitor, packet);
ChunckPacket is a packet consisting of several memory chunks.