Unravel Engine C++ Reference
Loading...
Searching...
No Matches
merge_shape.hpp
Go to the documentation of this file.
1#ifndef GENERATOR_MERGESHAPE_HPP
2#define GENERATOR_MERGESHAPE_HPP
3
4#include "empty_shape.hpp"
5#include "shape_vertex.hpp"
6#include "utils.hpp"
7
8namespace generator
9{
10
12template<typename... shape_t>
13class merge_shape_t; // undefined
14
15template<>
17{
18};
19
20template<typename Head, typename... Tail>
21class merge_shape_t<Head, Tail...>
22{
23public:
24 class edges_t
25 {
26 public:
28 {
29 if(!head_.done())
30 return head_.generate();
31
32 edge_t edge = tail_.generate();
33 edge.vertices += head_vertex_count_;
34 return edge;
35 }
36
37 bool done() const noexcept
38 {
39 return all_done_;
40 }
41
42 void next()
43 {
44 if(!head_.done())
45 head_.next();
46 else
47 tail_.next();
48
49 all_done_ = tail_.done() && head_.done();
50 }
51
52 private:
54 typename edge_generator_type<merge_shape_t<Tail...>>::type tail_;
55
56 int head_vertex_count_;
57
58 bool all_done_;
59
60 explicit edges_t(const merge_shape_t& shape)
61 : head_{shape.head_.edges()}
62 , tail_(shape.tail_.edges())
63 , head_vertex_count_{count(shape.head_.vertices())}
64 , all_done_{tail_.done() && head_.done()}
65 {
66 }
67
68 friend class merge_shape_t<Head, Tail...>;
69 };
70
72 {
73 public:
75 {
76 if(!head_.done())
77 return head_.generate();
78 return tail_.generate();
79 }
80
81 bool done() const noexcept
82 {
83 return all_done_;
84 }
85
86 void next()
87 {
88 if(!head_.done())
89 head_.next();
90 else
91 tail_.next();
92
93 all_done_ = tail_.done() && head_.done();
94 }
95
96 private:
98 typename vertex_generator_type<merge_shape_t<Tail...>>::type tail_;
99 bool all_done_;
100
101 explicit vertices_t(const merge_shape_t& shape)
102 : head_{shape.head_.vertices()}
103 , tail_(shape.tail_.vertices())
104 , all_done_{tail_.done() && head_.done()}
105 {
106 }
107
108 friend class merge_shape_t<Head, Tail...>;
109 };
110
111 merge_shape_t(Head head, Tail... tail) : head_{head}, tail_{tail...}
112 {
113 }
114
115 edges_t edges() const noexcept
116 {
117 return edges_t{*this};
118 }
119
120 vertices_t vertices() const noexcept
121 {
122 return vertices_t{*this};
123 }
124
125private:
126 Head head_;
127 merge_shape_t<Tail...> tail_;
128};
129
130template<typename... shape_t>
131merge_shape_t<shape_t...> merge_shape(shape_t... shapes)
132{
133 return merge_shape_t<shape_t...>{std::move(shapes)...};
134}
135} // namespace generator
136
137#endif
manifold_type type
gml::ivec2 vertices
Definition edge.hpp:12
Empty shape with zero vertices and edges.
vertices_t vertices() const noexcept
Merges (concatenates) multiple shapes together.
merge_shape_t< shape_t... > merge_shape(shape_t... shapes)
int count(const generator_t &generator) noexcept
Counts the number of steps left in the generator.
Definition utils.hpp:70