Newton Dynamics  4.00
dNodeHierarchy.h
1 /* Copyright (c) <2003-2019> <Newton Game Dynamics>
2 *
3 * This software is provided 'as-is', without any express or implied
4 * warranty. In no event will the authors be held liable for any damages
5 * arising from the use of this software.
6 *
7 * Permission is granted to anyone to use this software for any purpose,
8 * including commercial applications, and to alter it and redistribute it
9 * freely
10 */
11 
12 #ifndef __D_NODE_HIERARCHY_H__
13 #define __D_NODE_HIERARCHY_H__
14 
15 #include "dCoreStdafx.h"
16 #include "dCRC.h"
17 #include "dString.h"
18 #include "dContainersAlloc.h"
19 
21 {
22  public:
23  D_CORE_API dNodeBaseHierarchy* GetChild () const;
24  D_CORE_API dNodeBaseHierarchy* GetParent () const;
25  D_CORE_API dNodeBaseHierarchy* GetSibling () const;
26 
27  D_CORE_API void Detach ();
28  D_CORE_API void Attach (dNodeBaseHierarchy* const parent, bool addFirst = false);
29 
30  D_CORE_API dNodeBaseHierarchy* GetRoot () const;
31  D_CORE_API dNodeBaseHierarchy* GetFirst() const;
32  D_CORE_API dNodeBaseHierarchy* GetLast() const;
33  D_CORE_API dNodeBaseHierarchy* GetNext() const;
34  D_CORE_API dNodeBaseHierarchy* GetPrev() const;
35 
36  D_CORE_API dNodeBaseHierarchy* Find (dUnsigned64 nameCRC) const;
37  D_CORE_API dNodeBaseHierarchy* Find (const char* const name) const;
38 
39  dUnsigned64 GetNameID() const;
40  const dString& GetName() const;
41  void SetName(const char* const name);
42 
43  protected:
44  D_CORE_API dNodeBaseHierarchy ();
45  D_CORE_API dNodeBaseHierarchy (const char* const name);
46  D_CORE_API dNodeBaseHierarchy (const dNodeBaseHierarchy &clone);
47  D_CORE_API virtual ~dNodeBaseHierarchy ();
48 
49  D_CORE_API virtual dNodeBaseHierarchy* CreateClone () const = 0;
50 
51  private:
52  inline void Clear();
53 
54  dString m_name;
55  dUnsigned64 m_nameID;
56  dNodeBaseHierarchy* m_parent;
57  dNodeBaseHierarchy* m_child;
58  dNodeBaseHierarchy* m_sibling;
59 };
60 
61 template<class T>
63 {
64  public:
65  dNodeHierarchy ();
66  dNodeHierarchy (const char* const name);
67  void Attach (T* const parent, bool addFirst = false);
68  void Detach ();
69  T* GetChild () const;
70  T* GetParent () const;
71  T* GetSibling () const;
72  T* GetRoot () const;
73  T* GetFirst() const;
74  T* GetLast() const;
75  T* GetNext() const;
76  T* GetPrev() const;
77  T* Find (dUnsigned64 nameCRC) const;
78  T* Find (const char* const name) const;
79 
80  protected:
81  dNodeHierarchy (const T &clone);
82  virtual ~dNodeHierarchy ();
83 };
84 
85 
86 inline dNodeBaseHierarchy::dNodeBaseHierarchy ()
87 {
88  Clear ();
89 }
90 
91 inline dNodeBaseHierarchy::dNodeBaseHierarchy (const char* const name)
92 {
93  Clear ();
94  SetName (name);
95 }
96 
97 
98 inline void dNodeBaseHierarchy::Clear()
99 {
100  m_child = nullptr;
101  m_parent = nullptr;
102  m_sibling = nullptr;
103  m_nameID = 0;
104  m_name = (char*)nullptr;
105 }
106 
107 
108 inline dNodeBaseHierarchy* dNodeBaseHierarchy::GetChild () const
109 {
110  return m_child;
111 }
112 
113 inline dNodeBaseHierarchy* dNodeBaseHierarchy::GetSibling () const
114 {
115  return m_sibling;
116 }
117 
118 inline dNodeBaseHierarchy* dNodeBaseHierarchy::GetParent () const
119 {
120  return m_parent;
121 }
122 
123 
124 inline dNodeBaseHierarchy* dNodeBaseHierarchy::Find (const char* const name) const
125 {
126  return Find (dCRC64 (name));
127 }
128 
129 inline void dNodeBaseHierarchy::SetName(const char* const name)
130 {
131  m_name = name;
132  m_nameID = dCRC64 (name);
133 }
134 
135 inline dUnsigned64 dNodeBaseHierarchy::GetNameID() const
136 {
137  return m_nameID;
138 }
139 
140 inline const dString& dNodeBaseHierarchy::GetName() const
141 {
142  return m_name;
143 }
144 
145 template<class T>
148 {
149 }
150 
151 template<class T>
152 dNodeHierarchy<T>::dNodeHierarchy (const T &clone)
153  :dNodeBaseHierarchy (clone)
154 {
155 }
156 
157 template<class T>
158 dNodeHierarchy<T>::dNodeHierarchy (const char* const name)
159  :dNodeBaseHierarchy (name)
160 {
161 }
162 
163 template<class T>
165 {
166 }
167 
168 
169 //template<class T>
170 //dNodeBaseHierarchy* dNodeHierarchy<T>::CreateClone () const
171 //{
172 // return new T (*(T*)this);
173 //}
174 
175 template<class T>
176 void dNodeHierarchy<T>::Attach (T* const parent, bool addFirst)
177 {
178  dNodeBaseHierarchy::Attach(parent, addFirst);
179 }
180 
181 template<class T>
183 {
184  dNodeBaseHierarchy::Detach ();
185 }
186 
187 template<class T>
188 T* dNodeHierarchy<T>::GetChild () const
189 {
190  return (T*) dNodeBaseHierarchy::GetChild();
191 }
192 
193 template<class T>
195 {
196  return (T*) dNodeBaseHierarchy::GetSibling ();
197 }
198 
199 template<class T>
201 {
202  return (T*) dNodeBaseHierarchy::GetParent ();
203 }
204 
205 
206 template<class T>
207 T* dNodeHierarchy<T>::GetRoot () const
208 {
209  return (T*) dNodeBaseHierarchy::GetRoot ();
210 }
211 
212 
213 template<class T>
215 {
216  return (T*) dNodeBaseHierarchy::GetFirst ();
217 }
218 
219 template<class T>
221 {
222  return (T*) dNodeBaseHierarchy::GetLast ();
223 }
224 
225 
226 template<class T>
228 {
229  return (T*) dNodeBaseHierarchy::GetNext ();
230 }
231 
232 template<class T>
234 {
235  return (T*) dNodeBaseHierarchy::GetPrev ();
236 }
237 
238 
239 template<class T>
240 T* dNodeHierarchy<T>::Find (dUnsigned64 nameCRC) const
241 {
242  return (T*) dNodeBaseHierarchy::Find (nameCRC);
243 }
244 
245 template<class T>
246 T* dNodeHierarchy<T>::Find (const char* const name) const
247 {
248  return (T*) dNodeBaseHierarchy::Find (name);
249 }
250 
251 
252 #endif
253 
dString
Definition: dString.h:20
dNodeHierarchy
Definition: dNodeHierarchy.h:63
dNodeBaseHierarchy
Definition: dNodeHierarchy.h:21
dClassAlloc
Base class for providing memory allocation for all other engine classes.
Definition: dClassAlloc.h:29