sandbox
Loading...
Searching...
No Matches
concepts.hpp
1#ifndef LIBSBX_CORE_CONCEPTS_HPP_
2#define LIBSBX_CORE_CONCEPTS_HPP_
3
4#include <type_traits>
5#include <concepts>
6
7namespace sbx::core {
8
16template<typename Callable, typename Return, typename... Args>
17concept callable = std::is_invocable_r_v<Return, Callable, Args...>;
18
19template<typename Iterable>
20concept iterable = requires(Iterable iterable) {
21 { Iterable::iterator };
22 { iterable.begin() } -> std::same_as<typename Iterable::iterator>;
23 { iterable.end() } -> std::same_as<typename Iterable::iterator>;
24}; // concept iterable
25
26template<typename Iterable>
27concept const_iterable = requires(Iterable iterable) {
28 { Iterable::const_iterator };
29 { iterable.cbegin() } -> std::same_as<typename Iterable::const_iterator>;
30 { iterable.cend() } -> std::same_as<typename Iterable::const_iterator>;
31}; // concept const_iterable
32
33template<typename Iterable>
34concept reverse_iterable = requires(Iterable iterable) {
35 { Iterable::reverse_iterator };
36 { iterable.rbegin() } -> std::same_as<typename Iterable::reverse_iterator>;
37 { iterable.rend() } -> std::same_as<typename Iterable::reverse_iterator>;
38}; // concept reverse_iterable
39
40} // namespace sbx::core
41
42#endif // LIBSBX_CORE_CONCEPTS_HPP_
Describes a type or object that can be invoked with the give parameters and return the given type.
Definition: concepts.hpp:17