74 lines
1.6 KiB
C
74 lines
1.6 KiB
C
|
|
#pragma once
|
||
|
|
#include "../utility/assert.h"
|
||
|
|
#include "../utility/meta.h"
|
||
|
|
#include "../utility/parameter.h"
|
||
|
|
|
||
|
|
#include "../stream/serialize_traits.h"
|
||
|
|
|
||
|
|
namespace bitstream
|
||
|
|
{
|
||
|
|
/**
|
||
|
|
* @brief A trait used to serialize a boolean as a single bit
|
||
|
|
*/
|
||
|
|
template<>
|
||
|
|
struct serialize_traits<bool>
|
||
|
|
{
|
||
|
|
template<typename Stream>
|
||
|
|
typename utility::is_writing_t<Stream>
|
||
|
|
static serialize(Stream& writer, in<bool> value) noexcept
|
||
|
|
{
|
||
|
|
uint32_t unsigned_value = value;
|
||
|
|
|
||
|
|
return writer.serialize_bits(unsigned_value, 1U);
|
||
|
|
}
|
||
|
|
|
||
|
|
template<typename Stream>
|
||
|
|
typename utility::is_reading_t<Stream>
|
||
|
|
static serialize(Stream& reader, out<bool> value) noexcept
|
||
|
|
{
|
||
|
|
uint32_t unsigned_value;
|
||
|
|
|
||
|
|
BS_ASSERT(reader.serialize_bits(unsigned_value, 1U));
|
||
|
|
|
||
|
|
value = unsigned_value;
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief A trait used to serialize multiple boolean values
|
||
|
|
*/
|
||
|
|
template<size_t Size>
|
||
|
|
struct serialize_traits<bool[Size]>
|
||
|
|
{
|
||
|
|
template<typename Stream>
|
||
|
|
typename utility::is_writing_t<Stream>
|
||
|
|
static serialize(Stream& writer, const bool* values) noexcept
|
||
|
|
{
|
||
|
|
uint32_t unsigned_value;
|
||
|
|
for (size_t i = 0; i < Size; i++)
|
||
|
|
{
|
||
|
|
unsigned_value = values[i];
|
||
|
|
BS_ASSERT(writer.serialize_bits(unsigned_value, 1U));
|
||
|
|
}
|
||
|
|
|
||
|
|
return writer.serialize_bits(unsigned_value, 1U);
|
||
|
|
}
|
||
|
|
|
||
|
|
template<typename Stream>
|
||
|
|
typename utility::is_reading_t<Stream>
|
||
|
|
static serialize(Stream& reader, bool* values) noexcept
|
||
|
|
{
|
||
|
|
uint32_t unsigned_value;
|
||
|
|
for (size_t i = 0; i < Size; i++)
|
||
|
|
{
|
||
|
|
BS_ASSERT(reader.serialize_bits(unsigned_value, 1U));
|
||
|
|
|
||
|
|
values[i] = unsigned_value;
|
||
|
|
}
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
}
|