23template <
typename Policy>
26 std::bool_constant<(Policy::size(), true)>()
27 } -> std::same_as<std::true_type>;
28 { Policy::size() } -> std::same_as<std::size_t>;
30 std::bool_constant<(Policy::calculate(std::span<const std::byte>{}),
32 } -> std::same_as<std::true_type>;
35 Policy::calculate(data)
36 } -> std::same_as<std::array<std::byte, Policy::size()>>;
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> {
65 [[nodiscard]]
static constexpr std::size_t size()
noexcept {
return 2; }
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++) {
79 crc =
static_cast<uint16_t
>((crc << 1) ^ 0x1021);
81 crc =
static_cast<uint16_t
>(crc << 1);
85 return {
static_cast<std::byte
>((crc >> 8) & 0xFF),
86 static_cast<std::byte
>(crc & 0xFF)};
96 [[nodiscard]]
static constexpr std::size_t size()
noexcept {
return 1; }
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>{})};
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