TreeBaseNode再抽像出独立的BaseNode,TreeBaseNodeManager也改为直接服务于BaseNode。

TreeBaseNodeManager将改名为NodeManager, 实现Node只管节点本身,Manager只管节点创建/释放。节点结构如何完成不管的模式。
This commit is contained in:
hyzboy 2025-04-29 23:41:14 +08:00
parent 39c4798bf5
commit 502cb54a76
3 changed files with 71 additions and 50 deletions

View File

@ -22,14 +22,11 @@ namespace hgl
ENUM_CLASS_RANGE(None,Destory) ENUM_CLASS_RANGE(None,Destory)
}; };
class TreeBaseNode class BaseNode
{ {
TreeBaseNodeManager *manager; ///<管理器指针 TreeBaseNodeManager *manager; ///<管理器指针
size_t unique_id; ///<唯一ID size_t unique_id; ///<唯一ID
TreeBaseNode *parent_node; ///<父节点指针
tsl::robin_map<size_t,TreeBaseNode *> child_map; ///<子节点集合
TreeNodeLifePhase life_phase; ///<生命周期状态 TreeNodeLifePhase life_phase; ///<生命周期状态
public: public:
@ -46,17 +43,16 @@ namespace hgl
const bool IsRecycled ()const{return life_phase==TreeNodeLifePhase::Recycled;} ///<是否已经回收 const bool IsRecycled ()const{return life_phase==TreeNodeLifePhase::Recycled;} ///<是否已经回收
const bool IsWaitDestory()const{return life_phase==TreeNodeLifePhase::WaitDestory;} ///<是否已经进入等待销毁状态 const bool IsWaitDestory()const{return life_phase==TreeNodeLifePhase::WaitDestory;} ///<是否已经进入等待销毁状态
private: public:
BaseNode(TreeBaseNodeManager *nm,const size_t uid);
virtual ~BaseNode();
protected:
friend class TreeBaseNodeManager; friend class TreeBaseNodeManager;
template<typename T> friend class TreeNode;
template<typename T> friend class TreeNodeManager; template<typename T> friend class TreeNodeManager;
TreeBaseNode(TreeBaseNodeManager *nm,const size_t uid);
virtual ~TreeBaseNode();
protected:
virtual void MarkWaitDestory(){life_phase=TreeNodeLifePhase::WaitDestory;} ///<标记为等待销毁状态 virtual void MarkWaitDestory(){life_phase=TreeNodeLifePhase::WaitDestory;} ///<标记为等待销毁状态
virtual void OnDestory(); ///<最后的真实销毁调用操作(默认为delete this) virtual void OnDestory(); ///<最后的真实销毁调用操作(默认为delete this)
@ -65,6 +61,22 @@ namespace hgl
virtual void Destory(); ///<销毁节点(标记为等待销毁状态) virtual void Destory(); ///<销毁节点(标记为等待销毁状态)
};//class BaseNode
class TreeBaseNode:public BaseNode
{
TreeBaseNode *parent_node; ///<父节点指针
tsl::robin_map<size_t,TreeBaseNode *> child_map; ///<子节点集合
private:
friend class TreeBaseNodeManager;
template<typename T> friend class TreeNode;
template<typename T> friend class TreeNodeManager;
TreeBaseNode(TreeBaseNodeManager *nm,const size_t uid);
virtual ~TreeBaseNode();
public: //子节点相关 public: //子节点相关
virtual void OnAttachParent(TreeBaseNode *pn){parent_node=pn;} ///<被附加到父节点时调用(参见AttachChild) virtual void OnAttachParent(TreeBaseNode *pn){parent_node=pn;} ///<被附加到父节点时调用(参见AttachChild)
@ -92,22 +104,22 @@ namespace hgl
private: private:
tsl::robin_map<size_t,TreeBaseNode *> node_map; ///<节点集合 tsl::robin_map<size_t,BaseNode *> node_map; ///<节点集合
tsl::robin_set<TreeBaseNode *> wait_destory_node_set; ///<等待销毁的节点集合 tsl::robin_set<BaseNode *> wait_destory_node_set; ///<等待销毁的节点集合
tsl::robin_set<TreeBaseNode *> destored_node_set; ///<已经销毁的节点集合 tsl::robin_set<BaseNode *> destored_node_set; ///<已经销毁的节点集合
protected: protected:
friend class TreeBaseNode; friend class BaseNode;
const size_t AcquireNodeID(){return ++node_serial;} const size_t AcquireNodeID(){return ++node_serial;}
virtual TreeBaseNode * OnCreateNode(const size_t node_id)=0; ///<创建节点时调用 virtual BaseNode * OnCreateNode(const size_t node_id)=0; ///<创建节点时调用
virtual void OnDestoryNode(TreeBaseNode *node)=0; ///<销毁节点时调用 virtual void OnDestoryNode(BaseNode *node)=0; ///<销毁节点时调用
void OnNodeDirectDestory(TreeBaseNode *node); ///<直接销毁这种情况只在对象被直接delete的情况下一般不需要 void OnNodeDirectDestory(BaseNode *node); ///<直接销毁这种情况只在对象被直接delete的情况下一般不需要
public: public:
@ -125,13 +137,13 @@ namespace hgl
virtual void ForceClear(); 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(){} virtual void Update(){}
};//class TreeBaseNodeManager };//class TreeBaseNodeManager
@ -179,12 +191,12 @@ namespace hgl
protected: protected:
TreeBaseNode *OnCreateNode(const size_t node_id) override BaseNode *OnCreateNode(const size_t node_id) override
{ {
return(new NodeType(this,node_id)); return(new NodeType(this,node_id));
} }
void OnDestoryNode(TreeBaseNode *node)override void OnDestoryNode(BaseNode *node)override
{ {
if(!node)return; if(!node)return;

View File

@ -2,13 +2,41 @@
namespace hgl namespace hgl
{ {
TreeBaseNode::TreeBaseNode(TreeBaseNodeManager *nm,const size_t uid) BaseNode::BaseNode(TreeBaseNodeManager *nm,const size_t uid)
{ {
manager=nm; manager=nm;
unique_id=uid; unique_id=uid;
life_phase=TreeNodeLifePhase::None; life_phase=TreeNodeLifePhase::None;
}
BaseNode::~BaseNode()
{
if(life_phase<TreeNodeLifePhase::WaitDestory) //还没有进入销毁器
manager->OnNodeDirectDestory(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; parent_node=nullptr;
} }
@ -19,25 +47,6 @@ namespace hgl
if(parent_node) if(parent_node)
parent_node->DetachChild(this); //从父节点中移除 parent_node->DetachChild(this); //从父节点中移除
if(life_phase<TreeNodeLifePhase::WaitDestory) //还没有进入销毁器
manager->OnNodeDirectDestory(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 const bool TreeBaseNode::Contains(const TreeBaseNode *node)const

View File

@ -2,7 +2,7 @@
namespace hgl namespace hgl
{ {
void TreeBaseNodeManager::OnNodeDirectDestory(TreeBaseNode *node) ///<直接销毁这种情况只在对象被直接delete的情况下一般不需要 void TreeBaseNodeManager::OnNodeDirectDestory(BaseNode *node) ///<直接销毁这种情况只在对象被直接delete的情况下一般不需要
{ {
if(!node)return; if(!node)return;
@ -41,11 +41,11 @@ namespace hgl
} }
} }
TreeBaseNode *TreeBaseNodeManager::CreateNode() BaseNode *TreeBaseNodeManager::CreateNode()
{ {
const size_t node_id=AcquireNodeID(); const size_t node_id=AcquireNodeID();
TreeBaseNode *node=OnCreateNode(node_id); BaseNode *node=OnCreateNode(node_id);
if(!node) if(!node)
return(nullptr); return(nullptr);
@ -55,7 +55,7 @@ namespace hgl
return(node); return(node);
} }
const bool TreeBaseNodeManager::ContainsNode(TreeBaseNode *tn)const const bool TreeBaseNodeManager::ContainsNode(BaseNode *tn)const
{ {
if(!tn)return(false); if(!tn)return(false);
if(tn->GetManagerID()!=GetMangaerID())return(false); if(tn->GetManagerID()!=GetMangaerID())return(false);
@ -66,7 +66,7 @@ namespace hgl
return(true); return(true);
} }
bool TreeBaseNodeManager::DestoryNode(TreeBaseNode *node) bool TreeBaseNodeManager::DestoryNode(BaseNode *node)
{ {
if(!node)return(false); if(!node)return(false);
@ -83,7 +83,7 @@ namespace hgl
return(true); 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); auto iter=node_map.find(node_id);