101template<
class T,
class... Args>
106 requires { ::new (
static_cast<void *
>(
nullptr)) T; };
108template<typename IterT, typename ContainerT>
110 std::same_as<IterT, typename ContainerT::iterator> || std::same_as<IterT, typename ContainerT::const_iterator>;
112template<typename PtrT, typename ContainerT>
114 std::same_as<PtrT, typename ContainerT::pointer> || std::same_as<PtrT, typename ContainerT::const_pointer>;
122 { a.size() } -> std::same_as<typename T::size_type>;
123 typename T::value_type;
133 { a.empty() } -> std::same_as<bool>;
147 std::same_as<typename T::value_type, uint8_t>;
151 { std::string_view(a) } -> std::convertible_to<std::string_view>;
152} || std::same_as<T, char> || std::same_as<T, std::vector<char>>;
155concept streamable =
requires(std::ostream &os, T a) { os << a; };
169template<
typename T,
typename Capability>
174 std::same_as<T, uint8_t> || std::same_as<T, int8_t> || std::same_as<T, uint16_t> || std::same_as<T, int16_t> ||
175 std::same_as<T, uint32_t> || std::same_as<T, int32_t> || std::same_as<T, uint64_t> ||
176 std::same_as<T, int64_t> || std::same_as<T, double> || std::same_as<T, float> || std::same_as<T, std::string> ||
177 std::same_as<T, std::string_view> || std::same_as<T, bool> || std::same_as<T, std::byte>;
181 std::same_as<T, uint8_t> || std::same_as<T, int8_t> || std::same_as<T, uint16_t> || std::same_as<T, int16_t> ||
182 std::same_as<T, uint32_t> || std::same_as<T, int32_t> || std::same_as<T, uint64_t> ||
183 std::same_as<T, int64_t> || std::same_as<T, double> || std::same_as<T, float> || std::same_as<T, std::string> ||
184 std::same_as<T, bool> || std::same_as<T, std::byte>;
187concept IntegerType = std::is_same_v<T, uint64_t> || std::is_same_v<T, uint32_t> || std::is_same_v<T, uint16_t> ||
188 std::is_same_v<T, uint8_t> || std::is_same_v<T, int64_t> || std::is_same_v<T, int32_t> ||
189 std::is_same_v<T, int16_t>;