CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
iter_difference.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
14
15#include <iterator>
16#include <type_traits>
17
18namespace CeresEngine::traits {
19
22 template<class T, class = void> struct iter_difference {};
23
24 template<class T>
25 struct iter_difference<T,
27 // clang-format off
28 has_iterator_traits_difference_type_v<remove_cvref_t<T>>
29 // clang-format on
30 >> {
31 using type = typename std::iterator_traits<remove_cvref_t<T>>::difference_type;
32 };
33
34 template<class T>
35 struct iter_difference<T,
37 // clang-format off
38 !has_iterator_traits_difference_type_v<remove_cvref_t<T>> &&
39 std::is_pointer_v<T>
40 // clang-format on
41 >> {
42 using type = std::ptrdiff_t;
43 };
44
45 template<class T>
46 struct iter_difference<T,
48 // clang-format off
49 !has_iterator_traits_difference_type_v<remove_cvref_t<T>> &&
50 !std::is_pointer_v<T> &&
51 std::is_const_v<T>
52 // clang-format on
53 >> {
54 using type = typename iter_difference<std::remove_const_t<T>>::type;
55 };
56
57 template<class T>
58 struct iter_difference<T,
60 // clang-format off
61 !has_iterator_traits_difference_type_v<remove_cvref_t<T>> &&
62 !std::is_pointer_v<T> &&
63 !std::is_const_v<T> &&
64 has_iterator_traits_difference_type_v<remove_cvref_t<T>>
65 // clang-format on
66 >> {
67 using type = typename T::difference_type;
68 };
69
70 template<class T>
71 struct iter_difference<T,
73 // clang-format off
74 !has_iterator_traits_difference_type_v<remove_cvref_t<T>> &&
75 !std::is_pointer_v<T> &&
76 !std::is_const_v<T> &&
77 !has_iterator_traits_difference_type_v<remove_cvref_t<T>> &&
78 is_subtractable_v<remove_cvref_t<T>>
79 // clang-format on
80 >> {
81 using type = std::make_signed_t<decltype(std::declval<T>() - std::declval<T>())>;
82 };
83
85 template<class T> using iter_difference_t = typename iter_difference<T>::type;
86
87} // namespace CeresEngine::traits
Definition Partitioner.hpp:146
typename iter_difference< T >::type iter_difference_t
A C++17 type trait equivalent to the C++20 iter_difference concept.
Definition iter_difference.hpp:85
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25
Definition Span.hpp:668
A C++17 type trait equivalent to the C++20 iter_difference concept.
Definition iter_difference.hpp:22