BitStream
Loading...
Searching...
No Matches
checksum_trait.h
Go to the documentation of this file.
1#pragma once
2#include "../utility/assert.h"
3#include "../utility/crc.h"
4#include "../utility/meta.h"
5#include "../utility/parameter.h"
6
7#include "../stream/serialize_traits.h"
8
9namespace bitstream
10{
15 template<uint32_t Version>
16 struct checksum;
17
23 template<uint32_t Version>
24 struct serialize_traits<checksum<Version>>
25 {
26 constexpr static uint32_t protocol_version = utility::to_big_endian32_const(Version);
27 constexpr static uint32_t protocol_size = sizeof(uint32_t);
28
29 template<typename Stream>
31 static serialize(Stream& writer) noexcept
32 {
33 if (writer.get_num_bits_serialized() == 0)
34 return writer.pad_to_size(4);
35
36 uint32_t num_bits = writer.flush();
37
38 BS_ASSERT(num_bits >= 32U);
39
40 // Get buffer info
41 uint8_t* byte_buffer = writer.get_buffer();
42 uint32_t num_bytes = writer.get_num_bytes_serialized();
43
44 // Generate checksum of version + data
45 uint32_t generated_checksum = utility::crc_uint32(protocol_version, byte_buffer + protocol_size, writer.get_num_bytes_serialized() - protocol_size);
46
47 // Put checksum at beginning
48 uint32_t* buffer = reinterpret_cast<uint32_t*>(byte_buffer);
49 *buffer = utility::to_big_endian32(generated_checksum);
50
51 return true;
52 }
53
54 template<typename Stream>
56 static serialize(Stream& reader) noexcept
57 {
58 if (reader.get_num_bits_serialized() > 0)
59 return true;
60
61 BS_ASSERT(reader.can_serialize_bits(32U));
62
63 // Get buffer info
64 const uint8_t* byte_buffer = reader.get_buffer();
65 uint32_t num_bytes = (reader.get_total_bits() - 1U) / 8U + 1U;
66
67 // Generate checksum to compare against
68 uint32_t generated_checksum = utility::crc_uint32(protocol_version, byte_buffer + protocol_size, num_bytes - protocol_size);
69
70 // Read the checksum
71 uint32_t given_checksum;
72 BS_ASSERT(reader.serialize_bits(given_checksum, 32U));
73
74 // Compare the checksum
75 return generated_checksum == given_checksum;
76 }
77 };
78}
#define BS_ASSERT(...)
Definition assert.h:15
std::enable_if_t< T::writing, R > is_writing_t
Definition meta.h:25
uint32_t crc_uint32(uint32_t checksum, const uint8_t *bytes, uint32_t size)
Definition crc.h:26
BS_CONSTEXPR uint32_t to_big_endian32(uint32_t value)
Definition endian.h:104
std::enable_if_t< T::reading, R > is_reading_t
Definition meta.h:28
constexpr uint32_t to_big_endian32_const(uint32_t value)
Definition endian.h:96
Definition bounded_range.h:28
A byte buffer aligned to 4 bytes. Can be used with bit_reader and bit_writer.
Definition byte_buffer.h:15
Type for checksums.
Definition checksum_trait.h:16
static utility::is_writing_t< Stream > serialize(Stream &writer) noexcept
Definition checksum_trait.h:31
static utility::is_reading_t< Stream > serialize(Stream &reader) noexcept
Definition checksum_trait.h:56
A class for specializing trait serialization functions.
Definition serialize_traits.h:11