rust style iterators

v1
Brett 2024-09-25 20:52:22 -04:00
parent a27651b21d
commit 329eeb174b
2 changed files with 78 additions and 61 deletions

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.20) cmake_minimum_required(VERSION 3.20)
include(cmake/color.cmake) include(cmake/color.cmake)
set(BLT_VERSION 0.21.1) set(BLT_VERSION 0.21.2)
set(BLT_TEST_VERSION 0.0.1) set(BLT_TEST_VERSION 0.0.1)
set(BLT_TARGET BLT) set(BLT_TARGET BLT)

View File

@ -20,6 +20,7 @@
#define BLT_ITERATOR_H #define BLT_ITERATOR_H
#include <blt/std/types.h> #include <blt/std/types.h>
#include <blt/std/logging.h>
#include <blt/meta/meta.h> #include <blt/meta/meta.h>
#include <blt/meta/iterator.h> #include <blt/meta/iterator.h>
#include <type_traits> #include <type_traits>
@ -74,47 +75,34 @@ namespace blt
{ {
return m_iter2; return m_iter2;
} }
protected: protected:
Iter1 m_iter1; Iter1 m_iter1;
Iter2 m_iter2; Iter2 m_iter2;
}; };
template<typename Iter> template<typename Iter>
class enumerate_iterator_base class enumerate_iterator_base : public pair_iterator_base<Iter, blt::size_t>
{ {
public: public:
explicit enumerate_iterator_base(Iter iter, blt::size_t place = 0): iter(std::move(iter)), index(place) explicit enumerate_iterator_base(Iter iter, blt::size_t place = 0):
pair_iterator_base<Iter, blt::size_t>(std::move(iter), place)
{} {}
enumerate_item<blt::meta::deref_return_t<Iter>> operator*() const enumerate_item<blt::meta::deref_return_t<Iter>> operator*() const
{ {
return {index, *this->iter}; return {this->m_iter2, *this->m_iter1};
}
friend bool operator==(const enumerate_iterator_base& a, const enumerate_iterator_base& b)
{
return a.iter == b.iter;
}
friend bool operator!=(const enumerate_iterator_base& a, const enumerate_iterator_base& b)
{
return a.iter != b.iter;
} }
auto base() const auto base() const
{ {
return iter; return this->iter1();
} }
auto get_index() const auto get_index() const
{ {
return index; return this->iter2();
} }
protected:
Iter iter;
blt::size_t index;
}; };
template<typename Iter> template<typename Iter>
@ -125,8 +113,8 @@ namespace blt
enumerate_forward_iterator& operator++() enumerate_forward_iterator& operator++()
{ {
++this->iter; ++this->m_iter1;
++this->index; ++this->m_iter2;
return *this; return *this;
} }
@ -146,8 +134,8 @@ namespace blt
enumerate_bidirectional_iterator& operator--() enumerate_bidirectional_iterator& operator--()
{ {
--this->iter; --this->m_iter1;
--this->index; --this->m_iter2;
return *this; return *this;
} }
@ -220,14 +208,12 @@ namespace blt
public: public:
explicit enumerator_reversible(Iter begin, Iter end, blt::size_t container_size): explicit enumerator_reversible(Iter begin, Iter end, blt::size_t container_size):
enumerator_base<Iter, IterWrapper>{IterWrapper{enumerate_wrapper<Iter>{std::move(begin), 0}}, enumerator_base<Iter, IterWrapper>{IterWrapper{enumerate_wrapper<Iter>{std::move(begin), 0}},
IterWrapper{enumerate_wrapper<Iter>{std::move(end), container_size}}}, IterWrapper{enumerate_wrapper<Iter>{std::move(end), container_size}}}
container_size(container_size)
{} {}
explicit enumerator_reversible(Iter begin, Iter end, blt::size_t begin_index, blt::size_t end_index, blt::size_t container_size): explicit enumerator_reversible(Iter begin, Iter end, blt::size_t begin_index, blt::size_t end_index):
enumerator_base<Iter, IterWrapper>(IterWrapper{enumerate_wrapper<Iter>{std::move(begin), begin_index}}, enumerator_base<Iter, IterWrapper>(IterWrapper{enumerate_wrapper<Iter>{std::move(begin), begin_index}},
IterWrapper{enumerate_wrapper<Iter>{std::move(end), end_index}}), IterWrapper{enumerate_wrapper<Iter>{std::move(end), end_index}})
container_size(container_size)
{} {}
auto rev() const auto rev() const
@ -235,24 +221,30 @@ namespace blt
return enumerator_rev<Iter>{this->end_.base(), return enumerator_rev<Iter>{this->end_.base(),
this->begin_.base(), this->begin_.base(),
this->end_.get_index(), this->end_.get_index(),
this->begin_.get_index(), this->begin_.get_index()};
this->container_size};
} }
auto skip(blt::size_t offset) auto skip(blt::size_t amount)
{ {
auto begin = this->begin(); auto begin = this->begin_;
for (blt::size_t i = 0; i < offset; i++) for (blt::size_t i = 0; i < amount; i++)
++begin; ++begin;
return enumerator<Iter>{begin.base(), return enumerator<Iter>{begin.base(),
this->end_.base(), this->end_.base(),
begin.get_index(), begin.get_index(),
this->end_.get_index(), this->end_.get_index()};
this->container_size}; }
auto take(blt::size_t amount)
{
auto end = this->begin();
for (blt::size_t i = 0; i < amount; i++)
++end;
return enumerator<Iter>{this->begin_.base(),
end.base(),
this->begin_.get_index(),
end.get_index()};
} }
protected:
blt::size_t container_size;
}; };
template<typename Iter, typename IterWrapper> template<typename Iter, typename IterWrapper>
@ -266,20 +258,30 @@ namespace blt
return enumerator<Iter>{this->end_.base().base(), return enumerator<Iter>{this->end_.base().base(),
this->begin_.base().base(), this->begin_.base().base(),
this->end_.base().get_index(), this->end_.base().get_index(),
this->begin_.base().get_index(), this->begin_.base().get_index()};
this->container_size};
} }
auto skip(blt::size_t offset) auto skip(blt::size_t amount)
{ {
auto begin = this->begin(); auto begin = this->begin_.base();
for (blt::size_t i = 0; i < offset; i++) for (blt::size_t i = 0; i < amount; i++)
--begin; --begin;
return enumerator<Iter>{begin.base(), return enumerator_rev<Iter>{begin.base(),
this->end_.base(), this->end_.base().base(),
begin.get_index(), begin.get_index(),
this->end_.get_index(), this->end_.base().get_index()};
this->container_size}; }
auto take(blt::size_t amount)
{
auto end = this->begin_.base();
for (blt::size_t i = 0; i < amount; i++)
--end;
return enumerator_rev<Iter>{
this->begin_.base().base(),
end.base(),
this->begin_.base().get_index(),
end.get_index()};
} }
}; };
} }
@ -306,14 +308,21 @@ namespace blt
{ {
public: public:
using iterator::enumerator_reversible<Iter, iterator::enumerate_wrapper<Iter>>::enumerator_reversible; using iterator::enumerator_reversible<Iter, iterator::enumerate_wrapper<Iter>>::enumerator_reversible;
auto skip(blt::size_t offset) auto skip(blt::size_t amount)
{ {
return enumerator<Iter>{this->begin_.base() + offset, return enumerator<Iter>{this->begin_.base() + amount,
this->end_.base(), this->end_.base(),
this->begin_.get_index() + offset, this->begin_.get_index() + amount,
this->end_.get_index(), this->end_.get_index()};
this->container_size}; }
auto take(blt::size_t amount)
{
return enumerator<Iter>{this->begin_.base(),
this->begin_.base() + amount,
this->begin_.get_index(),
this->begin_.get_index() + amount};
} }
}; };
@ -331,13 +340,21 @@ namespace blt
{ {
public: public:
using iterator::enumerator_reversible_rev<Iter, std::reverse_iterator<iterator::enumerate_wrapper<Iter>>>::enumerator_reversible_rev; using iterator::enumerator_reversible_rev<Iter, std::reverse_iterator<iterator::enumerate_wrapper<Iter>>>::enumerator_reversible_rev;
auto skip(blt::size_t offset) auto skip(blt::size_t amount)
{ {
return enumerator_rev<Iter>{this->begin_.base().base() - offset, return enumerator_rev<Iter>{this->begin_.base().base() - amount,
this->end_.base().base(), this->end_.base().base(),
this->begin_.base().get_index() - offset, this->begin_.base().get_index() - amount,
this->end_.base().get_index(), this->container_size}; this->end_.base().get_index()};
}
auto take(blt::size_t amount)
{
return enumerator_rev<Iter>{this->begin_.base().base(),
this->begin_.base().base() - amount,
this->begin_.base().get_index(),
this->begin_.base().get_index() - amount};
} }
}; };