definitionmgr.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*
  2. ** Command & Conquer Generals(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /***********************************************************************************************
  19. *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : WWSaveLoad *
  23. * *
  24. * $Archive:: /Commando/Code/wwsaveload/definitionmgr.h $*
  25. * *
  26. * Author:: Patrick Smith *
  27. * *
  28. * $Modtime:: 8/24/01 5:13p $*
  29. * *
  30. * $Revision:: 24 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #if defined(_MSC_VER)
  36. #pragma once
  37. #endif
  38. #ifndef __DEFINITION_MGR_H
  39. #define __DEFINITION_MGR_H
  40. #include "always.h"
  41. #include "saveload.h"
  42. #include "saveloadsubsystem.h"
  43. #include "saveloadids.h"
  44. #include "wwdebug.h"
  45. #include "wwstring.h"
  46. #include "hashtemplate.h"
  47. #include "vector.h"
  48. // Forward declarations
  49. class DefinitionClass;
  50. //////////////////////////////////////////////////////////////////////////////////
  51. // Global declarations
  52. //////////////////////////////////////////////////////////////////////////////////
  53. extern class DefinitionMgrClass _TheDefinitionMgr;
  54. //////////////////////////////////////////////////////////////////////////////////
  55. //
  56. // DefinitionMgrClass
  57. //
  58. //////////////////////////////////////////////////////////////////////////////////
  59. class DefinitionMgrClass : public SaveLoadSubSystemClass
  60. {
  61. public:
  62. /////////////////////////////////////////////////////////////////////
  63. // Public constructors/destructors
  64. /////////////////////////////////////////////////////////////////////
  65. DefinitionMgrClass (void);
  66. ~DefinitionMgrClass (void);
  67. /////////////////////////////////////////////////////////////////////
  68. // Public methods
  69. /////////////////////////////////////////////////////////////////////
  70. // From SaveLoadSubSystemClass
  71. virtual uint32 Chunk_ID (void) const;
  72. // Type identification
  73. static DefinitionClass * Find_Definition (uint32 id, bool twiddle = true);
  74. static DefinitionClass * Find_Named_Definition (const char *name, bool twiddle = true);
  75. static DefinitionClass * Find_Typed_Definition (const char *name, uint32 class_id, bool twiddle = true);
  76. static void List_Available_Definitions (void);
  77. static void List_Available_Definitions (int superclass_id);
  78. static uint32 Get_New_ID (uint32 class_id);
  79. // Definition registration
  80. static void Register_Definition (DefinitionClass *definition);
  81. static void Unregister_Definition (DefinitionClass *definition);
  82. //
  83. // Definition enumeration
  84. //
  85. typedef enum
  86. {
  87. ID_CLASS = 1,
  88. ID_SUPERCLASS,
  89. } ID_TYPE;
  90. static DefinitionClass * Get_First (void);
  91. static DefinitionClass * Get_First (uint32 id, ID_TYPE type = ID_CLASS);
  92. static DefinitionClass * Get_Next (DefinitionClass *curr_def);
  93. static DefinitionClass * Get_Next (DefinitionClass *curr_def, uint32 id, ID_TYPE type = ID_CLASS);
  94. static void Free_Definitions (void);
  95. protected:
  96. /////////////////////////////////////////////////////////////////////
  97. // Protected methods
  98. /////////////////////////////////////////////////////////////////////
  99. // From SaveLoadSubSystemClass
  100. virtual bool Contains_Data (void) const;
  101. virtual bool Save (ChunkSaveClass &csave);
  102. virtual bool Load (ChunkLoadClass &cload);
  103. virtual const char* Name (void) const { return "DefinitionMgrClass"; }
  104. // Persistence methods
  105. bool Save_Objects (ChunkSaveClass &csave);
  106. bool Load_Objects (ChunkLoadClass &cload);
  107. bool Save_Variables (ChunkSaveClass &csave);
  108. bool Load_Variables (ChunkLoadClass &cload);
  109. private:
  110. static HashTemplateClass<StringClass, DynamicVectorClass<DefinitionClass*>*>* DefinitionHash;
  111. /////////////////////////////////////////////////////////////////////
  112. // Private methods
  113. /////////////////////////////////////////////////////////////////////
  114. static void Prepare_Definition_Array (void);
  115. static int __cdecl fnCompareDefinitionsCallback (const void *elem1, const void *elem2);
  116. /////////////////////////////////////////////////////////////////////
  117. // Static member data
  118. /////////////////////////////////////////////////////////////////////
  119. static DefinitionClass ** _SortedDefinitionArray;
  120. static int _MaxDefinitionCount;
  121. static int _DefinitionCount;
  122. /////////////////////////////////////////////////////////////////////
  123. // Friend classes
  124. /////////////////////////////////////////////////////////////////////
  125. friend class DefinitionClass;
  126. };
  127. /////////////////////////////////////////////////////////////////////
  128. // Chunk_ID
  129. /////////////////////////////////////////////////////////////////////
  130. inline uint32
  131. DefinitionMgrClass::Chunk_ID (void) const
  132. {
  133. return CHUNKID_SAVELOAD_DEFMGR;
  134. }
  135. /////////////////////////////////////////////////////////////////////
  136. // Contains_Data
  137. /////////////////////////////////////////////////////////////////////
  138. inline bool
  139. DefinitionMgrClass::Contains_Data (void) const
  140. {
  141. return true; // TODO: check if we have any definitions...
  142. }
  143. /////////////////////////////////////////////////////////////////////
  144. // Get_First_Definition
  145. /////////////////////////////////////////////////////////////////////
  146. inline DefinitionClass *
  147. DefinitionMgrClass::Get_First (void)
  148. {
  149. DefinitionClass *definition = NULL;
  150. if (_DefinitionCount > 0) {
  151. definition = _SortedDefinitionArray[0];
  152. }
  153. return definition;
  154. }
  155. #endif //__DEFINITION_MGR_H