Unravel Engine C++ Reference
Loading...
Searching...
No Matches
any_generator.hpp
Go to the documentation of this file.
1#ifndef GENERATOR_ANYGENERATOR_HPP
2#define GENERATOR_ANYGENERATOR_HPP
3
4#include <memory>
5
6namespace generator
7{
8
11template<typename T>
13{
14public:
15 template<typename generator>
16 any_generator(generator gen) : base_{new derived<generator>{std::move(gen)}}
17 {
18 }
19
20 any_generator(const any_generator& that) : base_{that.base_->clone()}
21 {
22 }
23
25
27 {
28 base_ = that.base_->clone();
29 return *this;
30 }
31
33
34 T generate() const
35 {
36 return base_->generate();
37 }
38
39 bool done() const noexcept
40 {
41 return base_->done();
42 }
43
44 void next()
45 {
46 base_->next();
47 }
48
49private:
50 class base
51 {
52 public:
53 virtual ~base() = default;
54 virtual std::unique_ptr<base> clone() const = 0;
55 virtual T generate() const = 0;
56 virtual bool done() const noexcept = 0;
57 virtual void next() = 0;
58 };
59
60 template<typename generator>
61 class derived : public base
62 {
63 public:
64 explicit derived(generator gen) : generator_{std::move(gen)}
65 {
66 }
67
68 std::unique_ptr<base> clone() const override
69 {
70 return std::unique_ptr<base>(new derived{generator_});
71 }
72
73 T generate() const override
74 {
75 return generator_.generate();
76 }
77
78 bool done() const noexcept override
79 {
80 return generator_.done();
81 }
82
83 void next() override
84 {
85 generator_.next();
86 }
87
88 private:
89 generator generator_;
90 };
91
92 std::unique_ptr<base> base_;
93};
94} // namespace generator
95
96#endif
any_generator & operator=(any_generator &&)=default
any_generator(const any_generator &that)
bool done() const noexcept
any_generator & operator=(const any_generator &that)
any_generator(any_generator &&)=default
utfchar32_t next(octet_iterator &it, octet_iterator end)
Definition checked.h:151