Unravel Engine C++ Reference
Loading...
Searching...
No Matches
iterator.hpp
Go to the documentation of this file.
1#ifndef GENERATOR_ITERATOR_HPP
2#define GENERATOR_ITERATOR_HPP
3
4#include <cassert>
5#include <stdexcept>
6#include <type_traits>
7#include <utility>
8
9#include "utils.hpp"
10
11namespace generator
12{
13
16template<typename generator_t, typename = std::void_t<decltype(std::declval<const generator_t>().generate())>>
18{
19private:
20 generator_t* generator_;
21
23
24public:
25 using iterator_category = std::input_iterator_tag;
26
28
29 using difference_type = std::ptrdiff_t;
30
32
34
36 gen_iterator_t() noexcept : generator_{nullptr}, value_{}
37 {
38 }
39
41 gen_iterator_t(generator_t& generator) noexcept : generator_{&generator}, value_{}
42 {
43 if(generator_->done())
44 generator_ = nullptr;
45 else
46 value_ = generator_->generate();
47 }
48
53 {
54 if(!generator_)
55 throw std::out_of_range("Iterator out of range!");
56 generator_->next();
57 if(generator_->done())
58 generator_ = nullptr;
59 else
60 value_ = generator_->generate();
61 return *this;
62 }
63
66 const typename gen_iterator_t::value_type& operator*() const
67 {
68 if(!generator_)
69 throw std::out_of_range("Iterator out of range!");
70 return value_;
71 }
72
75 const typename gen_iterator_t::value_type* operator->() const
76 {
77 if(!generator_)
78 throw std::out_of_range("Iterator out of range!");
79 return &value_;
80 }
81
84 bool operator==(const gen_iterator_t& that) const noexcept
85 {
86 return generator_ == that.generator_;
87 }
88
89 bool operator!=(const gen_iterator_t& that) const noexcept
90 {
91 return generator_ != that.generator_;
92 }
93};
94
96template<typename generator_t, typename = std::void_t<decltype(std::declval<const generator_t>().generate())>>
101
103template<typename generator_t, typename = std::void_t<decltype(std::declval<const generator_t>().generate())>>
104gen_iterator_t<generator_t> end(const generator_t&) noexcept
105{
107}
108} // namespace generator
109
110#endif
const gen_iterator_t::value_type & operator*() const
Definition iterator.hpp:66
gen_iterator_t(generator_t &generator) noexcept
Iterator to the given generator.
Definition iterator.hpp:41
std::input_iterator_tag iterator_category
Definition iterator.hpp:25
typename generated_type< generator_t >::type value_type
Definition iterator.hpp:27
bool operator==(const gen_iterator_t &that) const noexcept
Definition iterator.hpp:84
const gen_iterator_t::value_type * operator->() const
Definition iterator.hpp:75
gen_iterator_t() noexcept
Creates a dummy end iterator.
Definition iterator.hpp:36
std::ptrdiff_t difference_type
Definition iterator.hpp:29
gen_iterator_t & operator++()
Definition iterator.hpp:52
bool operator!=(const gen_iterator_t &that) const noexcept
Definition iterator.hpp:89
gen_iterator_t< generator_t > begin(generator_t &generator) noexcept
Will return an iterator to the generator.
Definition iterator.hpp:97
gen_iterator_t< generator_t > end(const generator_t &) noexcept
Returns a dummy end iterator.
Definition iterator.hpp:104