/* Copyright (c) <2003-2019> * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely */ #ifndef __Hierarchy__ #define __Hierarchy__ #include "dCRC.h" #include "dString.h" #include "dContainersAlloc.h" class dBaseHierarchy: public dContainersAlloc { public: DCONTAINERS_API dBaseHierarchy* GetChild () const; DCONTAINERS_API dBaseHierarchy* GetParent () const; DCONTAINERS_API dBaseHierarchy* GetSibling () const; DCONTAINERS_API void Detach (); DCONTAINERS_API void Attach (dBaseHierarchy* const parent, bool addFirst = false); DCONTAINERS_API dBaseHierarchy* GetRoot () const; DCONTAINERS_API dBaseHierarchy* GetFirst() const; DCONTAINERS_API dBaseHierarchy* GetLast() const; DCONTAINERS_API dBaseHierarchy* GetNext() const; DCONTAINERS_API dBaseHierarchy* GetPrev() const; DCONTAINERS_API dBaseHierarchy* Find (dCRCTYPE nameCRC) const; DCONTAINERS_API dBaseHierarchy* Find (const char* const name) const; DCONTAINERS_API long long GetNameID() const; DCONTAINERS_API const dString& GetName() const; void SetNameID(const char* const name); protected: DCONTAINERS_API dBaseHierarchy (); DCONTAINERS_API dBaseHierarchy (const char* const name); DCONTAINERS_API dBaseHierarchy (const dBaseHierarchy &clone); virtual DCONTAINERS_API ~dBaseHierarchy (); virtual DCONTAINERS_API dBaseHierarchy* CreateClone () const = 0; private: inline void Clear(); dString m_name; long long m_nameID; dBaseHierarchy* m_parent; dBaseHierarchy* m_child; dBaseHierarchy* m_sibling; }; template class dHierarchy: public dBaseHierarchy { public: dHierarchy (); dHierarchy (const char* const name); void Attach (T* const parent, bool addFirst = false); void Detach (); T* GetChild () const; T* GetParent () const; T* GetSibling () const; T* GetRoot () const; T* GetFirst() const; T* GetLast() const; T* GetNext() const; T* GetPrev() const; T* Find (long long nameCRC) const; T* Find (const char* const name) const; protected: dHierarchy (const T &clone); virtual ~dHierarchy (); }; inline dBaseHierarchy::dBaseHierarchy () { Clear (); } inline dBaseHierarchy::dBaseHierarchy (const char* const name) { Clear (); SetNameID (name); } inline void dBaseHierarchy::Clear() { m_child = NULL; m_parent = NULL; m_sibling = NULL; m_nameID = 0; m_name = (char*)NULL; } inline dBaseHierarchy* dBaseHierarchy::GetChild () const { return m_child; } inline dBaseHierarchy* dBaseHierarchy::GetSibling () const { return m_sibling; } inline dBaseHierarchy* dBaseHierarchy::GetParent () const { return m_parent; } inline dBaseHierarchy* dBaseHierarchy::Find (const char* const name) const { return Find (dCRC64 (name)); } inline void dBaseHierarchy::SetNameID(const char* const name) { m_nameID = dCRC64 (name); m_name = name; } inline long long dBaseHierarchy::GetNameID() const { return m_nameID; } inline const dString& dBaseHierarchy::GetName() const { return m_name; } template dHierarchy::dHierarchy () :dBaseHierarchy () { } template dHierarchy::dHierarchy (const T &clone) :dBaseHierarchy (clone) { } template dHierarchy::dHierarchy (const char* const name) :dBaseHierarchy (name) { } template dHierarchy::~dHierarchy () { } //template //dBaseHierarchy* dHierarchy::CreateClone () const //{ // return new T (*(T*)this); //} template void dHierarchy::Attach (T* const parent, bool addFirst) { dBaseHierarchy::Attach(parent, addFirst); } template void dHierarchy::Detach () { dBaseHierarchy::Detach (); } template T* dHierarchy::GetChild () const { return (T*) dBaseHierarchy::GetChild(); } template T* dHierarchy::GetSibling () const { return (T*) dBaseHierarchy::GetSibling (); } template T* dHierarchy::GetParent () const { return (T*) dBaseHierarchy::GetParent (); } template T* dHierarchy::GetRoot () const { return (T*) dBaseHierarchy::GetRoot (); } template T* dHierarchy::GetFirst() const { return (T*) dBaseHierarchy::GetFirst (); } template T* dHierarchy::GetLast() const { return (T*) dBaseHierarchy::GetLast (); } template T* dHierarchy::GetNext() const { return (T*) dBaseHierarchy::GetNext (); } template T* dHierarchy::GetPrev() const { return (T*) dBaseHierarchy::GetPrev (); } template T* dHierarchy::Find (dCRCTYPE nameCRC) const { return (T*) dBaseHierarchy::Find (nameCRC); } template T* dHierarchy::Find (const char* const name) const { return (T*) dBaseHierarchy::Find (name); } #endif