27#include <wpi/util/struct/Struct.hpp>
39 typename SerdeType<typename std::remove_cvref_t<T>>;
43 SerdeType<typename std::remove_cvref_t<T>>::GetSchemaHash()
44 } -> std::convertible_to<std::string_view>;
47 SerdeType<typename std::remove_cvref_t<T>>::GetSchema()
48 } -> std::convertible_to<std::string_view>;
51 SerdeType<typename std::remove_cvref_t<T>>::Unpack(packet)
52 } -> std::same_as<typename std::remove_cvref_t<T>>;
55 SerdeType<typename std::remove_cvref_t<T>>::Pack(packet, value)
56 } -> std::same_as<void>;
67 explicit Packet(
int initialCapacity = 0) : packetData(initialCapacity) {}
73 explicit Packet(std::vector<uint8_t> data);
84 inline const std::vector<uint8_t>&
GetData() {
return packetData; }
90 inline size_t GetDataSize()
const {
return packetData.size(); }
92 template <
typename T,
typename... I>
93 requires wpi::util::StructSerializable<T, I...>
94 inline void Pack(
const T& value) {
97 size_t newWritePos = writePos + wpi::util::GetStructSize<T, I...>();
98 packetData.resize(newWritePos);
100 wpi::util::PackStruct(
101 std::span<uint8_t>{packetData.begin() + writePos, packetData.end()},
104 writePos = newWritePos;
107 template <
typename T>
109 inline void Pack(
const T& value) {
113 template <
typename T,
typename... I>
114 requires wpi::util::StructSerializable<T, I...>
117 T ret = wpi::util::UnpackStruct<T, I...>(
118 std::span<uint8_t>{packetData.begin() + readPos, packetData.end()});
119 readPos += wpi::util::GetStructSize<T, I...>();
123 template <
typename T>
134 std::vector<uint8_t> packetData{};
141concept arithmetic = std::integral<T> || std::floating_point<T>;
148 uint8_t len = packet.
Unpack<uint8_t>();
151 for (
size_t i = 0; i < len; i++) {
152 ret.push_back(packet.
Unpack<T>());
156 static void Pack(
Packet& packet,
const std::vector<T>& value) {
157 packet.
Pack<uint8_t>(value.size());
158 for (
const auto& thing : value) {
159 packet.
Pack<T>(thing);
176 requires(PhotonStructSerializable<T> || arithmetic<T>)
179 if (packet.
Unpack<uint8_t>() == 1u) {
180 return packet.
Unpack<T>();
185 static void Pack(
Packet& packet,
const std::optional<T>& value) {
186 packet.
Pack<uint8_t>(value.has_value());
188 packet.
Pack<T>(*value);
A packet that holds byte-packed data to be sent over NetworkTables.
Definition Packet.h:62
void Pack(const T &value)
Definition Packet.h:109
T Unpack()
Definition Packet.h:125
size_t GetDataSize() const
Returns the number of bytes in the data.
Definition Packet.h:90
T Unpack()
Definition Packet.h:115
bool operator==(const Packet &right) const
bool operator!=(const Packet &right) const
Packet(int initialCapacity=0)
Constructs an empty packet.
Definition Packet.h:67
void Pack(const T &value)
Definition Packet.h:94
const std::vector< uint8_t > & GetData()
Returns the packet data.
Definition Packet.h:84
void Clear()
Clears the packet and resets the read and write positions.
Packet(std::vector< uint8_t > data)
Constructs a packet with the given data.
Definition VisionEstimation.h:30
static void Pack(Packet &packet, const std::optional< T > &value)
Definition Packet.h:185
static std::optional< T > Unpack(Packet &packet)
Definition Packet.h:178
static constexpr std::string_view GetSchema()
Definition Packet.h:196
static constexpr std::string_view GetSchemaHash()
Definition Packet.h:191
static constexpr std::string_view GetSchema()
Definition Packet.h:167
static std::vector< T > Unpack(Packet &packet)
Definition Packet.h:147
static constexpr std::string_view GetSchemaHash()
Definition Packet.h:162
static void Pack(Packet &packet, const std::vector< T > &value)
Definition Packet.h:156