diff -r c93e4a1eaadb -r 232e7634cc8a src/model.h --- a/src/model.h Thu Jun 09 11:51:42 2022 +0300 +++ b/src/model.h Thu Jun 09 13:32:55 2022 +0300 @@ -47,6 +47,30 @@ struct Empty {}; +template +struct transfer_reference +{ + using type = std::remove_reference_t; +}; + +template +struct transfer_reference +{ + using type = std::remove_reference_t&; +}; + +template +struct transfer_reference +{ + using type = std::remove_reference_t&&; +}; + +template +using transfer_reference_t = typename transfer_reference::type; +static_assert(std::is_same_v, char>); +static_assert(std::is_same_v, char&>); +static_assert(std::is_same_v, char&&>); + using ModelElement = std::variant< Colored, Colored, @@ -57,6 +81,76 @@ Empty, ParseError>; +using PolygonElement = Colored>; + +template +struct remove_color { using type = T; }; + +template +struct remove_color> { using type = T; }; + +template +struct remove_color&> { using type = T&; }; + +template +struct remove_color&&> { using type = T&&; }; + +template +using remove_color_t = typename remove_color::type; + +template +constexpr remove_color_t extract_colored(T&& x) +{ + return static_cast>(x); +} + +template +constexpr auto visitPolygon( + std::function)> f1, + std::function)> f2, + std::function)> f3, + std::function)> f4, + T&& element) +{ + return std::visit(overloaded{f1, f2, f3, f4}, extract_colored(element)); +} + +template +constexpr void visitPoints(T&& element, Fn func) +{ + visitPolygon( + [&func](transfer_reference_t edge) + { + func(edge.p1); + func(edge.p2); + }, + [&func](transfer_reference_t& tri) + { + func(tri.p1); + func(tri.p2); + func(tri.p3); + }, + [&func](transfer_reference_t& quad) + { + func(quad.p1); + func(quad.p2); + func(quad.p3); + func(quad.p4); + }, + [&func](transfer_reference_t& cedge) + { + func(cedge.p1); + func(cedge.p2); + func(cedge.c1); + func(cedge.c2); + }, + element); +} + QString modelElementToString(const ModelElement& element); struct ModelId {