36 lines
982 B
C++
36 lines
982 B
C++
#pragma once
|
|
|
|
#include <BAN/ByteSpan.h>
|
|
#include <BAN/Optional.h>
|
|
#include <BAN/Vector.h>
|
|
|
|
template<typename T>
|
|
inline BAN::Optional<T> decode(BAN::ConstByteSpan& buffer)
|
|
{
|
|
if (buffer.size() < sizeof(T))
|
|
return {};
|
|
T result = buffer.as<const T>();
|
|
buffer = buffer.slice(sizeof(T));
|
|
return result;
|
|
}
|
|
|
|
inline BAN::ErrorOr<void> encode_bytes(BAN::Vector<uint8_t>& buffer, const void* data, size_t size)
|
|
{
|
|
const size_t old_size = buffer.size();
|
|
TRY(buffer.resize(old_size + size));
|
|
memcpy(buffer.data() + old_size, data, size);
|
|
return {};
|
|
}
|
|
|
|
template<typename T> requires BAN::is_pod_v<T>
|
|
inline BAN::ErrorOr<void> encode(BAN::Vector<uint8_t>& buffer, const T& value)
|
|
{
|
|
return encode_bytes(buffer, &value, sizeof(T));
|
|
}
|
|
|
|
template<typename T> requires requires(T value) { value.size(); value.data(); }
|
|
inline BAN::ErrorOr<void> encode(BAN::Vector<uint8_t>& buffer, const T& value)
|
|
{
|
|
return encode_bytes(buffer, value.data(), value.size() * sizeof(typename T::value_type));
|
|
}
|