tree.hpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /**
  2. * \file tree.hpp
  3. * \author Dhairya Malhotra, dhairya.malhotra@gmail.com
  4. * \date 12-11-2010
  5. * \brief This file contains the definition of the base class for a tree.
  6. */
  7. #ifndef _PVFMM_TREE_HPP_
  8. #define _PVFMM_TREE_HPP_
  9. #include <pvfmm_common.hpp>
  10. #include <iostream>
  11. #include <mem_mgr.hpp>
  12. namespace pvfmm{
  13. /**
  14. * \brief Base class for tree.
  15. */
  16. template <class TreeNode>
  17. class Tree{
  18. public:
  19. typedef TreeNode Node_t;
  20. /**
  21. * \brief Constructor.
  22. */
  23. Tree(): dim(0), root_node(NULL), max_depth(MAX_DEPTH), memgr(DEVICE_BUFFER_SIZE*1024l*1024l) { };
  24. /**
  25. * \brief Virtual destructor.
  26. */
  27. virtual ~Tree();
  28. /**
  29. * \brief Initialize the tree using initialization data for the root.
  30. */
  31. virtual void Initialize(typename Node_t::NodeData* init_data) ;
  32. /**
  33. * \brief Subdivide or truncate nodes based on SubdivCond().
  34. */
  35. virtual void RefineTree();
  36. /**
  37. * \brief Returns a pointer to the root node.
  38. */
  39. Node_t* RootNode() {return root_node;}
  40. /**
  41. * \brief Returns a new node of the same type as the root node.
  42. */
  43. Node_t* NewNode() {assert(root_node!=NULL); return (Node_t*)root_node->NewNode();}
  44. /**
  45. * \brief Returns a pointer to the first node in preorder traversal (the root
  46. * node).
  47. */
  48. Node_t* PreorderFirst();
  49. /**
  50. * \brief Returns a pointer to the next node in preorder traversal.
  51. */
  52. Node_t* PreorderNxt(Node_t* curr_node);
  53. /**
  54. * \brief Returns a pointer to the first node in postorder traversal.
  55. */
  56. Node_t* PostorderFirst();
  57. /**
  58. * \brief Returns a pointer to the next node in postorder traversal.
  59. */
  60. Node_t* PostorderNxt(Node_t* curr_node);
  61. /**
  62. * \brief Returns a list of all nodes in preorder traversal.
  63. */
  64. std::vector<TreeNode*>& GetNodeList();
  65. /**
  66. * \brief Dimension of the tree.
  67. */
  68. int Dim() {return dim;}
  69. protected:
  70. int dim; // dimension of the tree
  71. Node_t* root_node; // pointer to root node
  72. int max_depth; // maximum tree depth
  73. std::vector<TreeNode*> node_lst;
  74. mem::MemoryManager memgr;
  75. };
  76. }//end namespace
  77. #include <tree.txx>
  78. #endif //_PVFMM_TREE_HPP_