#pragma once #include #include #include #include namespace ovdl { struct File; namespace detail { enum class buffer_error : std::uint8_t; } } namespace ovdl::detail { template concept any_of = std::disjunction_v...>; template concept HasCstr = requires(T t) { { t.c_str() } -> std::same_as; }; template concept HasPath = requires(T& t) { { t.path() } -> std::same_as; }; template concept LoadCallback = requires(T&& t, Self&& self, Args&&... args) { { std::invoke(std::forward(t), std::forward(self), std::forward(args)...) } -> std::same_as; }; template concept IsEncoding = requires(T t) { typename T::char_type; typename T::int_type; { T::template is_secondary_char_type() } -> std::same_as; { T::eof() } -> std::same_as; { T::to_int_type(typename T::char_type {}) } -> std::same_as; }; template concept Invocable_R = std::invocable && requires(Args&&... args) { { invoke(forward(args)...) } -> std::convertible_to; }; }