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

#include <functional_adapters.hpp>

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

Public Types

using iterator_category = std::forward_iterator_tag
 
using value_type = std::iter_value_t< Iter1 >
 
using difference_type = std::common_type_t< std::iter_difference_t< Iter1 >, std::iter_difference_t< Iter2 > >
 
using pointer = value_type *
 
using reference = value_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.
 
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 value_type operator* () const noexcept(noexcept(*std::declval< const Iter1 & >()) &&noexcept(*std::declval< const Iter2 & >()))
 
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< ChainAdapter< Iter1, Iter2 >, OtherIter >(GetDerived().begin(), GetDerived().end(), std::move(begin), std::move(end))))
 Chains another range after this one.
 
constexpr auto Chain (R &range) const noexcept(noexcept(ChainAdapterFromRange(GetDerived(), range)))
 Chains another range after this one.
 
constexpr auto Chain (const R &range) const noexcept(noexcept(ChainAdapterFromRange(GetDerived(), range)))
 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 auto Zip (R &range) const noexcept(noexcept(ZipAdapterFromRange(GetDerived(), range)))
 Zips another range with this one.
 
constexpr auto Zip (const R &range) const noexcept(noexcept(ZipAdapterFromRange(GetDerived(), range)))
 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 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.
 
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 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 Collect () const
 Terminal operation: collects all elements into a vector.
 
constexpr void Into (OutIt out) const
 

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.
 
constexpr const ChainAdapter< Iter1, Iter2 > & GetDerived () const noexcept
 Gets const reference to derived class instance.
 

Detailed Description

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

Definition at line 1478 of file functional_adapters.hpp.

Member Typedef Documentation

◆ difference_type

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

◆ iterator_category

template<typename Iter1 , typename Iter2 >
using helios::utils::ChainAdapter< Iter1, Iter2 >::iterator_category = std::forward_iterator_tag

◆ pointer

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

◆ reference

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

◆ value_type

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

Constructor & Destructor Documentation

◆ ChainAdapter() [1/3]

template<typename Iter1 , typename Iter2 >
constexpr 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 1493 of file functional_adapters.hpp.

1497 : first_current_(std::move(first_begin)),
1498 first_end_(std::move(first_end)),
1499 second_current_(std::move(second_begin)),
1500 second_end_(std::move(second_end)),
1501 in_first_(first_current_ != first_end_) {}

◆ ChainAdapter() [2/3]

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

◆ ChainAdapter() [3/3]

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

◆ ~ChainAdapter()

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

Member Function Documentation

◆ begin()

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

◆ end()

template<typename Iter1 , typename Iter2 >
requires ChainAdapterRequirements<Iter1, Iter2>
constexpr auto helios::utils::ChainAdapter< Iter1, Iter2 >::end ( ) const
constexprnoexcept
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/utils/functional_adapters.hpp.

Definition at line 1603 of file functional_adapters.hpp.

1605 {
1606 auto end_iter = *this;
1607 end_iter.first_current_ = first_end_;
1608 end_iter.second_current_ = second_end_;
1609 end_iter.in_first_ = false;
1610 return end_iter;
1611}

◆ operator!=()

template<typename Iter1 , typename Iter2 >
constexpr bool helios::utils::ChainAdapter< Iter1, Iter2 >::operator!= ( const ChainAdapter< Iter1, Iter2 > &  other) const
inlineconstexprnoexcept
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/utils/functional_adapters.hpp.

Definition at line 1531 of file functional_adapters.hpp.

1532 {
1533 return !(*this == other);
1534 }

◆ operator*()

template<typename Iter1 , typename Iter2 >
constexpr value_type helios::utils::ChainAdapter< Iter1, Iter2 >::operator* ( ) const
inlineconstexprnoexcept
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/utils/functional_adapters.hpp.

Definition at line 1522 of file functional_adapters.hpp.

1523 {
1524 return in_first_ ? *first_current_ : *second_current_;
1525 }

◆ operator++() [1/2]

template<typename Iter1 , typename Iter2 >
requires ChainAdapterRequirements<Iter1, Iter2>
constexpr auto helios::utils::ChainAdapter< Iter1, Iter2 >::operator++ ( )
constexprnoexcept
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/utils/functional_adapters.hpp.

Definition at line 1554 of file functional_adapters.hpp.

1557 {
1558 if (in_first_) {
1559 ++first_current_;
1560 if (first_current_ == first_end_) {
1561 in_first_ = false;
1562 }
1563 } else {
1564 if (second_current_ != second_end_) {
1565 ++second_current_;
1566 }
1567 }
1568 return *this;
1569}

◆ operator++() [2/2]

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

Definition at line 1573 of file functional_adapters.hpp.

1574 {
1575 auto temp = *this;
1576 ++(*this);
1577 return temp;
1578}

◆ operator=() [1/2]

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

◆ operator=() [2/2]

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

◆ operator==()

template<typename Iter1 , typename Iter2 >
requires ChainAdapterRequirements<Iter1, Iter2>
constexpr bool helios::utils::ChainAdapter< Iter1, Iter2 >::operator== ( const ChainAdapter< Iter1, Iter2 > &  other) const
constexprnoexcept
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/utils/functional_adapters.hpp.

Definition at line 1582 of file functional_adapters.hpp.

1584 {
1585 // Check if both are at end (in second range and at second_end_)
1586 const bool this_at_end = !in_first_ && (second_current_ == second_end_);
1587 const bool other_at_end = !other.in_first_ && (other.second_current_ == other.second_end_);
1588
1589 if (this_at_end && other_at_end) {
1590 return true;
1591 }
1592
1593 // Otherwise, must be in same range at same position
1594 if (in_first_ != other.in_first_) {
1595 return false;
1596 }
1597
1598 return in_first_ ? (first_current_ == other.first_current_) : (second_current_ == other.second_current_);
1599}