62template <
typename T,
typename ValueT = std::ranges::range_value_t<T>>
63concept contiguous_range = std::ranges::contiguous_range<T> && std::same_as<ValueT, std::ranges::range_value_t<T>>;
71template <
typename T,
typename ValueT = std::ranges::range_value_t<T>>
79concept spanable_range = std::constructible_from<std::span<const std::ranges::range_value_t<T>>, T>;
88 decltype(std::span{std::declval<T&>()})::extent != std::dynamic_extent;
96 return std::span{r}.size_bytes();
107template <
size_t expected, spanable_range R>
109 const std::span s{r};
111 static_assert(s.size_bytes() == expected,
"memory region does not have expected byte lengths");
113 if(s.size_bytes() != expected) {
114 throw Invalid_Argument(
"Memory regions did not have expected byte lengths");
128template <spanable_range R0, spanable_range... Rs>
130 requires(
sizeof...(Rs) > 0)
132 const std::span s0{r0};
135 constexpr size_t expected_size = s0.size_bytes();
138 const size_t expected_size = s0.size_bytes();
139 const bool correct_size =
140 ((std::span<const std::ranges::range_value_t<Rs>>{rs}.size_bytes() == expected_size) && ...);
156template <
typename IterT,
typename ContainerT>
158 std::same_as<IterT, typename ContainerT::iterator> || std::same_as<IterT, typename ContainerT::const_iterator>;
160template <
typename PtrT,
typename ContainerT>
162 std::same_as<PtrT, typename ContainerT::pointer> || std::same_as<PtrT, typename ContainerT::const_pointer>;
170 { a.size() } -> std::same_as<typename T::size_type>;
171 typename T::value_type;
181 { a.empty() } -> std::same_as<bool>;
187 requires(T a,
const T ac,
typename T::size_type s) {
188 { a.at(s) } -> std::same_as<typename T::value_type&>;
189 { ac.at(s) } -> std::same_as<const typename T::value_type&>;
191 requires(T a,
const T ac,
typename T::key_type k) {
192 { a.at(k) } -> std::same_as<typename T::mapped_type&>;
193 { ac.at(k) } -> std::same_as<const typename T::mapped_type&>;
211concept streamable =
requires(std::ostream& os, T a) { os << a; };
225template <
typename T,
typename Capability>