logo

libbulletml

Library of Bullet Markup Language (forked from https://shinh.skr.jp/libbulletml/index_en.html )git clone https://anongit.hacktivis.me/git/libbulletml.git/

tree.h (1845B)


  1. /// 一般的なツリー。再生産だね
  2. #ifndef TREE_H_
  3. #define TREE_H_
  4. #include "bulletmlcommon.h"
  5. #include <list>
  6. /// ツリーのクラス
  7. /**
  8. * ツリーってのはコンテナが存在しない集合体であると思う。
  9. * んで、ノードっていう属性を帯びたクラスの集合がコンテナであると。
  10. * でインターフェイスは、
  11. * class YourNode : public TreeNode<YourNode>;
  12. * って具合い。
  13. * ポインタ管理を前提としている。
  14. * インスタンスの管理は普段はしないけど、
  15. * setReleaseDuty を呼ばれたノードが破壊されると、
  16. * それの息子以下の世代は全て破壊される。
  17. */
  18. template <class C_>
  19. class TreeNode {
  20. public:
  21. // これをテンプレート引数で差し換えうる設計にしたいのだが
  22. typedef std::list<C_*> Children;
  23. typedef typename Children::iterator ChildIterator;
  24. typedef typename Children::const_iterator ConstChildIterator;
  25. public:
  26. DECLSPEC TreeNode() {
  27. releaseDuty_ = false;
  28. }
  29. DECLSPEC virtual ~TreeNode();
  30. DECLSPEC void addChild(C_* c) {
  31. c->setParent(dynamic_cast<C_*>(this));
  32. children_.push_back(c);
  33. }
  34. DECLSPEC void setReleaseDuty(bool bl) {
  35. releaseDuty_ = bl;
  36. }
  37. DECLSPEC void setParent(C_* c) {
  38. parent_ = c;
  39. }
  40. DECLSPEC ChildIterator childBegin() { return children_.begin(); }
  41. DECLSPEC ChildIterator childEnd() { return children_.end(); }
  42. DECLSPEC size_t childSize() { return children_.size(); }
  43. DECLSPEC ConstChildIterator childBegin() const { return children_.begin(); }
  44. DECLSPEC ConstChildIterator childEnd() const { return children_.end(); }
  45. DECLSPEC C_* getParent() { return parent_; }
  46. private:
  47. Children children_;
  48. C_* parent_;
  49. bool releaseDuty_;
  50. };
  51. template <class C_>
  52. TreeNode<C_>::~TreeNode() {
  53. if (releaseDuty_) {
  54. ChildIterator ite;
  55. for (ite = children_.begin(); ite != children_.end(); ite++) {
  56. (*ite)->setReleaseDuty(true);
  57. delete *ite;
  58. }
  59. }
  60. }
  61. #endif // ! TREE_H_