sandbox
Loading...
Searching...
No Matches
iterator.hpp
1#ifndef LIBSBX_UTILITY_ITERATOR_HPP_
2#define LIBSBX_UTILITY_ITERATOR_HPP_
3
4#include <cstddef>
5#include <iterator>
6#include <type_traits>
7
8namespace sbx::utility {
9
10template<typename Category, typename Type, typename Distance = std::ptrdiff_t, typename Pointer = Type*, typename Reference = Type&>
11struct iterator {
12 using iterator_category = Category;
13 using value_type = Type;
14 using difference_type = Distance;
15 using pointer = Pointer;
16 using reference = Reference;
17}; // struct iterator
18
19template<typename Type>
20concept iterable = requires(Type t) {
21 { std::begin(t) } -> std::same_as<typename Type::iterator>;
22 { std::end(t) } -> std::same_as<typename Type::iterator>;
23} || requires(Type t) {
24 { std::begin(t) } -> std::same_as<typename Type::const_iterator>;
25 { std::end(t) } -> std::same_as<typename Type::const_iterator>;
26} || std::is_array_v<Type>;
27
28} // namespace sbx::utility
29
30#endif // LIBSBX_UTILITY_ITERATOR_HPP_
Definition: iterator.hpp:11