orx  1.14
Portable Game Engine
orxStructure.h
Go to the documentation of this file.
1 /* Orx - Portable Game Engine
2  *
3  * Copyright (c) 2008-2022 Orx-Project
4  *
5  * This software is provided 'as-is', without any express or implied
6  * warranty. In no event will the authors be held liable for any damages
7  * arising from the use of this software.
8  *
9  * Permission is granted to anyone to use this software for any purpose,
10  * including commercial applications, and to alter it and redistribute it
11  * freely, subject to the following restrictions:
12  *
13  * 1. The origin of this software must not be misrepresented; you must not
14  * claim that you wrote the original software. If you use this software
15  * in a product, an acknowledgment in the product documentation would be
16  * appreciated but is not required.
17  *
18  * 2. Altered source versions must be plainly marked as such, and must not be
19  * misrepresented as being the original software.
20  *
21  * 3. This notice may not be removed or altered from any source
22  * distribution.
23  */
24 
44 #ifndef _orxSTRUCTURE_H_
45 #define _orxSTRUCTURE_H_
46 
47 #include "orxInclude.h"
48 
49 #include "core/orxClock.h"
50 #include "memory/orxMemory.h"
51 #include "utils/orxLinkList.h"
52 #include "utils/orxTree.h"
53 
54 
57 #define orxSTRUCTURE_GET_POINTER(STRUCTURE, TYPE) ((orx##TYPE *)_orxStructure_GetPointer(STRUCTURE, orxSTRUCTURE_ID_##TYPE))
58 
59 #define orxSTRUCTURE(STRUCTURE) ((((STRUCTURE) != orxNULL) && (((((orxSTRUCTURE *)STRUCTURE)->u64GUID & orxSTRUCTURE_GUID_MASK_STRUCTURE_ID) >> orxSTRUCTURE_GUID_SHIFT_STRUCTURE_ID) < orxSTRUCTURE_ID_NUMBER)) ? (orxSTRUCTURE *)(STRUCTURE) : (orxSTRUCTURE *)orxNULL)
60 
61 #define orxANIM(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, ANIM)
62 #define orxANIMPOINTER(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, ANIMPOINTER)
63 #define orxANIMSET(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, ANIMSET)
64 #define orxBODY(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, BODY)
65 #define orxCAMERA(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, CAMERA)
66 #define orxCLOCK(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, CLOCK)
67 #define orxFONT(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, FONT)
68 #define orxFRAME(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, FRAME)
69 #define orxFX(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, FX)
70 #define orxFXPOINTER(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, FXPOINTER)
71 #define orxGRAPHIC(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, GRAPHIC)
72 #define orxOBJECT(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, OBJECT)
73 #define orxSOUND(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, SOUND)
74 #define orxSOUNDPOINTER(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, SOUNDPOINTER)
75 #define orxSHADER(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, SHADER)
76 #define orxSHADERPOINTER(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, SHADERPOINTER)
77 #define orxSPAWNER(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, SPAWNER)
78 #define orxTEXT(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, TEXT)
79 #define orxTEXTURE(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, TEXTURE)
80 #define orxTIMELINE(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, TIMELINE)
81 #define orxVIEWPORT(STRUCTURE) orxSTRUCTURE_GET_POINTER(STRUCTURE, VIEWPORT)
82 
85 #define orxSTRUCTURE_REGISTER(TYPE, STORAGE_TYPE, MEMORY_TYPE, BANK_SIZE, UPDATE_FUNCTION) \
86  orxStructure_Register(orxSTRUCTURE_ID_##TYPE, STORAGE_TYPE, MEMORY_TYPE, sizeof(orx##TYPE), BANK_SIZE, UPDATE_FUNCTION)
87 
90 #define orxSTRUCTURE_ASSERT(STRUCTURE) \
91  orxASSERT((STRUCTURE != orxNULL) && (((((orxSTRUCTURE *)(STRUCTURE))->u64GUID & orxSTRUCTURE_GUID_MASK_STRUCTURE_ID) >> orxSTRUCTURE_GUID_SHIFT_STRUCTURE_ID) < orxSTRUCTURE_ID_NUMBER));
92 
95 #define orxSTRUCTURE_GUID_MAGIC_TAG_DELETED 0xDEFACED0DEADC0DEULL
96 
99 #define orxSTRUCTURE_GUID_MASK_STRUCTURE_ID 0x00000000000000FFULL
100 #define orxSTRUCTURE_GUID_SHIFT_STRUCTURE_ID 0
101 
102 #define orxSTRUCTURE_GUID_MASK_ITEM_ID 0x00000000FFFFFF00ULL
103 #define orxSTRUCTURE_GUID_SHIFT_ITEM_ID 8
104 
105 #define orxSTRUCTURE_GUID_MASK_INSTANCE_ID 0xFFFFFFFF00000000ULL
106 #define orxSTRUCTURE_GUID_SHIFT_INSTANCE_ID 32
107 
108 
111 typedef enum __orxSTRUCTURE_ID_t
112 {
113  /* *** Following structures can be linked to objects *** */
114 
125 
127 
128  /* *** Below this point, structures can not be linked to objects *** */
129 
141 
143 
144  orxSTRUCTURE_ID_NONE = orxENUM_NONE
145 
147 
150 typedef enum __orxSTRUCTURE_STORAGE_TYPE_t
151 {
154 
156 
158 
160 
163 typedef struct __orxSTRUCTURE_t
164 {
165  orxU64 u64GUID;
166  orxU64 u64OwnerGUID;
167  orxU32 u32Flags;
168  orxU32 u32RefCount;
170  union
171  {
174  } stStorage;
176 } orxSTRUCTURE;
177 
178 
181 typedef orxSTATUS (orxFASTCALL *orxSTRUCTURE_UPDATE_FUNCTION)(orxSTRUCTURE *_pstStructure, const orxSTRUCTURE *_pstCaller, const orxCLOCK_INFO *_pstClockInfo);
182 
183 
189 static orxINLINE orxSTRUCTURE *_orxStructure_GetPointer(const void *_pStructure, orxSTRUCTURE_ID _eStructureID)
190 {
191  orxSTRUCTURE *pstResult;
192 
193  /* Updates result */
194  pstResult = ((_pStructure != orxNULL) && ((((orxSTRUCTURE *)_pStructure)->u64GUID & orxSTRUCTURE_GUID_MASK_STRUCTURE_ID) >> orxSTRUCTURE_GUID_SHIFT_STRUCTURE_ID) == _eStructureID) ? (orxSTRUCTURE *)_pStructure : (orxSTRUCTURE *)orxNULL;
195 
196  /* Done! */
197  return pstResult;
198 }
199 
204 static orxINLINE const orxSTRING orxStructure_GetIDString(orxSTRUCTURE_ID _eID)
205 {
206  const orxSTRING zResult;
207 
208 #define orxSTRUCTURE_DECLARE_ID_ENTRY(ID) case orxSTRUCTURE_ID_##ID: zResult = #ID; break
209 
210  /* Depending on ID */
211  switch(_eID)
212  {
213  orxSTRUCTURE_DECLARE_ID_ENTRY(ANIMPOINTER);
219  orxSTRUCTURE_DECLARE_ID_ENTRY(SHADERPOINTER);
220  orxSTRUCTURE_DECLARE_ID_ENTRY(SOUNDPOINTER);
234 
235  default: zResult = "INVALID STRUCTURE ID"; break;
236  }
237 
238 #undef orxSTRUCTURE_DECLARE_ID_ENTRY
239 
240  /* Done! */
241  return zResult;
242 }
243 
244 
247 extern orxDLLAPI void orxFASTCALL orxStructure_Setup();
248 
252 extern orxDLLAPI orxSTATUS orxFASTCALL orxStructure_Init();
253 
256 extern orxDLLAPI void orxFASTCALL orxStructure_Exit();
257 
258 
268 extern orxDLLAPI orxSTATUS orxFASTCALL orxStructure_Register(orxSTRUCTURE_ID _eStructureID, orxSTRUCTURE_STORAGE_TYPE _eStorageType, orxMEMORY_TYPE _eMemoryType, orxU32 _u32Size, orxU32 _u32BankSize, const orxSTRUCTURE_UPDATE_FUNCTION _pfnUpdate);
269 
274 extern orxDLLAPI orxSTATUS orxFASTCALL orxStructure_Unregister(orxSTRUCTURE_ID _eStructureID);
275 
276 
281 extern orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_Create(orxSTRUCTURE_ID _eStructureID);
282 
287 extern orxDLLAPI orxSTATUS orxFASTCALL orxStructure_Delete(void *_pStructure);
288 
289 
295 
300 extern orxDLLAPI orxU32 orxFASTCALL orxStructure_GetCount(orxSTRUCTURE_ID _eStructureID);
301 
308 extern orxDLLAPI orxSTATUS orxFASTCALL orxStructure_Update(void *_pStructure, const void *_phCaller, const orxCLOCK_INFO *_pstClockInfo);
309 
310 
318 extern orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_Get(orxU64 _u64GUID);
319 
324 extern orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetOwner(const void *_pStructure);
325 
331 extern orxDLLAPI orxSTATUS orxFASTCALL orxStructure_SetOwner(void *_pStructure, void *_pOwner);
332 
337 extern orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetFirst(orxSTRUCTURE_ID _eStructureID);
338 
343 extern orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetLast(orxSTRUCTURE_ID _eStructureID);
344 
349 extern orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetParent(const void *_pStructure);
350 
355 extern orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetChild(const void *_pStructure);
356 
361 extern orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetSibling(const void *_pStructure);
362 
367 extern orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetPrevious(const void *_pStructure);
368 
373 extern orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetNext(const void *_pStructure);
374 
380 extern orxDLLAPI orxSTATUS orxFASTCALL orxStructure_SetParent(void *_pStructure, void *_phParent);
381 
382 
387 extern orxDLLAPI orxSTATUS orxFASTCALL orxStructure_LogAll(orxBOOL _bPrivate);
388 
389 
396 static orxINLINE void orxStructure_IncreaseCount(void *_pStructure)
397 {
398  /* Checks */
399  orxSTRUCTURE_ASSERT(_pStructure);
400  orxASSERT(orxSTRUCTURE(_pStructure)->u32RefCount < 0xFFFFFFFF);
401 
402  /* Increases ref count */
403  orxSTRUCTURE(_pStructure)->u32RefCount++;
404 
405  /* Done! */
406  return;
407 }
408 
412 static orxINLINE void orxStructure_DecreaseCount(void *_pStructure)
413 {
414  /* Checks */
415  orxSTRUCTURE_ASSERT(_pStructure);
416  orxASSERT(orxSTRUCTURE(_pStructure)->u32RefCount != 0);
417 
418  /* Decreases ref count */
419  orxSTRUCTURE(_pStructure)->u32RefCount--;
420 
421  /* Done! */
422  return;
423 }
424 
429 static orxINLINE orxU32 orxStructure_GetRefCount(const void *_pStructure)
430 {
431  /* Checks */
432  orxSTRUCTURE_ASSERT(_pStructure);
433 
434  /* Done! */
435  return orxSTRUCTURE(_pStructure)->u32RefCount;
436 }
437 
442 static orxINLINE orxU64 orxStructure_GetGUID(const void *_pStructure)
443 {
444  /* Checks */
445  orxSTRUCTURE_ASSERT(_pStructure);
446 
447  /* Done! */
448  return orxSTRUCTURE(_pStructure)->u64GUID;
449 }
450 
455 static orxINLINE orxSTRUCTURE_ID orxStructure_GetID(const void *_pStructure)
456 {
457  /* Checks */
458  orxSTRUCTURE_ASSERT(_pStructure);
459 
460  /* Done! */
462 }
463 
469 static orxINLINE orxBOOL orxStructure_TestFlags(const void *_pStructure, orxU32 _u32Flags)
470 {
471  /* Checks */
472  orxSTRUCTURE_ASSERT(_pStructure);
473 
474  /* Done! */
475  return(orxFLAG_TEST(orxSTRUCTURE(_pStructure)->u32Flags, _u32Flags));
476 }
477 
483 static orxINLINE orxBOOL orxStructure_TestAllFlags(const void *_pStructure, orxU32 _u32Flags)
484 {
485  /* Checks */
486  orxSTRUCTURE_ASSERT(_pStructure);
487 
488  /* Done! */
489  return(orxFLAG_TEST_ALL(orxSTRUCTURE(_pStructure)->u32Flags, _u32Flags));
490 }
491 
497 static orxINLINE orxU32 orxStructure_GetFlags(const void *_pStructure, orxU32 _u32Mask)
498 {
499  /* Checks */
500  orxSTRUCTURE_ASSERT(_pStructure);
501 
502  /* Done! */
503  return(orxFLAG_GET(orxSTRUCTURE(_pStructure)->u32Flags, _u32Mask));
504 }
505 
511 static orxINLINE void orxStructure_SetFlags(void *_pStructure, orxU32 _u32AddFlags, orxU32 _u32RemoveFlags)
512 {
513  /* Checks */
514  orxSTRUCTURE_ASSERT(_pStructure);
515 
516  orxFLAG_SET(orxSTRUCTURE(_pStructure)->u32Flags, _u32AddFlags, _u32RemoveFlags);
517 
518  /* Done! */
519  return;
520 }
521 
522 #endif /* _orxSTRUCTURE_H_ */
523 
orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetFirst(orxSTRUCTURE_ID _eStructureID)
static orxINLINE orxU32 orxStructure_GetFlags(const void *_pStructure, orxU32 _u32Mask)
Definition: orxStructure.h:497
orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetNext(const void *_pStructure)
static orxINLINE orxBOOL orxStructure_TestAllFlags(const void *_pStructure, orxU32 _u32Flags)
Definition: orxStructure.h:483
orxDLLAPI orxSTRUCTURE_STORAGE_TYPE orxFASTCALL orxStructure_GetStorageType(orxSTRUCTURE_ID _eStructureID)
orxDLLAPI orxSTATUS orxFASTCALL orxStructure_LogAll(orxBOOL _bPrivate)
orxTREE_NODE stTreeNode
Definition: orxStructure.h:173
orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetLast(orxSTRUCTURE_ID _eStructureID)
orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetChild(const void *_pStructure)
orxSTRUCTURE_STORAGE_TYPE
Definition: orxStructure.h:150
#define orxFLAG_TEST(X, F)
Definition: orxDecl.h:406
#define orxSTRUCTURE_DECLARE_ID_ENTRY(ID)
orxDLLAPI orxSTATUS orxFASTCALL orxStructure_SetOwner(void *_pStructure, void *_pOwner)
orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_Create(orxSTRUCTURE_ID _eStructureID)
#define orxSTRUCTURE_GUID_SHIFT_STRUCTURE_ID
Definition: orxStructure.h:100
orxDLLAPI orxSTATUS orxFASTCALL orxStructure_Register(orxSTRUCTURE_ID _eStructureID, orxSTRUCTURE_STORAGE_TYPE _eStorageType, orxMEMORY_TYPE _eMemoryType, orxU32 _u32Size, orxU32 _u32BankSize, const orxSTRUCTURE_UPDATE_FUNCTION _pfnUpdate)
orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetParent(const void *_pStructure)
#define orxSTRUCTURE(STRUCTURE)
Definition: orxStructure.h:59
#define orxSTRUCTURE_GUID_MASK_STRUCTURE_ID
Definition: orxStructure.h:99
orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetPrevious(const void *_pStructure)
static orxINLINE const orxSTRING orxStructure_GetIDString(orxSTRUCTURE_ID _eID)
Definition: orxStructure.h:204
orxMEMORY_TYPE
Definition: orxMemory.h:87
static orxINLINE orxU64 orxStructure_GetGUID(const void *_pStructure)
Definition: orxStructure.h:442
orxDLLAPI void orxFASTCALL orxStructure_Exit()
static orxINLINE orxSTRUCTURE * _orxStructure_GetPointer(const void *_pStructure, orxSTRUCTURE_ID _eStructureID)
Definition: orxStructure.h:189
#define orxFLAG_SET(X, A, R)
Definition: orxDecl.h:420
orxDLLAPI void orxFASTCALL orxStructure_Setup()
orxSTATUS
Definition: orxType.h:256
static orxINLINE void orxStructure_SetFlags(void *_pStructure, orxU32 _u32AddFlags, orxU32 _u32RemoveFlags)
Definition: orxStructure.h:511
orxDLLAPI orxSTATUS orxFASTCALL orxStructure_Delete(void *_pStructure)
orxDLLAPI orxSTATUS orxFASTCALL orxStructure_Unregister(orxSTRUCTURE_ID _eStructureID)
orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetSibling(const void *_pStructure)
orxDLLAPI orxU32 orxFASTCALL orxStructure_GetCount(orxSTRUCTURE_ID _eStructureID)
orxDLLAPI orxSTATUS orxFASTCALL orxStructure_Init()
#define orxDLLAPI
Definition: orxDecl.h:370
orxDLLAPI orxSTATUS orxFASTCALL orxStructure_Update(void *_pStructure, const void *_phCaller, const orxCLOCK_INFO *_pstClockInfo)
static orxINLINE orxU32 orxStructure_GetRefCount(const void *_pStructure)
Definition: orxStructure.h:429
orxU64 u64OwnerGUID
Definition: orxStructure.h:166
orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_GetOwner(const void *_pStructure)
orxU32 u32RefCount
Definition: orxStructure.h:168
orxSTRUCTURE_ID
Definition: orxStructure.h:111
static orxINLINE void orxStructure_IncreaseCount(void *_pStructure)
Definition: orxStructure.h:396
orxU64 u64GUID
Definition: orxStructure.h:165
#define orxFLAG_TEST_ALL(X, F)
Definition: orxDecl.h:399
static orxINLINE orxBOOL orxStructure_TestFlags(const void *_pStructure, orxU32 _u32Flags)
Definition: orxStructure.h:469
static orxINLINE orxSTRUCTURE_ID orxStructure_GetID(const void *_pStructure)
Definition: orxStructure.h:455
#define orxASSERT(TEST,...)
Definition: orxDebug.h:372
orxLINKLIST_NODE stLinkListNode
Definition: orxStructure.h:172
orxU32 u32Flags
Definition: orxStructure.h:167
orxDLLAPI orxSTRUCTURE *orxFASTCALL orxStructure_Get(orxU64 _u64GUID)
orxSTATUS(orxFASTCALL * orxSTRUCTURE_UPDATE_FUNCTION)(orxSTRUCTURE *_pstStructure, const orxSTRUCTURE *_pstCaller, const orxCLOCK_INFO *_pstClockInfo)
Definition: orxStructure.h:181
orxDLLAPI orxSTATUS orxFASTCALL orxStructure_SetParent(void *_pStructure, void *_phParent)
#define orxSTRUCTURE_ASSERT(STRUCTURE)
Definition: orxStructure.h:90
#define orxFLAG_GET(X, M)
Definition: orxDecl.h:413
static orxINLINE void orxStructure_DecreaseCount(void *_pStructure)
Definition: orxStructure.h:412

Generated for orx by doxygen 1.8.11