Zen C++ Libraries
Zero-dependency re-usable components for C++
Loading...
Searching...
No Matches
concepts.hpp
1#ifndef ZEN_CONCEPTS_HPP
2#define ZEN_CONCEPTS_HPP
3
4#include <concepts>
5#include <iterator>
6#include <type_traits>
7#include <memory>
8
9#include "zen/config.hpp"
10#include "zen/compat.hpp"
11
12ZEN_NAMESPACE_START
13
14template<typename T>
15concept range = requires (T& a) {
16 { a.begin() } -> std::input_iterator;
17 { a.end() } -> std::input_iterator;
18};
19
20template<typename T>
22 && std::same_as<iter_const_reference_t<T>, std::iter_reference_t<T>>;
23
24template<typename T>
25concept container = range<T> && requires (T& t) {
26 T::value_type;
27};
28
29template<range T>
30using range_iterator_t = decltype(std::declval<T&>().begin());
31
32template<range T>
33using range_reference_t = std::iter_reference_t<range_iterator_t<T>>;
34
35template<typename T>
36struct is_pointer : std::false_type {};
37
38template<typename T>
39struct is_pointer<std::unique_ptr<T>> : std::true_type {};
40
41template<typename T>
42struct is_pointer<std::shared_ptr<T>> : std::true_type {};
43
44template<typename T>
46
47ZEN_NAMESPACE_END
48
49#endif // of #ifndef ZEN_CONCEPTS_HPP
Definition concepts.hpp:21
Definition concepts.hpp:25
Definition concepts.hpp:45
Definition concepts.hpp:15
Definition concepts.hpp:36