Helios Engine
A modular ECS based data-oriented C++23 game engine framework
Loading...
Searching...
No Matches
helios::utils::ChainAdapter< Iter1, Iter2 > Class Template Reference

Iterator adapter that chains two sequences together. More...

#include <functional_adapters.hpp>

Inheritance diagram for helios::utils::ChainAdapter< Iter1, Iter2 >:
helios::utils::FunctionalAdapterBase< ChainAdapter< Iter1, Iter2 > >

Public Types

using iterator_concept
using iterator_category
using value_type = std::iter_value_t<Iter1>
using reference = value_type
using pointer = void
using difference_type

Public Member Functions

constexpr ChainAdapter (Iter1 first_begin, Iter1 first_end, Iter2 second_begin, Iter2 second_end) noexcept(std::is_nothrow_move_constructible_v< Iter1 > &&std::is_nothrow_move_constructible_v< Iter2 > &&noexcept(std::declval< Iter1 & >() !=std::declval< Iter1 & >()))
 Constructs a chain adapter with two iterator ranges.
template<ExternalRange R1, ExternalRange R2>
requires ChainAdapterRequirements<std::ranges::iterator_t<R1>, std::ranges::iterator_t<R2>>
constexpr ChainAdapter (R1 &first_range, R2 &second_range) noexcept(noexcept(ChainAdapter(std::ranges::begin(first_range), std::ranges::end(first_range), std::ranges::begin(second_range), std::ranges::end(second_range))))
 Constructs a chain adapter with the given ranges.
template<ExternalRange R1, ExternalRange R2>
requires ChainAdapterRequirements<std::ranges::iterator_t<const R1>, std::ranges::iterator_t<const R2>>
constexpr ChainAdapter (const R1 &first_range, const R2 &second_range) noexcept(noexcept(ChainAdapter(std::ranges::cbegin(first_range), std::ranges::cend(first_range), std::ranges::cbegin(second_range), std::ranges::cend(second_range))))
 Constructs a chain adapter with the given const ranges.
constexpr ChainAdapter (const ChainAdapter &) noexcept(std::is_nothrow_copy_constructible_v< Iter1 > &&std::is_nothrow_copy_constructible_v< Iter2 >)=default
constexpr ChainAdapter (ChainAdapter &&) noexcept(std::is_nothrow_move_constructible_v< Iter1 > &&std::is_nothrow_move_constructible_v< Iter2 >)=default
constexpr ~ChainAdapter () noexcept(std::is_nothrow_destructible_v< Iter1 > &&std::is_nothrow_destructible_v< Iter2 >)=default
constexpr ChainAdapteroperator= (const ChainAdapter &) noexcept(std::is_nothrow_copy_assignable_v< Iter1 > &&std::is_nothrow_copy_assignable_v< Iter2 >)=default
constexpr ChainAdapteroperator= (ChainAdapter &&) noexcept(std::is_nothrow_move_assignable_v< Iter1 > &&std::is_nothrow_move_assignable_v< Iter2 >)=default
constexpr ChainAdapteroperator++ () noexcept(noexcept(++std::declval< Iter1 & >()) &&noexcept(++std::declval< Iter2 & >()) &&noexcept(std::declval< Iter1 & >()==std::declval< Iter1 & >()) &&noexcept(std::declval< Iter2 & >() !=std::declval< Iter2 & >()))
constexpr ChainAdapter operator++ (int) noexcept(std::is_nothrow_copy_constructible_v< ChainAdapter > &&noexcept(++std::declval< ChainAdapter & >()))
constexpr reference operator* () const noexcept(noexcept(*std::declval< const Iter1 & >()) &&noexcept(*std::declval< const Iter2 & >()))
pointer operator-> () const =delete
constexpr bool operator== (const ChainAdapter &other) const noexcept(noexcept(std::declval< const Iter1 & >()==std::declval< const Iter1 & >()) &&noexcept(std::declval< const Iter2 & >()==std::declval< const Iter2 & >()))
constexpr bool operator!= (const ChainAdapter &other) const noexcept(noexcept(std::declval< const ChainAdapter & >()==std::declval< const ChainAdapter & >()))
constexpr ChainAdapter begin () const noexcept(std::is_nothrow_copy_constructible_v< ChainAdapter >)
constexpr ChainAdapter end () const noexcept(std::is_nothrow_copy_constructible_v< ChainAdapter > &&std::is_nothrow_copy_constructible_v< Iter1 > &&std::is_nothrow_copy_constructible_v< Iter2 >)
Public Member Functions inherited from helios::utils::FunctionalAdapterBase< ChainAdapter< Iter1, Iter2 > >
constexpr auto Filter (Pred predicate) const noexcept(noexcept(FilterAdapter< ChainAdapter< Iter1, Iter2 >, Pred >(GetDerived().begin(), GetDerived().end(), std::move(predicate))))
 Chains another filter operation on top of this iterator.
constexpr auto Map (Func transform) const noexcept(noexcept(MapAdapter< ChainAdapter< Iter1, Iter2 >, Func >(GetDerived().begin(), GetDerived().end(), std::move(transform))))
 Transforms each element using the given function.
constexpr auto Take (size_t count) const noexcept(noexcept(TakeAdapter< ChainAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end(), count)))
 Limits the number of elements to at most count.
constexpr auto Skip (size_t count) const noexcept(noexcept(SkipAdapter< ChainAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end(), count)))
 Skips the first count elements.
constexpr auto TakeWhile (Pred predicate) const noexcept(noexcept(TakeWhileAdapter< ChainAdapter< Iter1, Iter2 >, Pred >(GetDerived().begin(), GetDerived().end(), std::move(predicate))))
 Takes elements while a predicate is true.
constexpr auto SkipWhile (Pred predicate) const noexcept(noexcept(SkipWhileAdapter< ChainAdapter< Iter1, Iter2 >, Pred >(GetDerived().begin(), GetDerived().end(), std::move(predicate))))
 Skips elements while a predicate is true.
constexpr auto Enumerate () const noexcept(noexcept(EnumerateAdapter< ChainAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end())))
 Adds an index to each element.
constexpr auto Inspect (Func inspector) const noexcept(noexcept(InspectAdapter< ChainAdapter< Iter1, Iter2 >, Func >(GetDerived().begin(), GetDerived().end(), std::move(inspector))))
 Observes each element without modifying it.
constexpr auto StepBy (size_t step) const noexcept(noexcept(StepByAdapter< ChainAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end(), step)))
 Takes every Nth element.
constexpr auto Chain (OtherIter begin, OtherIter end) const noexcept(noexcept(ChainAdapter< Derived, OtherIter >(GetDerived().begin(), GetDerived().end(), std::move(begin), std::move(end))))
 Chains another range after this one.
constexpr auto Reverse () const noexcept(noexcept(ReverseAdapter< ChainAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end())))
 Reverses the order of elements.
constexpr auto Slide (size_t window_size) const noexcept(noexcept(SlideAdapter< ChainAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end(), window_size)))
 Creates sliding windows over elements.
constexpr auto Stride (size_t stride) const noexcept(noexcept(StrideAdapter< ChainAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end(), stride)))
 Takes every Nth element with stride.
constexpr auto Zip (OtherIter begin, OtherIter end) const noexcept(noexcept(ZipAdapter< ChainAdapter< Iter1, Iter2 >, OtherIter >(GetDerived().begin(), GetDerived().end(), std::move(begin), std::move(end))))
 Zips another range with this one.
constexpr void ForEach (const Action &action) const
 Terminal operation: applies an action to each element.
constexpr T Fold (T init, const Folder &folder) const
 Terminal operation: reduces elements to a single value using a folder function.
constexpr auto Find (const Pred &predicate) const
 Terminal operation: finds the first element satisfying a predicate.
constexpr size_t CountIf (const Pred &predicate) const
 Terminal operation: counts elements satisfying a predicate.
constexpr auto Partition (const Pred &predicate) const
 Terminal operation: partitions elements into two groups based on a predicate.
constexpr auto PartitionWith (const Pred &predicate, Allocator allocator) const
 Terminal operation: partitions elements with a custom allocator.
constexpr auto MaxBy (const KeyFunc &key_func) const
 Terminal operation: finds the element with the maximum value according to a key function.
constexpr auto MinBy (const KeyFunc &key_func) const
 Terminal operation: finds the element with the minimum value according to a key function.
constexpr auto GroupBy (const KeyFunc &key_func) const
 Terminal operation: groups elements by a key function.
constexpr auto GroupByWith (const KeyFunc &key_func, MapAllocator map_allocator, ValueAllocator value_allocator) const
 Terminal operation: groups elements by key with custom allocators.
constexpr auto Collect () const
 Terminal operation: collects all elements into a vector.
constexpr auto CollectWith (Allocator allocator={}) const
 Terminal operation: collects all elements into a vector with a custom allocator.
constexpr void Into (OutIt out) const
 Terminal operation: writes all elements into an output iterator.
constexpr bool Any (const Pred &predicate) const
 Terminal operation: checks if any element satisfies a predicate.
constexpr bool All (const Pred &predicate) const
 Terminal operation: checks if all elements satisfy a predicate.
constexpr bool None (const Pred &predicate) const
 Terminal operation: checks if no elements satisfy a predicate.

Additional Inherited Members

Protected Member Functions inherited from helios::utils::FunctionalAdapterBase< ChainAdapter< Iter1, Iter2 > >
constexpr ChainAdapter< Iter1, Iter2 > & GetDerived () noexcept
 Gets reference to derived class instance.

Detailed Description

template<typename Iter1, typename Iter2>
requires ChainAdapterRequirements<Iter1, Iter2>
class helios::utils::ChainAdapter< Iter1, Iter2 >

Iterator adapter that chains two sequences together.

This adapter yields all elements from the first iterator, then all elements from the second iterator.

Template Parameters
Iter1First iterator type
Iter2Second iterator type
// Chain two `Health` queries together
auto chained = query1.Chain(query2);
chained.ForEach([](const Health& h) {
// Process health components from both queries
});

Definition at line 2058 of file functional_adapters.hpp.

Member Typedef Documentation

◆ difference_type

template<typename Iter1, typename Iter2>
using helios::utils::ChainAdapter< Iter1, Iter2 >::difference_type
Initial value:
std::common_type_t<std::iter_difference_t<Iter1>,
std::iter_difference_t<Iter2>>

Definition at line 2073 of file functional_adapters.hpp.

◆ iterator_category

template<typename Iter1, typename Iter2>
using helios::utils::ChainAdapter< Iter1, Iter2 >::iterator_category
Initial value:
std::conditional_t<details::IterYieldsReference<Iter1> &&
std::forward_iterator_tag, std::input_iterator_tag>
Checks if the iterator yields a genuine reference (lvalue ref), not a proxy/value.

Definition at line 2065 of file functional_adapters.hpp.

◆ iterator_concept

template<typename Iter1, typename Iter2>
using helios::utils::ChainAdapter< Iter1, Iter2 >::iterator_concept
Initial value:
std::conditional_t<details::IterYieldsReference<Iter1> &&
std::forward_iterator_tag, std::input_iterator_tag>

Definition at line 2061 of file functional_adapters.hpp.

◆ pointer

template<typename Iter1, typename Iter2>
using helios::utils::ChainAdapter< Iter1, Iter2 >::pointer = void

Definition at line 2072 of file functional_adapters.hpp.

◆ reference

template<typename Iter1, typename Iter2>
using helios::utils::ChainAdapter< Iter1, Iter2 >::reference = value_type

Definition at line 2071 of file functional_adapters.hpp.

◆ value_type

template<typename Iter1, typename Iter2>
using helios::utils::ChainAdapter< Iter1, Iter2 >::value_type = std::iter_value_t<Iter1>

Definition at line 2070 of file functional_adapters.hpp.

Constructor & Destructor Documentation

◆ ChainAdapter() [1/5]

template<typename Iter1, typename Iter2>
helios::utils::ChainAdapter< Iter1, Iter2 >::ChainAdapter ( Iter1 first_begin,
Iter1 first_end,
Iter2 second_begin,
Iter2 second_end )
inlineconstexprnoexcept

Constructs a chain adapter with two iterator ranges.

Parameters
first_beginStart of the first iterator range
first_endEnd of the first iterator range
second_beginStart of the second iterator range
second_endEnd of the second iterator range

Definition at line 2083 of file functional_adapters.hpp.

◆ ChainAdapter() [2/5]

template<typename Iter1, typename Iter2>
template<ExternalRange R1, ExternalRange R2>
requires ChainAdapterRequirements<std::ranges::iterator_t<R1>, std::ranges::iterator_t<R2>>
helios::utils::ChainAdapter< Iter1, Iter2 >::ChainAdapter ( R1 & first_range,
R2 & second_range )
inlineconstexprnoexcept

Constructs a chain adapter with the given ranges.

Template Parameters
R1The type of the first range
R2The type of the second range
Parameters
first_rangeThe first range to adapt
second_rangeThe second range to adapt

Definition at line 2105 of file functional_adapters.hpp.

◆ ChainAdapter() [3/5]

template<typename Iter1, typename Iter2>
template<ExternalRange R1, ExternalRange R2>
requires ChainAdapterRequirements<std::ranges::iterator_t<const R1>, std::ranges::iterator_t<const R2>>
helios::utils::ChainAdapter< Iter1, Iter2 >::ChainAdapter ( const R1 & first_range,
const R2 & second_range )
inlineconstexprnoexcept

Constructs a chain adapter with the given const ranges.

Template Parameters
R1The type of the first range
R2The type of the second range
Parameters
first_rangeThe first range to adapt
second_rangeThe second range to adapt

Definition at line 2124 of file functional_adapters.hpp.

◆ ChainAdapter() [4/5]

template<typename Iter1, typename Iter2>
helios::utils::ChainAdapter< Iter1, Iter2 >::ChainAdapter ( const ChainAdapter< Iter1, Iter2 > & ) const &&
constexprdefaultnoexcept

◆ ChainAdapter() [5/5]

template<typename Iter1, typename Iter2>
helios::utils::ChainAdapter< Iter1, Iter2 >::ChainAdapter ( ChainAdapter< Iter1, Iter2 > && ) const &&
constexprdefaultnoexcept

◆ ~ChainAdapter()

template<typename Iter1, typename Iter2>
helios::utils::ChainAdapter< Iter1, Iter2 >::~ChainAdapter ( ) &&
constexprdefaultnoexcept

Member Function Documentation

◆ begin()

template<typename Iter1, typename Iter2>
ChainAdapter helios::utils::ChainAdapter< Iter1, Iter2 >::begin ( ) const
inlinenodiscardconstexprnoexcept

Definition at line 2186 of file functional_adapters.hpp.

◆ end()

template<typename Iter1, typename Iter2>
requires ChainAdapterRequirements<Iter1, Iter2>
auto helios::utils::ChainAdapter< Iter1, Iter2 >::end ( ) const
nodiscardconstexprnoexcept

Definition at line 2274 of file functional_adapters.hpp.

◆ operator!=()

template<typename Iter1, typename Iter2>
bool helios::utils::ChainAdapter< Iter1, Iter2 >::operator!= ( const ChainAdapter< Iter1, Iter2 > & other) const
inlinenodiscardconstexprnoexcept

Definition at line 2180 of file functional_adapters.hpp.

◆ operator*()

template<typename Iter1, typename Iter2>
reference helios::utils::ChainAdapter< Iter1, Iter2 >::operator* ( ) const
inlinenodiscardconstexprnoexcept

Definition at line 2166 of file functional_adapters.hpp.

◆ operator++() [1/2]

template<typename Iter1, typename Iter2>
requires ChainAdapterRequirements<Iter1, Iter2>
auto helios::utils::ChainAdapter< Iter1, Iter2 >::operator++ ( )
constexprnoexcept

Definition at line 2219 of file functional_adapters.hpp.

◆ operator++() [2/2]

template<typename Iter1, typename Iter2>
requires ChainAdapterRequirements<Iter1, Iter2>
auto helios::utils::ChainAdapter< Iter1, Iter2 >::operator++ ( int )
nodiscardconstexprnoexcept

Definition at line 2239 of file functional_adapters.hpp.

◆ operator->()

template<typename Iter1, typename Iter2>
pointer helios::utils::ChainAdapter< Iter1, Iter2 >::operator-> ( ) const
delete

◆ operator=() [1/2]

template<typename Iter1, typename Iter2>
ChainAdapter & helios::utils::ChainAdapter< Iter1, Iter2 >::operator= ( ChainAdapter< Iter1, Iter2 > && ) &&
constexprdefaultnoexcept

◆ operator=() [2/2]

template<typename Iter1, typename Iter2>
ChainAdapter & helios::utils::ChainAdapter< Iter1, Iter2 >::operator= ( const ChainAdapter< Iter1, Iter2 > & ) &&
constexprdefaultnoexcept

◆ operator==()

template<typename Iter1, typename Iter2>
requires ChainAdapterRequirements<Iter1, Iter2>
bool helios::utils::ChainAdapter< Iter1, Iter2 >::operator== ( const ChainAdapter< Iter1, Iter2 > & other) const
nodiscardconstexprnoexcept

Definition at line 2249 of file functional_adapters.hpp.