45 QString code; |
45 QString code; |
46 }; |
46 }; |
47 |
47 |
48 struct Empty {}; |
48 struct Empty {}; |
49 |
49 |
50 template<typename T, typename R> |
|
51 struct transfer_reference |
|
52 { |
|
53 using type = std::remove_reference_t<R>; |
|
54 }; |
|
55 |
|
56 template<typename T, typename R> |
|
57 struct transfer_reference<T&, R> |
|
58 { |
|
59 using type = std::remove_reference_t<R>&; |
|
60 }; |
|
61 |
|
62 template<typename T, typename R> |
|
63 struct transfer_reference<const T&, R> |
|
64 { |
|
65 using type = const std::remove_reference_t<R>&; |
|
66 }; |
|
67 |
|
68 template<typename T, typename R> |
|
69 struct transfer_reference<T&&, R> |
|
70 { |
|
71 using type = std::remove_reference_t<R>&&; |
|
72 }; |
|
73 |
|
74 template<typename T, typename R> |
|
75 using transfer_reference_t = typename transfer_reference<T, R>::type; |
|
76 static_assert(std::is_same_v<transfer_reference_t<int, char>, char>); |
|
77 static_assert(std::is_same_v<transfer_reference_t<int&, char>, char&>); |
|
78 static_assert(std::is_same_v<transfer_reference_t<int&&, char>, char&&>); |
|
79 |
|
80 using ModelElement = std::variant< |
50 using ModelElement = std::variant< |
81 Colored<SubfileReference>, |
51 Colored<SubfileReference>, |
82 Colored<LineSegment>, |
52 Colored<LineSegment>, |
83 Colored<Triangle>, |
53 Colored<Triangle>, |
84 Colored<Quadrilateral>, |
54 Colored<Quadrilateral>, |
140 |
110 |
141 template<typename T, typename Fn> |
111 template<typename T, typename Fn> |
142 constexpr void visitPoints(Fn&& func, T&& element) |
112 constexpr void visitPoints(Fn&& func, T&& element) |
143 { |
113 { |
144 visitPolygon<void>( |
114 visitPolygon<void>( |
145 [&func](transfer_reference_t<T&&, LineSegment> edge) |
115 [&func](transfer_cvref_t<T&&, LineSegment> edge) |
146 { |
116 { |
147 func(edge.p1); |
117 func(edge.p1); |
148 func(edge.p2); |
118 func(edge.p2); |
149 }, |
119 }, |
150 [&func](transfer_reference_t<T&&, Triangle>& tri) |
120 [&func](transfer_cvref_t<T&&, Triangle>& tri) |
151 { |
121 { |
152 func(tri.p1); |
122 func(tri.p1); |
153 func(tri.p2); |
123 func(tri.p2); |
154 func(tri.p3); |
124 func(tri.p3); |
155 }, |
125 }, |
156 [&func](transfer_reference_t<T&&, Quadrilateral>& quad) |
126 [&func](transfer_cvref_t<T&&, Quadrilateral>& quad) |
157 { |
127 { |
158 func(quad.p1); |
128 func(quad.p1); |
159 func(quad.p2); |
129 func(quad.p2); |
160 func(quad.p3); |
130 func(quad.p3); |
161 func(quad.p4); |
131 func(quad.p4); |
162 }, |
132 }, |
163 [&func](transfer_reference_t<T&&, ConditionalEdge>& cedge) |
133 [&func](transfer_cvref_t<T&&, ConditionalEdge>& cedge) |
164 { |
134 { |
165 func(cedge.p1); |
135 func(cedge.p1); |
166 func(cedge.p2); |
136 func(cedge.p2); |
167 func(cedge.c1); |
137 func(cedge.c1); |
168 func(cedge.c2); |
138 func(cedge.c2); |