#pragma once #include #include "blobtree.h" #include "io.h" #include "primitive_descriptor.h" namespace detail { template struct primitive_type_info; template <> struct primitive_type_info { static constexpr primitive_type type = PRIMITIVE_TYPE_CONSTANT; }; template <> struct primitive_type_info { static constexpr primitive_type type = PRIMITIVE_TYPE_PLANE; }; template <> struct primitive_type_info { static constexpr primitive_type type = PRIMITIVE_TYPE_SPHERE; }; template <> struct primitive_type_info { static constexpr primitive_type type = PRIMITIVE_TYPE_CYLINDER; }; template <> struct primitive_type_info { static constexpr primitive_type type = PRIMITIVE_TYPE_CONE; }; template <> struct primitive_type_info { static constexpr primitive_type type = PRIMITIVE_TYPE_BOX; }; template <> struct primitive_type_info { static constexpr primitive_type type = PRIMITIVE_TYPE_MESH; }; template <> struct primitive_type_info { static constexpr primitive_type type = PRIMITIVE_TYPE_EXTRUDE_POLYLINE; }; template <> struct primitive_type_info { static constexpr primitive_type type = PRIMITIVE_TYPE_EXTRUDE_HELIXLINE; }; template static constexpr bool is_primitive_descriptor_t = std::is_same_v::type)>; } // namespace detail template >>>> static inline virtual_node_t make_primitive_node(T&& descriptor) { using value_type = std::remove_cv_t>; if constexpr (std::is_rvalue_reference_v) return blobtree_new_node_by_move(movable_descriptor_t{const_cast(&descriptor)}, detail::primitive_type_info::type); else return blobtree_new_node_by_copy(copyable_descriptor_t{const_cast(&descriptor)}, detail::primitive_type_info::type); } template >> static inline virtual_node_t make_primitive_node_by_copy(const T& descriptor) { return make_primitive_node(descriptor); } template >> static inline virtual_node_t make_primitive_node_by_move(const T& descriptor) { return make_primitive_node(std::move(descriptor)); } template >>>> static inline bool replace_primitive_node(const virtual_node_t& node, T&& descriptor) { using value_type = std::remove_cv_t>; if constexpr (std::is_rvalue_reference_v) return virtual_node_replace_primitive_by_move(node, movable_descriptor_t{const_cast(&descriptor)}, detail::primitive_type_info::type); else return virtual_node_replace_primitive_by_copy(node, copyable_descriptor_t{const_cast(&descriptor)}, detail::primitive_type_info::type); } template >> static inline bool replace_primitive_node_by_copy(const virtual_node_t& node, const T& descriptor) { return replace_primitive_node(node, descriptor); } template >> static inline virtual_node_t replace_primitive_node_by_move(const virtual_node_t& node, const T& descriptor) { return replace_primitive_node(node, std::move(descriptor)); }