diff --git a/inc/hgl/type/TreeNode.h b/inc/hgl/type/TreeNode.h index 5af1493..c1016f4 100644 --- a/inc/hgl/type/TreeNode.h +++ b/inc/hgl/type/TreeNode.h @@ -22,14 +22,11 @@ namespace hgl ENUM_CLASS_RANGE(None,Destory) }; - class TreeBaseNode + class BaseNode { TreeBaseNodeManager *manager; ///<管理器指针 size_t unique_id; ///<唯一ID - TreeBaseNode *parent_node; ///<父节点指针 - tsl::robin_map child_map; ///<子节点集合 - TreeNodeLifePhase life_phase; ///<生命周期状态 public: @@ -46,17 +43,16 @@ namespace hgl const bool IsRecycled ()const{return life_phase==TreeNodeLifePhase::Recycled;} ///<是否已经回收 const bool IsWaitDestory()const{return life_phase==TreeNodeLifePhase::WaitDestory;} ///<是否已经进入等待销毁状态 - private: + public: + + BaseNode(TreeBaseNodeManager *nm,const size_t uid); + virtual ~BaseNode(); + + protected: friend class TreeBaseNodeManager; - template friend class TreeNode; template friend class TreeNodeManager; - TreeBaseNode(TreeBaseNodeManager *nm,const size_t uid); - virtual ~TreeBaseNode(); - - protected: - virtual void MarkWaitDestory(){life_phase=TreeNodeLifePhase::WaitDestory;} ///<标记为等待销毁状态 virtual void OnDestory(); ///<最后的真实销毁调用操作(默认为delete this) @@ -65,6 +61,22 @@ namespace hgl virtual void Destory(); ///<销毁节点(标记为等待销毁状态) + };//class BaseNode + + class TreeBaseNode:public BaseNode + { + TreeBaseNode *parent_node; ///<父节点指针 + tsl::robin_map child_map; ///<子节点集合 + + private: + + friend class TreeBaseNodeManager; + template friend class TreeNode; + template friend class TreeNodeManager; + + TreeBaseNode(TreeBaseNodeManager *nm,const size_t uid); + virtual ~TreeBaseNode(); + public: //子节点相关 virtual void OnAttachParent(TreeBaseNode *pn){parent_node=pn;} ///<被附加到父节点时调用(参见AttachChild) @@ -92,22 +104,22 @@ namespace hgl private: - tsl::robin_map node_map; ///<节点集合 + tsl::robin_map node_map; ///<节点集合 - tsl::robin_set wait_destory_node_set; ///<等待销毁的节点集合 + tsl::robin_set wait_destory_node_set; ///<等待销毁的节点集合 - tsl::robin_set destored_node_set; ///<已经销毁的节点集合 + tsl::robin_set destored_node_set; ///<已经销毁的节点集合 protected: - friend class TreeBaseNode; + friend class BaseNode; const size_t AcquireNodeID(){return ++node_serial;} - virtual TreeBaseNode * OnCreateNode(const size_t node_id)=0; ///<创建节点时调用 - virtual void OnDestoryNode(TreeBaseNode *node)=0; ///<销毁节点时调用 + virtual BaseNode * OnCreateNode(const size_t node_id)=0; ///<创建节点时调用 + virtual void OnDestoryNode(BaseNode *node)=0; ///<销毁节点时调用 - void OnNodeDirectDestory(TreeBaseNode *node); ///<直接销毁,这种情况只在对象被直接delete的情况下,一般不需要 + void OnNodeDirectDestory(BaseNode *node); ///<直接销毁,这种情况只在对象被直接delete的情况下,一般不需要 public: @@ -125,13 +137,13 @@ namespace hgl virtual void ForceClear(); - TreeBaseNode * CreateNode(); + BaseNode * CreateNode(); - const bool ContainsNode(TreeBaseNode *tn)const; + const bool ContainsNode(BaseNode *tn)const; - bool DestoryNode(TreeBaseNode *node); + bool DestoryNode(BaseNode *node); - TreeBaseNode * GetNode(const size_t node_id); + BaseNode * GetNode(const size_t node_id); virtual void Update(){} };//class TreeBaseNodeManager @@ -179,12 +191,12 @@ namespace hgl protected: - TreeBaseNode *OnCreateNode(const size_t node_id) override + BaseNode *OnCreateNode(const size_t node_id) override { return(new NodeType(this,node_id)); } - void OnDestoryNode(TreeBaseNode *node)override + void OnDestoryNode(BaseNode *node)override { if(!node)return; diff --git a/src/Type/TreeNode.cpp b/src/Type/TreeNode.cpp index b346e92..44bb01c 100644 --- a/src/Type/TreeNode.cpp +++ b/src/Type/TreeNode.cpp @@ -2,13 +2,41 @@ namespace hgl { - TreeBaseNode::TreeBaseNode(TreeBaseNodeManager *nm,const size_t uid) + BaseNode::BaseNode(TreeBaseNodeManager *nm,const size_t uid) { manager=nm; unique_id=uid; life_phase=TreeNodeLifePhase::None; + } + BaseNode::~BaseNode() + { + if(life_phaseOnNodeDirectDestory(this); //直接销毁 + } + + const size_t BaseNode::GetManagerID()const + { + return manager->GetMangaerID(); + } + + void BaseNode::Destory() + { + manager->DestoryNode(this); + } + + void BaseNode::OnDestory() + { + life_phase=TreeNodeLifePhase::Destory; //设置为销毁状态 + delete this; + } +}//namespace hgl + +namespace hgl +{ + TreeBaseNode::TreeBaseNode(TreeBaseNodeManager *nm,const size_t uid):BaseNode(nm,uid) + { parent_node=nullptr; } @@ -19,25 +47,6 @@ namespace hgl if(parent_node) parent_node->DetachChild(this); //从父节点中移除 - - if(life_phaseOnNodeDirectDestory(this); //直接销毁 - } - - const size_t TreeBaseNode::GetManagerID()const - { - return manager->GetMangaerID(); - } - - void TreeBaseNode::Destory() - { - manager->DestoryNode(this); - } - - void TreeBaseNode::OnDestory() - { - life_phase=TreeNodeLifePhase::Destory; //设置为销毁状态 - delete this; } const bool TreeBaseNode::Contains(const TreeBaseNode *node)const diff --git a/src/Type/TreeNodeManager.cpp b/src/Type/TreeNodeManager.cpp index 9f31db3..bacc46f 100644 --- a/src/Type/TreeNodeManager.cpp +++ b/src/Type/TreeNodeManager.cpp @@ -2,7 +2,7 @@ namespace hgl { - void TreeBaseNodeManager::OnNodeDirectDestory(TreeBaseNode *node) ///<直接销毁,这种情况只在对象被直接delete的情况下,一般不需要 + void TreeBaseNodeManager::OnNodeDirectDestory(BaseNode *node) ///<直接销毁,这种情况只在对象被直接delete的情况下,一般不需要 { if(!node)return; @@ -41,11 +41,11 @@ namespace hgl } } - TreeBaseNode *TreeBaseNodeManager::CreateNode() + BaseNode *TreeBaseNodeManager::CreateNode() { const size_t node_id=AcquireNodeID(); - TreeBaseNode *node=OnCreateNode(node_id); + BaseNode *node=OnCreateNode(node_id); if(!node) return(nullptr); @@ -55,7 +55,7 @@ namespace hgl return(node); } - const bool TreeBaseNodeManager::ContainsNode(TreeBaseNode *tn)const + const bool TreeBaseNodeManager::ContainsNode(BaseNode *tn)const { if(!tn)return(false); if(tn->GetManagerID()!=GetMangaerID())return(false); @@ -66,7 +66,7 @@ namespace hgl return(true); } - bool TreeBaseNodeManager::DestoryNode(TreeBaseNode *node) + bool TreeBaseNodeManager::DestoryNode(BaseNode *node) { if(!node)return(false); @@ -83,7 +83,7 @@ namespace hgl return(true); } - TreeBaseNode *TreeBaseNodeManager::GetNode(const size_t node_id) + BaseNode *TreeBaseNodeManager::GetNode(const size_t node_id) { auto iter=node_map.find(node_id);