CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
ValueCompareAlgorithm.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
20
21#include "Partitioner.hpp"
22
24
25namespace CeresEngine {
26
32 template<class Derived> class ValueCompareAlgorithmFunctor {
33 public:
35 template<class E, class P, class I, class S, class T>
36 requires(
37 // clang-format off
38 traits::is_executor_v<E> &&
39 traits::is_partitioner_v<P, I, S> &&
40 traits::is_input_iterator_v<I> &&
41 traits::is_sentinel_for_v<S, I> &&
42 traits::is_indirectly_binary_invocable_v<std::equal_to<>, T *, I>
43 // clang-format on
44 ) constexpr decltype(auto)
45 operator()(const E& executor, P p, I first, S last, T f) const {
46 if(std::is_constant_evaluated()) {
47 return Derived().run(make_inline_executor(), HalvePartitioner(1), first, last, std::move(f));
48 } else {
49 return Derived().run(executor, p, first, last, std::move(f));
50 }
51 }
52
54 template<class E, class P, class R, class T>
55 requires(
56 // clang-format off
57 traits::is_executor_v<E> &&
58 traits::is_range_partitioner_v<P, R> &&
59 traits::is_input_range_v<R> &&
60 traits::is_indirectly_binary_invocable_v<std::equal_to<>, T *, traits::iterator_t<R>> &&
61 std::is_copy_constructible_v<T>
62 // clang-format on
63 ) constexpr decltype(auto)
64 operator()(const E& executor, P p, R&& r, T f) const {
65 if(std::is_constant_evaluated()) {
66 return Derived().run(make_inline_executor(), HalvePartitioner(1), std::begin(r), std::end(r), std::move(f));
67 } else {
68 return Derived().run(executor, p, std::begin(r), std::end(r), std::move(f));
69 }
70 }
71
73 template<class P, class I, class S, class T>
74 requires(
75 // clang-format off
76 traits::is_partitioner_v<P, I, S> &&
77 traits::is_input_iterator_v<I> &&
78 traits::is_sentinel_for_v<S, I> &&
79 traits::is_indirectly_binary_invocable_v<std::equal_to<>, T *, I> &&
80 std::is_copy_constructible_v<T>
81 // clang-format on
82 ) constexpr decltype(auto)
83 operator()(P p, I first, S last, T f) const {
84 if(std::is_constant_evaluated()) {
85 return Derived().run(make_inline_executor(), HalvePartitioner(1), first, last, std::move(f));
86 } else {
87 return Derived().run(make_default_executor(), p, first, last, std::move(f));
88 }
89 }
90
92 template<class P, class R, class T>
93 requires(
94 // clang-format off
95 traits::is_range_partitioner_v<P, R> &&
96 traits::is_input_range_v<R> &&
97 traits::is_indirectly_binary_invocable_v<std::equal_to<>, T *, traits::iterator_t<R>> &&
98 std::is_copy_constructible_v<T>
99 // clang-format on
100 ) constexpr decltype(auto)
101 operator()(P p, R&& r, T f) const {
102 if(std::is_constant_evaluated()) {
103 return Derived().run(make_inline_executor(), HalvePartitioner(1), std::begin(r), std::end(r), std::move(f));
104 } else {
105 return Derived().run(make_default_executor(), p, std::begin(r), std::end(r), std::move(f));
106 }
107 }
108
110 template<class E, class I, class S, class T>
111 requires(
112 // clang-format off
113 traits::is_executor_v<E> &&
114 traits::is_input_iterator_v<I> &&
115 traits::is_sentinel_for_v<S, I> &&
116 traits::is_indirectly_binary_invocable_v<std::equal_to<>, T *, I>
117 // clang-format on
118 ) constexpr decltype(auto)
119 operator()(const E& executor, I first, S last, T f) const {
120 if(std::is_constant_evaluated()) {
121 return operator()(make_inline_executor(), HalvePartitioner(1), first, last, std::move(f));
122 } else {
123 return operator()(executor, make_default_partitioner(executor, first, last), first, last, std::move(f));
124 }
125 }
126
128 template<class E, class R, class T>
129 requires(
130 // clang-format off
131 traits::is_executor_v<E> &&
132 traits::is_input_range_v<R> &&
133 traits::is_indirectly_binary_invocable_v<std::equal_to<>, T *, traits::iterator_t<R>> &&
134 std::is_copy_constructible_v<T>
135 // clang-format on
136 ) constexpr decltype(auto)
137 operator()(const E& executor, R&& r, T f) const {
138 if(std::is_constant_evaluated()) {
139 return operator()(make_inline_executor(), HalvePartitioner(1), std::begin(r), std::end(r), std::move(f));
140 } else {
141 return operator()(executor, make_default_partitioner(executor, std::forward<R>(r)), std::begin(r), std::end(r), std::move(f));
142 }
143 }
144
146 template<class I, class S, class T>
147 requires(
148 // clang-format off
149 traits::is_input_iterator_v<I> &&
150 traits::is_sentinel_for_v<S, I> &&
151 traits::is_indirectly_binary_invocable_v<std::equal_to<>, T *, I>
152 // clang-format on
153 ) constexpr decltype(auto)
154 operator()(I first, S last, T f) const {
155 if(std::is_constant_evaluated()) {
156 return Derived().run(make_inline_executor(), HalvePartitioner(1), first, last, std::move(f));
157 } else {
158 return Derived().run(make_default_executor(), make_default_partitioner(first, last), first, last, std::move(f));
159 }
160 }
161
163 template<class R, class T>
164 requires(
165 // clang-format off
166 traits::is_input_range_v<R> &&
167 traits::is_indirectly_binary_invocable_v<std::equal_to<>, T *, traits::iterator_t<R>> &&
168 std::is_copy_constructible_v<T>
169 // clang-format on
170 ) constexpr decltype(auto)
171 operator()(R&& r, T f) const {
172 if(std::is_constant_evaluated()) {
173 return Derived().run(make_inline_executor(), HalvePartitioner(1), std::begin(r), std::end(r), std::move(f));
174 } else {
175 return Derived().run(make_default_executor(), make_default_partitioner(r), std::begin(r), std::end(r), std::move(f));
176 }
177 }
178 };
179
180} // namespace CeresEngine
A partitioner is a light callable object that takes a pair of iterators and returns the middle of the...
The halve partitioner always splits the sequence into two parts of roughly equal size.
Definition Partitioner.hpp:37
Value-compare algorithm overloads.
Definition ValueCompareAlgorithm.hpp:32
constexpr decltype(auto) operator()(const E &executor, R &&r, T f) const
Overload for Ranges / default partitioner.
Definition ValueCompareAlgorithm.hpp:137
constexpr decltype(auto) operator()(R &&r, T f) const
Overload for Ranges / default executor / default partitioner.
Definition ValueCompareAlgorithm.hpp:171
constexpr decltype(auto) operator()(const E &executor, I first, S last, T f) const
Overload for Iterators / default partitioner.
Definition ValueCompareAlgorithm.hpp:119
constexpr decltype(auto) operator()(P p, R &&r, T f) const
Overload for Ranges / default parallel executor.
Definition ValueCompareAlgorithm.hpp:101
constexpr decltype(auto) operator()(P p, I first, S last, T f) const
Overload for Iterators / default parallel executor.
Definition ValueCompareAlgorithm.hpp:83
constexpr decltype(auto) operator()(const E &executor, P p, R &&r, T f) const
Overload for Ranges.
Definition ValueCompareAlgorithm.hpp:64
constexpr decltype(auto) operator()(const E &executor, P p, I first, S last, T f) const
Complete overload.
Definition ValueCompareAlgorithm.hpp:45
constexpr decltype(auto) operator()(I first, S last, T f) const
Overload for Iterators / default executor / default partitioner.
Definition ValueCompareAlgorithm.hpp:154
typename iterator< T >::type iterator_t
A C++17 type trait equivalent to the C++20 iterator_t concept.
Definition iterator.hpp:27
Definition Application.hpp:19
constexpr auto make_inline_executor()
An executor that runs anything inline.
Definition ExecutionContext.hpp:660
auto make_default_executor()
The default executor to be used when no other executor is provided.
Definition ExecutionContext.hpp:743
DefaultPartitioner make_default_partitioner(const size_t n, const std::size_t occupancy=hardware_concurrency())
Create an instance of the default partitioner with a reasonable grain size for n elements.
Definition Partitioner.hpp:97