16#ifndef RANS_INTERNAL_TRANSFORM_ITERATOR_H_
17#define RANS_INTERNAL_TRANSFORM_ITERATOR_H_
26#include <fairlogger/Logger.h>
34template <
typename IT,
typename tag_T>
35struct hasIteratorTag :
public std::bool_constant<std::is_same_v<typename std::iterator_traits<IT>::iterator_category, tag_T>> {
42template <
typename iterA_T,
typename iterB_T>
45template <
typename iterA_T,
typename iterB_T>
69template <
typename iterA_T,
typename iterB_T>
74template <
class iterA_T,
class iterB_T,
class F>
79 using value_type = std::invoke_result_t<F, iterA_T, iterB_T>;
98 template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool> = true>
101 template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool> = true>
104 template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool> = true>
107 template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool> = true>
110 template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool> = true>
117 template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool> = true>
120 template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool> = true>
123 template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool> = true>
126 template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool> = true>
132 template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool> = true>
143 o <<
"CombinedInputIterator{iterA: " << &(iter.mIterA) <<
", iterB: " << &(iter.mIterB) <<
"}";
153template <
class input_T,
class iterA_T,
class iterB_T,
class F>
162 Proxy& operator=(input_T
value);
198 o <<
"CombinedOutputIterator{iterA: " << &(iter.mIterA) <<
", iterB: " << &(iter.mIterB) <<
"}";
203template <
typename input_T>
206 template <
class iterA_T,
class iterB_T,
class F>
209 return {iterA, iterB, functor};
213template <
class iterA_T,
class iterB_T,
class F>
218template <
class iterA_T,
class iterB_T,
class F>
221 mIterA =
other.mIterA;
222 mIterB =
other.mIterB;
226template <
class iterA_T,
class iterB_T,
class F>
234template <
class iterA_T,
class iterB_T,
class F>
242template <
class iterA_T,
class iterB_T,
class F>
250template <
class iterA_T,
class iterB_T,
class F>
258template <
class iterA_T,
class iterB_T,
class F>
259template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool>>
267template <
class iterA_T,
class iterB_T,
class F>
268template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool>>
275template <
class iterA_T,
class iterB_T,
class F>
276template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool>>
284template <
class iterA_T,
class iterB_T,
class F>
285template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool>>
292template <
class iterA_T,
class iterB_T,
class F>
293template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool>>
296 return this->mIterA -
other.mIterA;
299template <
class iterA_T,
class iterB_T,
class F>
302 return (mIterA ==
other.mIterA) && (mIterB ==
other.mIterB);
305template <
class iterA_T,
class iterB_T,
class F>
308 return !(*
this ==
other);
311template <
class iterA_T,
class iterB_T,
class F>
312template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool>>
315 return other - *
this > 0;
318template <
class iterA_T,
class iterB_T,
class F>
319template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool>>
322 return other < *
this;
325template <
class iterA_T,
class iterB_T,
class F>
326template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool>>
329 return !(*
this <
other);
332template <
class iterA_T,
class iterB_T,
class F>
333template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool>>
336 return !(*
this >
other);
339template <
class iterA_T,
class iterB_T,
class F>
342 return mFunctor(mIterA, mIterB);
345template <
class iterA_T,
class iterB_T,
class F>
346template <std::enable_if_t<
internal::areBothRandomAccessIterators_v<iterA_T, iterB_T>,
bool>>
352template <
typename input_T,
class iterA_T,
class iterB_T,
class F>
359template <
typename input_T,
class iterA_T,
class iterB_T,
class F>
362 mIterA =
other.mIterA;
363 mIterB =
other.mIterB;
367template <
typename input_T,
class iterA_T,
class iterB_T,
class F>
375template <
typename input_T,
class iterA_T,
class iterB_T,
class F>
383template <
typename input_T,
class iterA_T,
class iterB_T,
class F>
390template <
typename input_T,
class iterA_T,
class iterB_T,
class F>
395template <
typename input_T,
class iterA_T,
class iterB_T,
class F>
396inline auto CombinedOutputIterator<input_T, iterA_T, iterB_T, F>::Proxy::operator=(input_T
value) -> Proxy&
398 mIter->mFunctor(mIter->mIterA, mIter->mIterB,
value);
friend std::ostream & operator<<(std::ostream &o, const CombinedOutputIterator &iter)
CombinedOutputIterator(const CombinedOutputIterator &iter)=default
std::input_iterator_tag iterator_category
std::ptrdiff_t difference_type
CombinedOutputIterator(CombinedOutputIterator &&iter)=default
CombinedOutputIterator & operator=(const CombinedOutputIterator &other)
CombinedOutputIterator & operator++()
CombinedOutputIterator(iterA_T iterA, iterB_T iterB, F functor)
~CombinedOutputIterator()=default
CombinedOutputIterator & operator=(CombinedOutputIterator &&other)=default
GLsizei const GLfloat * value
constexpr bool isBidirectionalIterator_v
constexpr bool areBothRandomAccessIterators_v
typename getIteratorTag< iterA_T, iterB_T >::value_type getIteratorTag_t
constexpr bool isRandomAccessIterator_v
Defining DataPointCompositeObject explicitly as copiable.
static auto makeIter(iterA_T iterA, iterB_T iterB, F functor) -> CombinedOutputIterator< input_T, iterA_T, iterB_T, F >
std::bidirectional_iterator_tag value_type
std::bidirectional_iterator_tag value_type
std::random_access_iterator_tag value_type
std::bidirectional_iterator_tag value_type
VectorOfTObjectPtrs other