1#include "packet_variant.hpp"
2#include <boost/variant.hpp>
9 return create_byte_view(packet[layer]);
14 CohesivePacket::buffer_const_range range = packet[layer];
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));
31 ByteBuffer::const_iterator from_begin = packet[from].begin();
32 ByteBuffer::const_iterator to_end = packet[to].end();
40 for (
auto layer : osi_layers) {
42 packet[layer].convert(buf);
43 oa.save_binary(buf.data(), buf.size());
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) {}
65 std::size_t operator()(
const CohesivePacket& packet)
67 return size(packet, m_layer);
70 std::size_t operator()(
const ChunkPacket& packet)
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) {}
88 std::size_t operator()(
const CohesivePacket& packet)
90 return size(packet, m_from, m_to);
93 std::size_t operator()(
const ChunkPacket& packet)
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>
110 std::size_t operator()(
const CohesivePacket& packet)
112 return packet.
size();
115 std::size_t operator()(
const ChunkPacket& packet)
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) {}
131 byte_view_range operator()(
const CohesivePacket& packet)
133 return create_byte_view(packet, m_layer);
136 byte_view_range operator()(
const ChunkPacket& packet)
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) {}
154 byte_view_range operator()(
const CohesivePacket& packet)
156 return create_byte_view(packet, m_from, m_to);
159 byte_view_range operator()(
const ChunkPacket& packet)
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<>
176 serialize_visitor(OutputArchive& _oa) : oa(_oa) {}
178 void operator()(
const ChunkPacket& packet)
180 serialize(oa, packet);
183 void operator()(
const CohesivePacket& 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.