tree.hpp 2.1 KB

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