diff --git a/datatype/TreeTest.cpp b/datatype/TreeTest.cpp index a1088a8..645897d 100644 --- a/datatype/TreeTest.cpp +++ b/datatype/TreeTest.cpp @@ -1,374 +1,7 @@ #include #include -#include -#include -#include -#include - - -namespace hgl -{ - class IDNodeManager; - - template class TreeNodeManager; - - enum class NodeLifePhase - { - None=0, ///<未知 - Work, ///<工作中(一般的使用状态) - Recycled, ///<已回收(走过了回收流程,但并未释放资源) - WaitDestory, ///<等待销毁(已经进入真正的销毁流程) - Destory, ///<销毁(已经被销毁,不存这种对像,只在根据ID获取状态时可以得到) - - ENUM_CLASS_RANGE(None,Destory) - }; - - class IDNode - { - IDNodeManager *manager; ///<管理器指针 - size_t unique_id; ///<唯一ID - - IDNode *parent_node; ///<父节点指针 - tsl::robin_map child_map; ///<子节点集合 - - NodeLifePhase life_phase; ///<生命周期状态 - - public: - - IDNodeManager *GetManager() {return manager;} ///<获取管理器指针 - const IDNodeManager *GetManager()const{return manager;} ///<获取管理器指针 - - const size_t GetManagerID ()const; ///<获取管理器ID - const size_t GetUniqueID ()const{return unique_id;} ///<获取对象唯一ID - - const NodeLifePhase GetLifePhase()const{return life_phase;} ///<获取生命周期状态 - - const bool IsWork ()const{return life_phase==NodeLifePhase::Work;} ///<可以工作 - const bool IsRecycled ()const{return life_phase==NodeLifePhase::Recycled;} ///<是否已经回收 - const bool IsWaitDestory()const{return life_phase==NodeLifePhase::WaitDestory;} ///<是否已经进入等待销毁状态 - - private: - - friend class IDNodeManager; - template friend class TreeNode; - template friend class TreeNodeManager; - - IDNode(IDNodeManager *nm,const size_t uid) - { - manager=nm; - unique_id=uid; - - life_phase=NodeLifePhase::None; - - parent_node=nullptr; - } - - virtual ~IDNode(); - - virtual void MarkWaitDestory() - { - life_phase=NodeLifePhase::WaitDestory; - } - - public: - - virtual void OnDestory() - { - life_phase=NodeLifePhase::Destory; //设置为销毁状态 - delete this; - } - - virtual void Destory(); - - public: //子节点相关 - - virtual void OnAttachParent(IDNode *pn){parent_node=pn;} ///<被附加到父节点时调用(参见AttachChild) - virtual void OnDetachParent(IDNode *pn){parent_node=nullptr;} ///<被从父节点中移除时调用(参见DetachChild) - const IDNode *GetParent()const{return parent_node;} ///<获取父节点指针 - - const size_t GetChildCount()const{return child_map.size();} ///<获取子节点数量 - - const bool Contains(const size_t id)const{return child_map.contains(id);} ///<根据ID判断是否包含子节点 - const bool Contains(const IDNode *node)const - { - if(!node)return(false); - if(node->GetManager()!=GetManager())return(false); - - return Contains(node->GetUniqueID()); - } - - const bool AttachChild(IDNode *node) - { - if(!node)return(false); - if(Contains(node))return(false); - - child_map.emplace(node->GetUniqueID(),node); - node->OnAttachParent(this); - return(true); - } - - void DetachChild(IDNode *node) - { - if(!node)return; - - if(node->GetManager()!=GetManager()) - return; - - const size_t child_id=node->GetUniqueID(); - - if(child_map.contains(child_id)) - child_map.erase(child_id); - - node->OnDetachParent(this); - } - - void DestoryAllChild() - { - for(auto &it:child_map) - { - IDNode *node=it.second; - - if(!node) - continue; - - child_map.erase(node->GetUniqueID()); //从子节点集合中移除 - node->OnDetachParent(this); //从父节点中移除 - - node->Destory(); //销毁子节点 - } - - child_map.clear(); - } - };//class IDNode - - class IDNodeManager - { - static const size_t AcquireManagerID() - { - static size_t id_count=0; - - return ++id_count; - } - - private: - - size_t manager_serial; - size_t node_serial; - - private: - - tsl::robin_map node_map; ///<节点集合 - - tsl::robin_set wait_destory_node_set; ///<等待销毁的节点集合 - - tsl::robin_set destored_node_set; ///<已经销毁的节点集合 - - protected: - - friend class IDNode; - - const size_t AcquireNodeID(){return ++node_serial;} - - virtual IDNode *OnCreateNode(const size_t node_id)=0; ///<创建节点时调用 - virtual void OnDestoryNode(IDNode *node)=0; ///<销毁节点时调用 - - void OnNodeDirectDestory(IDNode *node) ///<直接销毁,这种情况只在对象被直接delete的情况下,一般不需要 - { - if(!node)return; - - if(wait_destory_node_set.contains(node)) - wait_destory_node_set.erase(node); - - if(!destored_node_set.contains(node)) - destored_node_set.emplace(node); - } - - public: - - const size_t GetMangaerID()const{return manager_serial;} - - public: - - IDNodeManager() - { - manager_serial=AcquireManagerID(); - node_serial=0; - } - - virtual ~IDNodeManager(){} - - virtual void ForceClear() - { - if(!node_map.empty()) - { - for(auto &it:node_map) - { - it.second->MarkWaitDestory(); - - wait_destory_node_set.insert(it.second); - } - - node_map.clear(); - } - - //正式的销毁可能是需要考虑node顺序的,需要根据依赖进行排序.这里暂时没做。 - - if(!wait_destory_node_set.empty()) - { - for(auto *node:wait_destory_node_set) - OnDestoryNode(node); //销毁节点 - - wait_destory_node_set.clear(); - } - } - - IDNode *CreateNode() - { - const size_t node_id=AcquireNodeID(); - - IDNode *node=OnCreateNode(node_id); - - if(!node) - return(nullptr); - - node_map.emplace(node_id,node); - - return(node); - } - - const bool ContainsNode(IDNode *tn)const - { - if(!tn)return(false); - if(tn->GetManagerID()!=GetMangaerID())return(false); - - if(!node_map.contains(tn->GetUniqueID())) - return(false); - - return(true); - } - - bool DestoryNode(IDNode *node) - { - if(!node)return(false); - - if(wait_destory_node_set.contains(node)) - return(true); - - if(!ContainsNode(node)) - return(false); - - node->MarkWaitDestory(); - node_map.erase(node->GetUniqueID()); - wait_destory_node_set.insert(node); - - return(true); - } - - IDNode *GetNode(const size_t node_id) - { - auto iter=node_map.find(node_id); - - if(iter==node_map.end()) - return(nullptr); - - return(iter->second); - } - - virtual void Update() - { - - } - };//class IDNodeManager - - const size_t IDNode::GetManagerID()const - { - return manager->GetMangaerID(); - } - - void IDNode::Destory() - { - manager->DestoryNode(this); - } - - IDNode::~IDNode() - { - if(GetChildCount()) - DestoryAllChild(); - - if(parent_node) - parent_node->DetachChild(this); //从父节点中移除 - - if(life_phaseOnNodeDirectDestory(this); //直接销毁 - } - - template class TreeNode:public IDNode - { - T node_data; - - private: - - friend class TreeNodeManager; ///<树节点管理器 - - using IDNode::IDNode; - - public: - - virtual ~TreeNode()override{} - - public: - - operator T &() {return node_data;} - operator const T &()const {return node_data;} - - T &operator *() {return node_data;} - const T &operator *()const{return node_data;} - - T &get() {return node_data;} - const T &get()const {return node_data;} - - T *operator ->() {return &node_data;} - const T *operator ->()const {return &node_data;} - - T &operator = (const T &data) - { - node_data=data; - return node_data; - } - };//class TreeNode - - template class TreeNodeManager:public IDNodeManager - { - public: - - using NodeType=TreeNode; ///<节点类型 - - protected: - - IDNode *OnCreateNode(const size_t node_id) override - { - return(new NodeType(this,node_id)); - } - - void OnDestoryNode(IDNode *node)override - { - if(!node)return; - - node->OnDestory(); - } - - public: - - using IDNodeManager::IDNodeManager; - virtual ~TreeNodeManager() - { - ForceClear(); - } - - NodeType *Create(){return (NodeType *)CreateNode();} - };//class TreeNodeManager -}//namespace hgl +#include using namespace hgl; @@ -407,7 +40,7 @@ public: using TreeNode::TreeNode; - void OnAttachParent(IDNode *node) override + void OnAttachParent(TreeBaseNode *node) override { TreeNode::OnAttachParent(node); @@ -416,7 +49,7 @@ public: std::cout<<(*pn)->GetPath()<<"\\"<<(*this)->GetPath()<::OnDetachParent(node); @@ -449,4 +82,4 @@ int main(int,char **) } //自动释放到可以了,但是释放顺序需要处理下 -} \ No newline at end of file +}