1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
5 #include <CrySchematyc2/Script/IScriptElement.h>
6 #include <CrySchematyc2/Script/IScriptFile.h>
7 #include <CrySchematyc2/Services/ILog.h>
9 #include "Script/ScriptExtensionMap.h"
10 #include <CrySchematyc2/BasicTypes.h>
14 template <typename INTERFACE
> class CScriptElementBase
: public INTERFACE
18 CScriptElementBase(EScriptElementType type
, IScriptFile
& file
)
21 , m_flags(EScriptElementFlags::None
)
24 , m_pFirstChild(nullptr)
25 , m_pLastChild(nullptr)
26 , m_pPrevSibling(nullptr)
27 , m_pNextSibling(nullptr)
34 m_pParent
->DetachChild(*this);
36 for(IScriptElement
* pChild
= m_pFirstChild
; pChild
; )
38 IScriptElement
* pNextChild
= pChild
->GetNextSibling();
39 pChild
->SetParent(nullptr);
40 pChild
->SetPrevSibling(nullptr);
41 pChild
->SetNextSibling(nullptr);
48 virtual EScriptElementType
GetElementType() const override
53 virtual IScriptFile
& GetFile() override
58 virtual const IScriptFile
& GetFile() const override
63 virtual EGraphExecutionFilter
GetExecutionFilter() const override
65 return EGraphExecutionFilter::Always
;
68 virtual void SetElementFlags(EScriptElementFlags flags
) override
73 virtual EScriptElementFlags
GetElementFlags() const override
78 virtual void SetNewFile(INewScriptFile
* pNewFile
) override
80 m_pNewFile
= pNewFile
;
83 virtual INewScriptFile
* GetNewFile() override
88 virtual const INewScriptFile
* GetNewFile() const override
93 virtual void AttachChild(IScriptElement
& child
) override
95 IScriptElement
* pPrevParent
= child
.GetParent();
98 pPrevParent
->DetachChild(child
);
101 child
.SetParent(this);
102 child
.SetPrevSibling(m_pLastChild
);
106 m_pLastChild
->SetNextSibling(&child
);
110 m_pFirstChild
= &child
;
112 m_pLastChild
= &child
;
115 virtual void DetachChild(IScriptElement
& child
) override
117 IScriptElement
* pParent
= child
.GetParent();
118 SCHEMATYC2_SYSTEM_ASSERT(pParent
== this);
121 IScriptElement
* pPrevSibling
= child
.GetPrevSibling();
122 IScriptElement
* pNextSibling
= child
.GetNextSibling();
124 if(&child
== m_pFirstChild
)
126 SCHEMATYC2_SYSTEM_ASSERT(!pPrevSibling
);
127 m_pFirstChild
= pNextSibling
;
131 SCHEMATYC2_SYSTEM_ASSERT(pPrevSibling
);
132 pPrevSibling
->SetNextSibling(pNextSibling
);
135 if(&child
== m_pLastChild
)
137 SCHEMATYC2_SYSTEM_ASSERT(!pNextSibling
);
138 m_pLastChild
= pPrevSibling
;
142 SCHEMATYC2_SYSTEM_ASSERT(pNextSibling
);
143 pNextSibling
->SetPrevSibling(pPrevSibling
);
146 child
.SetParent(nullptr);
147 child
.SetPrevSibling(nullptr);
148 child
.SetNextSibling(nullptr);
152 virtual void SetParent(IScriptElement
* pParent
) override
157 virtual void SetPrevSibling(IScriptElement
* pPrevSibling
) override
159 m_pPrevSibling
= pPrevSibling
;
162 virtual void SetNextSibling(IScriptElement
* pNextSibling
) override
164 m_pNextSibling
= pNextSibling
;
167 virtual IScriptElement
* GetParent() override
172 virtual const IScriptElement
* GetParent() const override
177 virtual IScriptElement
* GetFirstChild() override
179 return m_pFirstChild
;
182 virtual const IScriptElement
* GetFirstChild() const override
184 return m_pFirstChild
;
187 virtual IScriptElement
* GetLastChild() override
192 virtual const IScriptElement
* GetLastChild() const override
197 virtual IScriptElement
* GetPrevSibling() override
199 return m_pPrevSibling
;
202 virtual const IScriptElement
* GetPrevSibling() const override
204 return m_pPrevSibling
;
207 virtual IScriptElement
* GetNextSibling() override
209 return m_pNextSibling
;
212 virtual const IScriptElement
* GetNextSibling() const override
214 return m_pNextSibling
;
217 virtual IScriptExtensionMap
& GetExtensions() override
222 virtual const IScriptExtensionMap
& GetExtensions() const override
227 virtual void Refresh(const SScriptRefreshParams
& params
) override
229 m_extensions
.Refresh(params
);
232 virtual void Serialize(Serialization::IArchive
& archive
) override
234 if(archive
.isOutput())
236 EScriptElementType elementType
= static_cast<const INTERFACE
*>(this)->GetElementType();
237 archive(elementType
, "elementType");
240 archive(m_extensions
, "extensions");
243 virtual void RemapGUIDs(IGUIDRemapper
& guidRemapper
) override
245 m_extensions
.RemapGUIDs(guidRemapper
);
250 inline void AddExtension(const IScriptExtensionPtr
& pExtension
)
252 m_extensions
.AddExtension(pExtension
);
257 EScriptElementType m_type
;
259 EScriptElementFlags m_flags
;
260 INewScriptFile
* m_pNewFile
;
261 IScriptElement
* m_pParent
;
262 IScriptElement
* m_pFirstChild
;
263 IScriptElement
* m_pLastChild
;
264 IScriptElement
* m_pPrevSibling
;
265 IScriptElement
* m_pNextSibling
;
266 CScriptExtensionMap m_extensions
;