mirror of https://github.com/CGAL/cgal
parent
ae18495c56
commit
6fd4a023c5
|
|
@ -48,9 +48,52 @@
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
namespace internal {
|
namespace Orthtree_impl {
|
||||||
|
|
||||||
BOOST_MPL_HAS_XXX_TRAIT_DEF(Node_data)
|
BOOST_MPL_HAS_XXX_TRAIT_DEF(Node_data)
|
||||||
}
|
|
||||||
|
template <class GT, bool has_data>
|
||||||
|
struct Node_data_wrapper;
|
||||||
|
|
||||||
|
template <class GT>
|
||||||
|
struct Node_data_wrapper<GT, true>
|
||||||
|
{
|
||||||
|
using Node_index = typename GT::Node_index;
|
||||||
|
using Node_data = typename GT::Node_data;
|
||||||
|
Properties::Experimental::Property_array_handle<Node_index, Node_data> m_node_contents;
|
||||||
|
|
||||||
|
template <class Property_container>
|
||||||
|
Node_data_wrapper(Property_container& node_properties)
|
||||||
|
: m_node_contents(node_properties.template get_or_add_property<Node_data>("contents").first)
|
||||||
|
{}
|
||||||
|
|
||||||
|
const Node_data& operator[](Node_index n) const
|
||||||
|
{
|
||||||
|
return m_node_contents[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
Node_data& operator[](Node_index n)
|
||||||
|
{
|
||||||
|
return m_node_contents[n];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class GT>
|
||||||
|
struct Node_data_wrapper<GT, false>
|
||||||
|
{
|
||||||
|
using Node_index = typename GT::Node_index;
|
||||||
|
using Node_data = void*;
|
||||||
|
|
||||||
|
template <class Property_container>
|
||||||
|
Node_data_wrapper(Property_container&) {}
|
||||||
|
|
||||||
|
void* operator[](Node_index) const
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // end of Orthtree_impl namespace
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\ingroup PkgOrthtreeRef
|
\ingroup PkgOrthtreeRef
|
||||||
|
|
@ -72,20 +115,7 @@ BOOST_MPL_HAS_XXX_TRAIT_DEF(Node_data)
|
||||||
*/
|
*/
|
||||||
template <typename GeomTraits>
|
template <typename GeomTraits>
|
||||||
class Orthtree {
|
class Orthtree {
|
||||||
template<class A, bool b>
|
static inline constexpr bool has_data = Orthtree_impl::has_Node_data<GeomTraits>::value;
|
||||||
struct Node_data_selector {};
|
|
||||||
|
|
||||||
template<class A>
|
|
||||||
struct Node_data_selector<A, true> {
|
|
||||||
using type = typename A::Node_data;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class A>
|
|
||||||
struct Node_data_selector<A, false> {
|
|
||||||
using type = void;
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline constexpr bool has_data = internal::has_Node_data<GeomTraits>::value;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// \name Template Types
|
/// \name Template Types
|
||||||
|
|
@ -104,7 +134,7 @@ public:
|
||||||
using Adjacency = typename Traits::Adjacency; ///< Adjacency type.
|
using Adjacency = typename Traits::Adjacency; ///< Adjacency type.
|
||||||
|
|
||||||
using Node_index = typename Traits::Node_index; ///< Index of a given node in the tree; the root always has index 0.
|
using Node_index = typename Traits::Node_index; ///< Index of a given node in the tree; the root always has index 0.
|
||||||
using Node_data = typename Node_data_selector<Traits, has_data>::type;
|
using Node_data = typename Orthtree_impl::Node_data_wrapper<Traits, has_data>::Node_data;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
@ -178,7 +208,7 @@ private: // data members :
|
||||||
Traits m_traits; /* the tree traits */
|
Traits m_traits; /* the tree traits */
|
||||||
|
|
||||||
Node_property_container m_node_properties;
|
Node_property_container m_node_properties;
|
||||||
std::conditional_t<has_data,Property_array<Node_data>, void*> m_node_contents;
|
Orthtree_impl::Node_data_wrapper<Traits, has_data> m_node_contents;
|
||||||
Property_array<std::uint8_t> m_node_depths;
|
Property_array<std::uint8_t> m_node_depths;
|
||||||
Property_array<Global_coordinates> m_node_coordinates;
|
Property_array<Global_coordinates> m_node_coordinates;
|
||||||
Property_array<std::optional<Node_index>> m_node_parents;
|
Property_array<std::optional<Node_index>> m_node_parents;
|
||||||
|
|
@ -190,14 +220,6 @@ private: // data members :
|
||||||
|
|
||||||
Cartesian_ranges cartesian_range; /* a helper to easily iterate over coordinates of points */
|
Cartesian_ranges cartesian_range; /* a helper to easily iterate over coordinates of points */
|
||||||
|
|
||||||
template<typename Dummy = Property_array<Node_data>>
|
|
||||||
auto init_node_contents(std::true_type) -> std::enable_if_t<has_data, Dummy>
|
|
||||||
{
|
|
||||||
return Property_array<Node_data>(m_node_properties.template get_or_add_property<Node_data>("contents").first);
|
|
||||||
}
|
|
||||||
|
|
||||||
void* init_node_contents(std::false_type) { return nullptr; }
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// \name Constructor
|
/// \name Constructor
|
||||||
|
|
@ -219,7 +241,7 @@ public:
|
||||||
*/
|
*/
|
||||||
explicit Orthtree(Traits traits) :
|
explicit Orthtree(Traits traits) :
|
||||||
m_traits(traits),
|
m_traits(traits),
|
||||||
m_node_contents(init_node_contents(std::bool_constant<has_data>())),
|
m_node_contents(m_node_properties),
|
||||||
m_node_depths(m_node_properties.template get_or_add_property<std::uint8_t>("depths", 0).first),
|
m_node_depths(m_node_properties.template get_or_add_property<std::uint8_t>("depths", 0).first),
|
||||||
m_node_coordinates(m_node_properties.template get_or_add_property<Global_coordinates>("coordinates").first),
|
m_node_coordinates(m_node_properties.template get_or_add_property<Global_coordinates>("coordinates").first),
|
||||||
m_node_parents(m_node_properties.template get_or_add_property<std::optional<Node_index>>("parents").first),
|
m_node_parents(m_node_properties.template get_or_add_property<std::optional<Node_index>>("parents").first),
|
||||||
|
|
@ -250,7 +272,7 @@ public:
|
||||||
Orthtree(const Orthtree& other) :
|
Orthtree(const Orthtree& other) :
|
||||||
m_traits(other.m_traits),
|
m_traits(other.m_traits),
|
||||||
m_node_properties(other.m_node_properties),
|
m_node_properties(other.m_node_properties),
|
||||||
m_node_contents(init_node_contents(std::bool_constant<has_data>())),
|
m_node_contents(m_node_properties),
|
||||||
m_node_depths(m_node_properties.template get_property<std::uint8_t>("depths")),
|
m_node_depths(m_node_properties.template get_property<std::uint8_t>("depths")),
|
||||||
m_node_coordinates(m_node_properties.template get_property<Global_coordinates>("coordinates")),
|
m_node_coordinates(m_node_properties.template get_property<Global_coordinates>("coordinates")),
|
||||||
m_node_parents(m_node_properties.template get_property<std::optional<Node_index>>("parents")),
|
m_node_parents(m_node_properties.template get_property<std::optional<Node_index>>("parents")),
|
||||||
|
|
@ -261,7 +283,7 @@ public:
|
||||||
Orthtree(Orthtree&& other) :
|
Orthtree(Orthtree&& other) :
|
||||||
m_traits(other.m_traits),
|
m_traits(other.m_traits),
|
||||||
m_node_properties(std::move(other.m_node_properties)),
|
m_node_properties(std::move(other.m_node_properties)),
|
||||||
m_node_contents(init_node_contents(std::bool_constant<has_data>())),
|
m_node_contents(m_node_properties),
|
||||||
m_node_depths(m_node_properties.template get_property<std::uint8_t>("depths")),
|
m_node_depths(m_node_properties.template get_property<std::uint8_t>("depths")),
|
||||||
m_node_coordinates(m_node_properties.template get_property<Global_coordinates>("coordinates")),
|
m_node_coordinates(m_node_properties.template get_property<Global_coordinates>("coordinates")),
|
||||||
m_node_parents(m_node_properties.template get_property<std::optional<Node_index>>("parents")),
|
m_node_parents(m_node_properties.template get_property<std::optional<Node_index>>("parents")),
|
||||||
|
|
@ -723,18 +745,18 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief retrieves a reference to the Node_data associated with the node specified by `n`.
|
\brief retrieves a reference to the `Node_data` associated with the node specified by `n` if
|
||||||
|
`GeomTraits` is a model of `OrthtreeTraitswithData`, and `nullptr` otherwise.
|
||||||
*/
|
*/
|
||||||
template<typename Dummy = Node_data>
|
auto data(Node_index n){
|
||||||
auto data(Node_index n) -> std::enable_if_t<has_data, Dummy&>{
|
|
||||||
return m_node_contents[n];
|
return m_node_contents[n];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief retrieves a const reference to the Node_data associated with the node specified by `n`.
|
\brief retrieves a const reference to the `Node_data` associated with the node specified by `n` if
|
||||||
|
`GeomTraits` is a model of `OrthtreeTraitswithData`, and `nullptr` otherwise.
|
||||||
*/
|
*/
|
||||||
template<typename Dummy = Node_data>
|
auto data(Node_index n) const{
|
||||||
auto data(Node_index n) const -> std::enable_if_t<has_data, const Dummy&> {
|
|
||||||
return m_node_contents[n];
|
return m_node_contents[n];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue