CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
Iterator.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
10#include "Utility.hpp"
11
12#include <cassert>
13#include <stdexcept>
14
16
19 template<typename Generator> class Iterator {
20 private:
23
24 public:
26 using difference_type = std::ptrdiff_t;
29
32
35 if(mGenerator->done())
36 mGenerator = nullptr;
37 else
38 value_ = mGenerator->generate();
39 }
40
45 if(!mGenerator)
46 throw std::out_of_range("Iterator out of range!");
47 mGenerator->next();
48 if(mGenerator->done())
49 mGenerator = nullptr;
50 else
51 value_ = mGenerator->generate();
52 return *this;
53 }
54
57 const typename Iterator::value_type& operator*() const {
58 if(!mGenerator)
59 throw std::out_of_range("Iterator out of range!");
60 return value_;
61 }
62
65 const typename Iterator::value_type* operator->() const {
66 if(!mGenerator)
67 throw std::out_of_range("Iterator out of range!");
68 return &value_;
69 }
70
73 bool operator==(const Iterator& that) const noexcept { return mGenerator == that.mGenerator; }
74
75 bool operator!=(const Iterator& that) const noexcept { return mGenerator != that.mGenerator; }
76 };
77
79 template<typename Generator> Iterator<Generator> begin(Generator& generator) noexcept { return Iterator<Generator>{generator}; }
80
82 template<typename Generator> Iterator<Generator> end(const Generator&) noexcept { return Iterator<Generator>{}; }
83
84} // namespace CeresEngine::MeshGenerator
A generator represents a coroutine type that produces a sequence of values of type T,...
Definition Generator.hpp:50
decltype(std::declval< const Generator * >() ->generate()) Type
Definition Utility.hpp:18
An iterator that can be used to "drive" a generator.
Definition Iterator.hpp:19
const Iterator::value_type * operator->() const
Get pointer to the current generated value.
Definition Iterator.hpp:65
std::ptrdiff_t difference_type
Definition Iterator.hpp:26
value_type * pointer
Definition Iterator.hpp:27
bool operator==(const Iterator &that) const noexcept
Iterators are equal if both are out of range or both iterate the same generator.
Definition Iterator.hpp:73
const Iterator::value_type & operator*() const
Get reference to the current generated value.
Definition Iterator.hpp:57
typename GeneratedType< Generator >::Type value_type
Definition Iterator.hpp:25
GeneratedType< Generator >::Type value_
Definition Iterator.hpp:22
bool operator!=(const Iterator &that) const noexcept
Definition Iterator.hpp:75
Generator * mGenerator
Definition Iterator.hpp:21
Iterator(Generator &generator) noexcept
Iterator to the given generator.
Definition Iterator.hpp:34
Iterator & operator++()
Advance the iterator.
Definition Iterator.hpp:44
Iterator() noexcept
Creates a dummy end iterator.
Definition Iterator.hpp:31
value_type & reference
Definition Iterator.hpp:28
Definition AnyGenerator.hpp:12
Iterator< Generator > end(const Generator &) noexcept
Returns a dummy end iterator.
Definition Iterator.hpp:82
Iterator< Generator > begin(Generator &generator) noexcept
Will return an iterator to the generator.
Definition Iterator.hpp:79
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25