--- a/src/model.h Tue Jun 14 17:55:50 2022 +0300 +++ b/src/model.h Tue Jun 14 19:50:31 2022 +0300 @@ -47,36 +47,6 @@ struct Empty {}; -template<typename T, typename R> -struct transfer_reference -{ - using type = std::remove_reference_t<R>; -}; - -template<typename T, typename R> -struct transfer_reference<T&, R> -{ - using type = std::remove_reference_t<R>&; -}; - -template<typename T, typename R> -struct transfer_reference<const T&, R> -{ - using type = const std::remove_reference_t<R>&; -}; - -template<typename T, typename R> -struct transfer_reference<T&&, R> -{ - using type = std::remove_reference_t<R>&&; -}; - -template<typename T, typename R> -using transfer_reference_t = typename transfer_reference<T, R>::type; -static_assert(std::is_same_v<transfer_reference_t<int, char>, char>); -static_assert(std::is_same_v<transfer_reference_t<int&, char>, char&>); -static_assert(std::is_same_v<transfer_reference_t<int&&, char>, char&&>); - using ModelElement = std::variant< Colored<SubfileReference>, Colored<LineSegment>, @@ -142,25 +112,25 @@ constexpr void visitPoints(Fn&& func, T&& element) { visitPolygon<void>( - [&func](transfer_reference_t<T&&, LineSegment> edge) + [&func](transfer_cvref_t<T&&, LineSegment> edge) { func(edge.p1); func(edge.p2); }, - [&func](transfer_reference_t<T&&, Triangle>& tri) + [&func](transfer_cvref_t<T&&, Triangle>& tri) { func(tri.p1); func(tri.p2); func(tri.p3); }, - [&func](transfer_reference_t<T&&, Quadrilateral>& quad) + [&func](transfer_cvref_t<T&&, Quadrilateral>& quad) { func(quad.p1); func(quad.p2); func(quad.p3); func(quad.p4); }, - [&func](transfer_reference_t<T&&, ConditionalEdge>& cedge) + [&func](transfer_cvref_t<T&&, ConditionalEdge>& cedge) { func(cedge.p1); func(cedge.p2);