#pragma once #ifndef NEO_CONCEPT #if defined(__GNUC__) && __GNUC__ < 9 #define NEO_CONCEPT concept bool #else #define NEO_CONCEPT concept #endif #endif #include #include #include #include namespace neo { template NEO_CONCEPT const_buffer_sequence_iterator = requires(T iter) { typename std::iterator_traits::value_type; std::is_convertible_v::value_type, const_buffer>; }; template NEO_CONCEPT mutable_buffer_sequence_iterator = const_buffer_sequence_iterator&& requires(T iter) { std::is_convertible_v::value_type, mutable_buffer>; }; template NEO_CONCEPT const_buffer_sequence = requires(T seq) { { buffer_sequence_begin(seq) } ->const_buffer_sequence_iterator; buffer_sequence_end(seq); { buffer_sequence_begin(seq) != buffer_sequence_end(seq) } ->bool; }; template NEO_CONCEPT mutable_buffer_sequence = const_buffer_sequence&& requires(T seq) { { buffer_sequence_begin(seq) } ->mutable_buffer_sequence_iterator; }; } // namespace neo