// Included from octree /**\var template< typename T_, int d_, typename A_ > \ * typedef T_ octree::value_type *\brief Shorthand for the application-specific datatype. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef T_* octree::pointer *\brief Shorthand for a pointer to application-specific data. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef T_& octree::reference *\brief Shorthand for a reference to application-specific data. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef const T_* octree::const_pointer *\brief Shorthand for a pointer to immutable application-specific data. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef const T_& octree::const_reference *\brief Shorthand for a reference to immutable application-specific data. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef octree octree::_self_type *\brief Shorthand for the datatype of this class. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef _self_type* octree::_self_pointer *\brief Shorthand for a pointer to an object of this class. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef octree_node* octree::octree_node_pointer *\brief Shorthand for a pointer to a node contained by the octree. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef octree_node& octree::octree_node_reference *\brief Shorthand for a reference to a node contained by the octree. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef const octree_node* octree::const_octree_node_pointer *\brief Shorthand for a pointer to an immutable node contained by the octree. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef const octree_node& octree::const_octree_node_reference *\brief Shorthand for a reference to an immutable node contained by the octree. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef A_ octree::allocator_type *\brief Shorthand for an allocator to be used by this class. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef octree_iterator< T_, T_&, T_*, _self_type, _self_pointer, d_ > octree::iterator *\brief Shorthand for an iterator that traverses the nodes contained in the octree. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef octree_iterator< T_, const T_&, const T_*, _self_type, _self_pointer, d_ > octree::const_iterator *\brief Shorthand for an iterator that traverses the nodes contained in the octree in a read-only manner. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef octree_cursor< T_, T_&, T_*, _self_type, _self_pointer, d_ > octree::cursor *\brief Shorthand for a cursor that traverses the nodes contained in the octree. */ /**\var template< typename T_, int d_, typename A_ > \ * typedef octree_cursor< T_, const T_&, const T_*, _self_type, _self_pointer, d_ > octree::const_cursor *\brief Shorthand for a cursor that traverses the nodes contained in the octree in a read-only manner. */ /**\brief Octree constructor (deprecated). * * There is no default constructor because the size of the octree must be fixed at construction time. * If it were not fixed, then someone could change the root node's bounds later and (1) its * children would be inconsistently bounded and/or (2) any application-specific data dependent on the * geometry would be incorrect. * * Because this version does not properly initialize application-specific data at the root node, it is deprecated. * * @param[in] x_center An array of coordinates specifying the center of the octree * @param[in] length The length (size) of each side of the octree */ template< typename T_, int d_, typename A_ > octree::octree( const double* x_center, double length ) { for ( int i = 0; i < d_; ++ i ) this->_M_center[i] = x_center[i]; this->_M_size = length; this->_M_root = new octree_node(); } /**\brief Octree constructor. * * There is no default constructor because the size of the octree must be fixed at construction time. * If it were not fixed, then someone could change the root node's bounds later and (1) its * children would be inconsistently bounded and/or (2) any application-specific data dependent on the * geometry would be incorrect. * * This version takes a reference to application-specific data which is used to properly initialize * the root node's value. This is the preferred constructor. * * @param[in] x_center An array of coordinates specifying the center of the octree * @param[in] length The length (size) of each side of the octree * @param[in] value Application-specific data to store at the root node */ template< typename T_, int d_, typename A_ > octree::octree( const double* x_center, double length, const value_type& value ) { for ( int i = 0; i < d_; ++ i ) this->_M_center[i] = x_center[i]; this->_M_size = length; this->_M_root = new octree_node( nullptr, value ); } /**\brief Octree destructor. * * Deletes the octree nodes and any application-specific data stored with them. */ template< typename T_, int d_, typename A_ > octree::~octree() { delete this->_M_root; } /**\fn template< typename T_, int d_, typename A_ > \ * octree_node_pointer octree::root() *\brief Returns the root (top-level) node of the octree. */ /**\brief Return the number of nodes in the octree (or optionally leaf nodes) * * By default, this will return the count of all the nodes in the tree -- not just leaf nodes. * If you set \a only_leaves to true, you will receive a count of just the leaf nodes. * Note that this is not the same as the default for iteration! * *\warning This is not a fast routine; it traverses the entire tree to count nodes. */ template< typename T_, int d_, typename A_ > size_t octree::size( bool only_leaves ) { size_t number = 0; iterator it; for ( it = this->begin( only_leaves ); it != this->end(); ++it ) ++number; return number; } /**\fn template< typename T_, int d_, typename A_ > const double* octree::center() const *\brief Retrieve the geometric center of a node. * * Note that this, along with size() provide a way to compute the bounds of the node. * @retval A pointer to an array of _d coordinates. */ /**\fn template< typename T_, int d_, typename A_ > reference octree_node::size() const *\brief Retrieve the size (i.e., the length of any side) of a node. * * Note that this, along with center() provide a way to compute the bounds of the octree. * * \warning Some people refer to the diagonal length as the octree size; this is not how we use size. * If you would like the diagonal length, multiply size() by \f$\sqrt{3}\f$. * * @retval The length of a side of the octree. */ /**\var template< typename T_, int d_, typename A_ > \ * octree_node_pointer octree::_M_root *\brief The root (top-level) node of the octree. */ /**\var template< typename T_, int d_, typename A_ > \ * double octree::_M_center[d_] *\brief The geometric center point of the octree. */ /**\var template< typename T_, int d_, typename A_ > \ * double octree::_M_size *\brief The geometric length of each side of the hypercube defining the octree. Also called the size of the node. */