src/model.h

changeset 218
63125c36de73
parent 212
27259810da6d
child 232
8efa3a33172e
equal deleted inserted replaced
217:6d95c1a41e6e 218:63125c36de73
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);

mercurial