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

Adapter that combines two ranges into pairs. More...

#include <functional_adapters.hpp>

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

Public Types

using iterator_concept = std::input_iterator_tag
using iterator_category = std::input_iterator_tag
using value_type
using reference = value_type
using pointer = void
using difference_type = ptrdiff_t

Public Member Functions

constexpr ZipAdapter (Iter1 begin1, Iter1 end1, Iter2 begin2, Iter2 end2) noexcept(std::is_nothrow_move_constructible_v< Iter1 > &&std::is_nothrow_copy_constructible_v< Iter1 > &&std::is_nothrow_move_constructible_v< Iter2 > &&std::is_nothrow_copy_constructible_v< Iter2 >)
 Constructs a zip adapter.
template<ExternalRange R1, ExternalRange R2>
requires ZipAdapterRequirements<std::ranges::iterator_t<R1>, std::ranges::iterator_t<R2>>
constexpr ZipAdapter (R1 &first_range, R2 &second_range) noexcept(noexcept(ZipAdapter(std::ranges::begin(first_range), std::ranges::end(first_range), std::ranges::begin(second_range), std::ranges::end(second_range))))
template<ExternalRange R1, ExternalRange R2>
requires ZipAdapterRequirements<std::ranges::iterator_t<const R1>, std::ranges::iterator_t<const R2>>
constexpr ZipAdapter (const R1 &first_range, const R2 &second_range) noexcept(noexcept(ZipAdapter(std::ranges::cbegin(first_range), std::ranges::cend(first_range), std::ranges::cbegin(second_range), std::ranges::cend(second_range))))
constexpr ZipAdapter (const ZipAdapter &) noexcept(std::is_nothrow_copy_constructible_v< Iter1 > &&std::is_nothrow_copy_constructible_v< Iter2 >)=default
constexpr ZipAdapter (ZipAdapter &&) noexcept(std::is_nothrow_move_constructible_v< Iter1 > &&std::is_nothrow_move_constructible_v< Iter2 >)=default
constexpr ~ZipAdapter () noexcept(std::is_nothrow_destructible_v< Iter1 > &&std::is_nothrow_destructible_v< Iter2 >)=default
constexpr ZipAdapteroperator= (const ZipAdapter &) noexcept(std::is_nothrow_copy_assignable_v< Iter1 > &&std::is_nothrow_copy_assignable_v< Iter2 >)=default
constexpr ZipAdapteroperator= (ZipAdapter &&) noexcept(std::is_nothrow_move_assignable_v< Iter1 > &&std::is_nothrow_move_assignable_v< Iter2 >)=default
constexpr ZipAdapteroperator++ () noexcept(noexcept(std::declval< Iter1 & >() !=std::declval< Iter1 & >()) &&noexcept(++std::declval< Iter1 & >()) &&noexcept(std::declval< Iter2 & >() !=std::declval< Iter2 & >()) &&noexcept(++std::declval< Iter2 & >()))
constexpr ZipAdapter operator++ (int) noexcept(std::is_nothrow_copy_constructible_v< ZipAdapter > &&noexcept(++std::declval< ZipAdapter & >()))
constexpr reference operator* () const
pointer operator-> () const =delete
constexpr bool operator== (const ZipAdapter &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 ZipAdapter &other) const noexcept(noexcept(std::declval< const ZipAdapter & >()==std::declval< const ZipAdapter & >()))
constexpr bool IsAtEnd () const noexcept(noexcept(std::declval< const Iter1 & >()==std::declval< const Iter1 & >()) &&noexcept(std::declval< const Iter2 & >()==std::declval< const Iter2 & >()))
constexpr ZipAdapter begin () const noexcept(std::is_nothrow_copy_constructible_v< ZipAdapter >)
constexpr ZipAdapter end () const noexcept(std::is_nothrow_copy_constructible_v< ZipAdapter >)
Public Member Functions inherited from helios::utils::FunctionalAdapterBase< ZipAdapter< Iter1, Iter2 > >
constexpr auto Filter (Pred predicate) const noexcept(noexcept(FilterAdapter< ZipAdapter< 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< ZipAdapter< 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< ZipAdapter< 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< ZipAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end(), count)))
 Skips the first count elements.
constexpr auto TakeWhile (Pred predicate) const noexcept(noexcept(TakeWhileAdapter< ZipAdapter< 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< ZipAdapter< Iter1, Iter2 >, Pred >(GetDerived().begin(), GetDerived().end(), std::move(predicate))))
 Skips elements while a predicate is true.
constexpr auto Enumerate () const noexcept(noexcept(EnumerateAdapter< ZipAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end())))
 Adds an index to each element.
constexpr auto Inspect (Func inspector) const noexcept(noexcept(InspectAdapter< ZipAdapter< 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< ZipAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end(), step)))
 Takes every Nth element.
constexpr auto Chain (OtherIter begin, OtherIter end) const noexcept(noexcept(ChainAdapter< ZipAdapter< Iter1, Iter2 >, OtherIter >(GetDerived().begin(), GetDerived().end(), std::move(begin), std::move(end))))
 Chains another range after this one.
constexpr auto Reverse () const noexcept(noexcept(ReverseAdapter< ZipAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end())))
 Reverses the order of elements.
constexpr auto Slide (size_t window_size) const noexcept(noexcept(SlideAdapter< ZipAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end(), window_size)))
 Creates sliding windows over elements.
constexpr auto Stride (size_t stride) const noexcept(noexcept(StrideAdapter< ZipAdapter< Iter1, Iter2 > >(GetDerived().begin(), GetDerived().end(), stride)))
 Takes every Nth element with stride.
constexpr auto Zip (OtherIter begin, OtherIter end) const noexcept(noexcept(ZipAdapter< Derived, 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< ZipAdapter< Iter1, Iter2 > >
constexpr ZipAdapter< Iter1, Iter2 > & GetDerived () noexcept
 Gets reference to derived class instance.

Detailed Description

template<typename Iter1, typename Iter2>
requires ZipAdapterRequirements<Iter1, Iter2>
class helios::utils::ZipAdapter< Iter1, Iter2 >

Adapter that combines two ranges into pairs.

Iterates both ranges in parallel, yielding tuples of corresponding elements. Stops when either range is exhausted.

Template Parameters
Iter1Type of the first iterator
Iter2Type of the second iterator
std::vector<int> ids = {1, 2, 3};
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
auto zipped = ZipAdapterFromRange(ids, names);
for (const auto& [id, name] : zipped) {
std::cout << id << ": " << name << "\n";
}
// Output:
// 1: Alice
// 2: Bob
// 3: Charlie

Definition at line 3400 of file functional_adapters.hpp.

Member Typedef Documentation

◆ difference_type

template<typename Iter1, typename Iter2>
using helios::utils::ZipAdapter< Iter1, Iter2 >::difference_type = ptrdiff_t

Definition at line 3409 of file functional_adapters.hpp.

◆ iterator_category

template<typename Iter1, typename Iter2>
using helios::utils::ZipAdapter< Iter1, Iter2 >::iterator_category = std::input_iterator_tag

Definition at line 3404 of file functional_adapters.hpp.

◆ iterator_concept

template<typename Iter1, typename Iter2>
using helios::utils::ZipAdapter< Iter1, Iter2 >::iterator_concept = std::input_iterator_tag

Definition at line 3403 of file functional_adapters.hpp.

◆ pointer

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

Definition at line 3408 of file functional_adapters.hpp.

◆ reference

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

Definition at line 3407 of file functional_adapters.hpp.

◆ value_type

template<typename Iter1, typename Iter2>
using helios::utils::ZipAdapter< Iter1, Iter2 >::value_type
Initial value:
std::tuple<std::iter_value_t<Iter1>, std::iter_value_t<Iter2>>

Definition at line 3405 of file functional_adapters.hpp.

Constructor & Destructor Documentation

◆ ZipAdapter() [1/5]

template<typename Iter1, typename Iter2>
helios::utils::ZipAdapter< Iter1, Iter2 >::ZipAdapter ( Iter1 begin1,
Iter1 end1,
Iter2 begin2,
Iter2 end2 )
inlineconstexprnoexcept

Constructs a zip adapter.

Parameters
begin1Iterator to the beginning of the first range
end1Iterator to the end of the first range
begin2Iterator to the beginning of the second range
end2Iterator to the end of the second range

Definition at line 3418 of file functional_adapters.hpp.

◆ ZipAdapter() [2/5]

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

Definition at line 3434 of file functional_adapters.hpp.

◆ ZipAdapter() [3/5]

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

Definition at line 3445 of file functional_adapters.hpp.

◆ ZipAdapter() [4/5]

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

◆ ZipAdapter() [5/5]

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

◆ ~ZipAdapter()

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

Member Function Documentation

◆ begin()

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

Definition at line 3509 of file functional_adapters.hpp.

◆ end()

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

Definition at line 3567 of file functional_adapters.hpp.

◆ IsAtEnd()

template<typename Iter1, typename Iter2>
bool helios::utils::ZipAdapter< Iter1, Iter2 >::IsAtEnd ( ) const
inlinenodiscardconstexprnoexcept

Definition at line 3503 of file functional_adapters.hpp.

◆ operator!=()

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

Definition at line 3497 of file functional_adapters.hpp.

◆ operator*()

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

Definition at line 3482 of file functional_adapters.hpp.

◆ operator++() [1/2]

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

Definition at line 3541 of file functional_adapters.hpp.

◆ operator++() [2/2]

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

Definition at line 3557 of file functional_adapters.hpp.

◆ operator->()

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

◆ operator=() [1/2]

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

◆ operator=() [2/2]

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

◆ operator==()

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

Definition at line 3488 of file functional_adapters.hpp.