Crunch
A Message Definition Language for Getting Things Right
Loading...
Searching...
No Matches
crunch_integrity.hpp
1#pragma once
2
3#include <array>
4#include <concepts>
5#include <cstddef>
6#include <cstdint>
7#include <functional>
8#include <numeric>
9#include <span>
10#include <type_traits>
11
12namespace Crunch {
13
23template <typename Policy>
24concept IntegrityPolicy = requires(std::span<const std::byte> data) {
25 {
26 std::bool_constant<(Policy::size(), true)>()
27 } -> std::same_as<std::true_type>;
28 { Policy::size() } -> std::same_as<std::size_t>;
29 {
30 std::bool_constant<(Policy::calculate(std::span<const std::byte>{}),
31 true)>()
32 } -> std::same_as<std::true_type>;
33
34 {
35 Policy::calculate(data)
36 } -> std::same_as<std::array<std::byte, Policy::size()>>;
37};
38
42namespace integrity {
43
49struct None {
50 [[nodiscard]] static constexpr std::size_t size() noexcept { return 0; }
51 [[nodiscard]] static constexpr auto calculate(
52 std::span<const std::byte>) noexcept -> std::array<std::byte, 0> {
53 return {};
54 }
55};
56
64struct CRC16 {
65 [[nodiscard]] static constexpr std::size_t size() noexcept { return 2; }
66
72 [[nodiscard]] static constexpr auto calculate(
73 std::span<const std::byte> data) noexcept -> std::array<std::byte, 2> {
74 uint16_t crc = 0xFFFF;
75 for (std::byte b : data) {
76 crc ^= (static_cast<uint8_t>(b) << 8);
77 for (int i = 0; i < 8; i++) {
78 if (crc & 0x8000) {
79 crc = static_cast<uint16_t>((crc << 1) ^ 0x1021);
80 } else {
81 crc = static_cast<uint16_t>(crc << 1);
82 }
83 }
84 }
85 return {static_cast<std::byte>((crc >> 8) & 0xFF),
86 static_cast<std::byte>(crc & 0xFF)};
87 }
88};
89
95struct Parity {
96 [[nodiscard]] static constexpr std::size_t size() noexcept { return 1; }
97
103 [[nodiscard]] static constexpr auto calculate(
104 std::span<const std::byte> data) noexcept -> std::array<std::byte, 1> {
105 return {std::accumulate(data.begin(), data.end(), std::byte{0},
106 std::bit_xor<std::byte>{})};
107 }
108};
109
110} // namespace integrity
111
112} // namespace Crunch
Concept defining the interface for message integrity policies.
Definition: crunch_integrity.hpp:24
The public API for Crunch.
Definition: crunch_endian.hpp:10
CRC-16-CCITT integrity policy.
Definition: crunch_integrity.hpp:64
static constexpr auto calculate(std::span< const std::byte > data) noexcept -> std::array< std::byte, 2 >
Calculates CRC-16-CCITT checksum.
Definition: crunch_integrity.hpp:72
No-op integrity policy.
Definition: crunch_integrity.hpp:49
Simple XOR parity integrity policy.
Definition: crunch_integrity.hpp:95
static constexpr auto calculate(std::span< const std::byte > data) noexcept -> std::array< std::byte, 1 >
Calculates XOR parity.
Definition: crunch_integrity.hpp:103