| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | /** * \file tree_node.hpp * \author Dhairya Malhotra, dhairya.malhotra@gmail.com * \date 12-10-2010 * \brief This file contains the definition of a virtual base class for a tree * node. */#ifndef _PVFMM_TREE_NODE_HPP_#define _PVFMM_TREE_NODE_HPP_#include <pvfmm_common.hpp>#include <assert.h>#include <cstring>namespace pvfmm{/** * \brief Virtual base class for tree node. */class TreeNode{ public:  /**   * \brief Base class for node data. Contains initialization data for the node.   */  class NodeData{   public:     virtual ~NodeData(){};     virtual void Clear(){}     int max_depth;     int dim;  };  /**   * \brief Initialize pointers to NULL   */  TreeNode(): dim(0), depth(0), max_depth(MAX_DEPTH), parent(NULL), child(NULL), status(1) { }  /**   * \brief Virtual destructor   */  virtual ~TreeNode();  /**   * \brief Initialize the node by passing the relevant data.   */  virtual void Initialize(TreeNode* parent_, int path2node_, NodeData* data_) ;  /**   * \brief Clear node data.   */  virtual void ClearData(){}  /**   * \brief Returns the dimension of the tree.   */  int Dim(){return dim;}  /**   * \brief Returns the depth of this node. (Root has depth 0)   */  int Depth(){return depth;}  /**   * \brief Returns 'true' if this is a leaf node.   */  bool IsLeaf(){return child == NULL;}  /**   * \brief Returns the child corresponding to the input parameter.   */  TreeNode* Child(int id);  /**   * \brief Returns a pointer to the parent node.   */  TreeNode* Parent();  /**   * \brief Returns the index which corresponds to this node among its   * siblings (parent's children).   * this->Parent()->Child(this->Path2Node())==this   */  int Path2Node();  /**   * \brief Allocate a new object of the same type (as the derived class) and   * return a pointer to it type cast as (TreeNode*).   */  virtual TreeNode* NewNode(TreeNode* n_=NULL);  /**   * \brief Evaluates and returns the subdivision condition for this node.   * 'true' if node requires further subdivision.   */  virtual bool SubdivCond();  /**   * \brief Create child nodes and Initialize them.   */  virtual void Subdivide() ;  /**   * \brief Truncates the tree i.e. makes this a leaf node.   */  virtual void Truncate() ;  /**   * \brief Set the parent for this node.   */  void SetParent(TreeNode* p, int path2node_) ;  /**   * \brief Set a child for this node.   */  void SetChild(TreeNode* c, int id) ;  /**   * \brief Returns status.   */  int& GetStatus();  /**   * \brief Update status for all nodes up to the root node.   */  void SetStatus(int flag); protected:  int dim;               //Dimension of the tree  int depth;             //Depth of the node (root -> 0)  int max_depth;         //Maximum depth  int path2node;         //Identity among siblings  TreeNode* parent;      //Pointer to parent node  TreeNode** child;      //Pointer child nodes  int status;};}//end namespace#endif //_PVFMM_TREE_NODE_HPP_
 |