diff --git a/Orthtree/include/CGAL/Orthtree.h b/Orthtree/include/CGAL/Orthtree.h index 3b620fb0138..2af93b7fde5 100644 --- a/Orthtree/include/CGAL/Orthtree.h +++ b/Orthtree/include/CGAL/Orthtree.h @@ -164,7 +164,7 @@ public: using Property_map = unspecified_type; #else template - using Property_map = Properties::Experimental::Property_container::Array; + using Property_map = Properties::Experimental::Property_array_handle; #endif /// \cond SKIP_IN_MANUAL @@ -176,15 +176,17 @@ private: // data members : using Cartesian_ranges = Orthtrees::internal::Cartesian_ranges; using Node_property_container = Properties::Experimental::Property_container; + template + using Property_array = Node_property_container::Array; Traits m_traits; /* the tree traits */ Node_property_container m_node_properties; - Property_map& m_node_contents; - Property_map& m_node_depths; - Property_map& m_node_coordinates; - Property_map& m_node_parents; - Property_map& m_node_children; + Property_array& m_node_contents; + Property_array& m_node_depths; + Property_array& m_node_coordinates; + Property_array& m_node_parents; + Property_array& m_node_children; using Bbox_dimensions = std::array; CGAL::NT_converter conv; @@ -327,7 +329,7 @@ public: } /*! - \brief Convenience overload that refines an orthtree using a + \brief convenience overload that refines an orthtree using a maximum depth and maximum number of inliers in a node as split predicate. @@ -417,7 +419,7 @@ public: /// @{ /*! - * \brief Provides direct read-only access to the tree Traits. + * \brief provides direct read-only access to the tree Traits. * * @return a const reference to the Traits instantiation. */ @@ -464,7 +466,7 @@ public: /*! - \brief Convenience method for using a traversal without constructing it yourself + \brief convenience method for using a traversal without constructing it yourself \tparam Traversal model of `OrthtreeTraversal` that provides functions compatible with the type of the orthtree @@ -509,7 +511,7 @@ public: /// @{ /*! - \brief Gets a property for nodes, adding it if it doesn't already exist. + \brief gets a property for nodes, adding it if it doesn't already exist. \tparam T the type of the property to add @@ -521,11 +523,12 @@ public: template std::pair, bool> get_or_add_node_property(const std::string& name, const T default_value = T()) { - return m_node_properties.get_or_add_property(name, default_value); + auto p = m_node_properties.get_or_add_property(name, default_value); + return std::pair, bool>(Property_map(p.first), p.second); } /*! - \brief Adds a property for nodes. + \brief adds a property for nodes. \tparam T the type of the property to add @@ -540,7 +543,7 @@ public: } /*! - \brief Gets a property of the tree nodes. + \brief gets a property of the tree nodes. The property to be retrieved must exist in the tree. @@ -556,7 +559,7 @@ public: } /*! - \brief Gets a property of the tree nodes if it exists. + \brief gets a property of the tree nodes if it exists. \tparam T the type of the property to retrieve @@ -567,7 +570,11 @@ public: template std::optional> get_node_property_if_exists(const std::string& name) { - return m_node_properties.get_property_if_exists(name); + auto p = m_node_properties.get_property_if_exists(name); + if (p) + return std::optional >(Property_map(*p)); + else + return std::nullopt; } /// @} @@ -681,7 +688,7 @@ public: /// @{ /*! - \brief Determines whether the node specified by index `n` is a leaf node. + \brief determines whether the node specified by index `n` is a leaf node. \param n index of the node to check. @@ -692,7 +699,7 @@ public: } /*! - \brief Determines whether the node specified by index `n` is a root node. + \brief determines whether the node specified by index `n` is a root node. \param n index of the node to check. @@ -703,7 +710,7 @@ public: } /*! - \brief Determines the depth of the node specified. + \brief determines the depth of the node specified. The root node has depth 0, its children have depth 1, and so on. @@ -716,7 +723,7 @@ 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`. \param n index of the node to retrieve the contents of. @@ -738,7 +745,7 @@ public: } /*! - \brief Retrieves the global coordinates of the node. + \brief retrieves the global coordinates of the node. \param n index of the node to retrieve the coordinates of. @@ -749,7 +756,7 @@ public: } /*! - \brief Retrieves the local coordinates of the node. + \brief retrieves the local coordinates of the node. \param n index of the node to retrieve the coordinates of. @@ -792,7 +799,7 @@ public: } /*! - \brief Retrieves an arbitrary descendant of the node specified by `node`. + \brief retrieves an arbitrary descendant of the node specified by `node`. Convenience function to avoid the need to call `orthtree.child(orthtree.child(node, 0), 1)`. @@ -811,7 +818,7 @@ public: } /*! - \brief Convenience function for retrieving arbitrary nodes. + \brief convenience function for retrieving arbitrary nodes. Equivalent to `tree.descendant(tree.root(), indices...)`. @@ -825,7 +832,7 @@ public: } /*! - \brief Finds the next sibling in the parent of the node specified by the index `n`. + \brief finds the next sibling in the parent of the node specified by the index `n`. Traverses the tree in increasing order of local index (e.g. 000, 001, 010, etc.) @@ -851,7 +858,7 @@ public: } /*! - \brief Finds the next sibling of the parent of the node specified by `n` if it exists. + \brief finds the next sibling of the parent of the node specified by `n` if it exists. \param n the index node to find the sibling up of. @@ -875,7 +882,7 @@ public: } /*! - \brief Finds the leaf node reached when descending the tree and always choosing child 0. + \brief finds the leaf node reached when descending the tree and always choosing child 0. This is the starting point of a depth-first traversal. @@ -893,7 +900,7 @@ public: } /*! - \brief Finds node reached when descending the tree to a depth `d` and always choosing child 0. + \brief finds node reached when descending the tree to a depth `d` and always choosing child 0. Similar to `deepest_first_child`, but does not go to a fixed depth. @@ -973,7 +980,7 @@ public: } /*! - * \brief Finds the center point of a node. + * \brief finds the center point of a node. * * @param n index of the node to find the center point for * @@ -999,7 +1006,7 @@ public: } /*! - \brief Determines whether a pair of subtrees have the same topology. + \brief determines whether a pair of subtrees have the same topology. \param lhsNode index of a node in lhsTree \param lhsTree an Orthtree @@ -1030,7 +1037,7 @@ public: } /*! - \brief Helper function for calling `is_topology_equal` on the root nodes of two trees. + \brief helper function for calling `is_topology_equal` on the root nodes of two trees. \param lhs an Orthtree \param rhs another Orthtree diff --git a/Orthtree/test/Orthtree/test_octree_custom_properties.cpp b/Orthtree/test/Orthtree/test_octree_custom_properties.cpp index f7dc21198bb..97c3ee97b57 100644 --- a/Orthtree/test/Orthtree/test_octree_custom_properties.cpp +++ b/Orthtree/test/Orthtree/test_octree_custom_properties.cpp @@ -25,6 +25,23 @@ int main(void) { Octree tree({points, points.point_map()}); + // Testing built in node properties + typename Octree::Property_map data_prop = tree.get_node_property("contents"); + + auto prop2 = tree.get_or_add_node_property("test", int(0)); + assert(prop2.second); + + auto prop3 = tree.get_node_property_if_exists("test"); + assert(prop3.has_value()); + + auto prop4 = tree.get_node_property_if_exists("test"); + assert(!prop4.has_value()); + + auto prop5 = tree.get_or_add_node_property("test", int(0)); + assert(!prop5.second); + + auto prop6 = tree.add_node_property("test2", std::string()); + // Default value should be respected auto &node_int_property = tree.add_node_property("int", 5); assert(node_int_property[tree.root()] == 5);