#pragma once #include #include #include "common_structure.hpp" #include "container/dynamic_bitset.hpp" /// forward declaration struct Point2D; struct Point3D; namespace detail { template struct deduce_vertex_type; template <> struct deduce_vertex_type<2> { using type = Point2D; }; template <> struct deduce_vertex_type<3> { using type = Point3D; }; } // namespace detail template using IAVertex = typename detail::deduce_vertex_type::type; template struct IAEdge; template <> struct IAEdge<2> { std::array vertices{INVALID_INDEX, INVALID_INDEX}; ///< ordered uint32_t supporting_plane{INVALID_INDEX}; uint32_t positive_face{INVALID_INDEX}; uint32_t negative_face{INVALID_INDEX}; }; template <> struct IAEdge<3> { std::array vertices{INVALID_INDEX, INVALID_INDEX}; ///< ordered std::array supporting_planes{INVALID_INDEX, INVALID_INDEX}; }; template struct IAFace; template <> struct IAFace<2> { small_vector_mp edges{}; ///< ordered small_dynamic_bitset_mp<> signs{}; ///< sign of implicit functions }; template <> struct IAFace<3> { small_vector_mp edges{}; ///< ordered uint32_t supporting_plane{INVALID_INDEX}; uint32_t positive_cell{INVALID_INDEX}; uint32_t negative_cell{INVALID_INDEX}; }; template struct IACell; template <> struct IACell<3> { small_vector_mp faces{}; ///< ordered small_dynamic_bitset_mp<> signs{}; ///< sign of implicit functions }; template struct IAComplex; template <> struct IAComplex<2> { small_vector_mp> vertices{}; small_vector_mp> edges{}; small_vector_mp> faces{}; }; template <> struct IAComplex<3> { small_vector_mp> vertices{}; small_vector_mp> edges{}; small_vector_mp> faces{}; small_vector_mp> cells{}; };