Botan 3.9.0
Crypto and TLS for C&
Botan::ranges Namespace Reference

Concepts

concept  contiguous_range
concept  contiguous_output_range
concept  spanable_range
concept  statically_spanable_range

Functions

template<spanable_range R0, spanable_range... Rs>
requires (sizeof...(Rs) > 0)
constexpr void assert_equal_byte_lengths (const R0 &r0, const Rs &... rs)
template<size_t expected, spanable_range R>
constexpr void assert_exact_byte_length (const R &r)
constexpr size_t size_bytes (const spanable_range auto &r)

Function Documentation

◆ assert_equal_byte_lengths()

template<spanable_range R0, spanable_range... Rs>
requires (sizeof...(Rs) > 0)
void Botan::ranges::assert_equal_byte_lengths ( const R0 & r0,
const Rs &... rs )
inlineconstexpr

Check that a list of ranges (in r0 and rs) all have the same byte lengths. If the first range's extent is known at compile time, this will be a static check for all other ranges whose extents are known at compile time, otherwise a runtime argument check will be added.

Exceptions
Invalid_Argumentif any range has a dynamic extent and not all ranges feature the same byte length.

Definition at line 128 of file concepts.h.

130{
131 const std::span s0{r0};
132
133 if constexpr(statically_spanable_range<R0>) {
134 constexpr size_t expected_size = s0.size_bytes();
136 } else {
137 const size_t expected_size = s0.size_bytes();
138 const bool correct_size =
139 ((std::span<const std::ranges::range_value_t<Rs>>{rs}.size_bytes() == expected_size) && ...);
140
141 if(!correct_size) {
142 throw Invalid_Argument("Memory regions did not have equal lengths");
143 }
144 }
145}
constexpr void assert_exact_byte_length(const R &r)
Definition concepts.h:107

References assert_exact_byte_length().

Referenced by Botan::copy_mem(), Botan::detail::load_any(), Botan::detail::store_any(), Botan::typecast_copy(), Botan::xor_buf(), and Botan::xor_buf().

◆ assert_exact_byte_length()

template<size_t expected, spanable_range R>
void Botan::ranges::assert_exact_byte_length ( const R & r)
inlineconstexpr

Check that a given range r has a certain statically-known byte length. If the range's extent is known at compile time, this is a static check, otherwise a runtime argument check will be added.

Exceptions
Invalid_Argumentif range r has a dynamic extent and does not feature the expected byte length.

Definition at line 107 of file concepts.h.

107 {
108 const std::span s{r};
109 if constexpr(statically_spanable_range<R>) {
110 static_assert(s.size_bytes() == expected, "memory region does not have expected byte lengths");
111 } else {
112 if(s.size_bytes() != expected) {
113 throw Invalid_Argument("Memory regions did not have expected byte lengths");
114 }
115 }
116}

Referenced by assert_equal_byte_lengths(), Botan::detail::load_any(), Botan::detail::load_any(), Botan::detail::load_any(), Botan::detail::store_any(), Botan::detail::store_any(), and Botan::detail::store_any().

◆ size_bytes()

size_t Botan::ranges::size_bytes ( const spanable_range auto & r)
inlineconstexpr

Find the length in bytes of a given contiguous range r.

Definition at line 94 of file concepts.h.

94 {
95 return std::span{r}.size_bytes();
96}

Referenced by Botan::clear_mem(), Botan::copy_mem(), Botan::secure_scrub_memory(), and Botan::typecast_copy().