Changeset 5982 in orxonox.OLD for trunk/src/util/loading
- Timestamp:
- Dec 8, 2005, 12:22:53 AM (19 years ago)
- Location:
- trunk/src/util/loading
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/util/loading/factory.cc
r5750 r5982 13 13 co-programmer: Benjamin Grauer 14 14 */ 15 15 #define DEBUG_SPECIAL_MODULE DEBUG_MODULE_LOADING 16 16 17 17 #include "factory.h" 18 18 19 #include "shell_command.h"20 #include "game_loader.h" 19 //#include "shell_command.h" 20 21 21 using namespace std; 22 22 23 SHELL_COMMAND(create, Factory, fabricate);23 //SHELL_COMMAND(create, Factory, fabricate); 24 24 25 25 … … 39 39 this->setName(factoryName); 40 40 41 this->next = NULL;42 41 this->classID = classID; 42 this->className = factoryName; 43 43 44 Factory::registerFactory(this); 44 if( Factory::factoryList == NULL) 45 Factory::factoryList = new std::list<Factory*>; 46 47 Factory::factoryList->push_back(this); 45 48 } 46 49 47 50 /** a reference to the First Factory */ 48 Factory* Factory::first = NULL;51 std::list<Factory*>* Factory::factoryList = NULL; 49 52 50 53 /** 51 54 * destructor 52 53 54 */55 * 56 * clear the Q 57 */ 55 58 Factory::~Factory () 56 59 { … … 58 61 // Factory* tmpDel = this->next; 59 62 // this->next = NULL; 60 if (this->next)61 delete this->next;62 63 } 63 64 65 void Factory::deleteFactories() 66 { 67 if (Factory::factoryList != NULL) 68 { 69 while(!Factory::factoryList->empty()) 70 { 71 delete Factory::factoryList->front(); 72 Factory::factoryList->pop_front(); 73 } 74 delete Factory::factoryList; 75 Factory::factoryList = NULL; 76 } 77 } 78 79 64 80 /** 65 * add a Factory to the Factory Queue 66 * @param factory a Factory to be registered 67 */ 68 void Factory::registerFactory( Factory* factory) 81 * Compares the Factories Name against a given ClassName 82 * @param className the Name of the Class to Query 83 * @returns true on match, false otherwise. 84 */ 85 bool Factory::operator==(const char* className) const 69 86 { 70 assert( factory != NULL); 87 return(className != NULL && !strcmp(className, this->className)); 88 } 71 89 72 PRINTF(5)("Registered factory for '%s'\n", factory->getName());73 90 74 if( Factory::first == NULL) 91 BaseObject* Factory::fabricate(const TiXmlElement* root) 92 { 93 if (root == NULL || Factory::factoryList == NULL) 94 return NULL; 95 96 std::list<Factory*>::const_iterator factory; 97 for (factory = Factory::factoryList->begin(); factory != Factory::factoryList->end(); factory++) 98 if (*(*factory) == root->Value()) 99 break; 100 101 if (factory != Factory::factoryList->end()) 75 102 { 76 Factory::first = factory; 103 PRINTF(4)("Create a new Object of type %s\n", (*factory)->getName()); 104 return (*factory)->fabricateObject(root); 77 105 } 78 106 else 79 107 { 80 Factory* tmpFac = Factory::first; 81 while( tmpFac->next != NULL) 82 { 83 tmpFac = tmpFac->next; 84 } 85 tmpFac->setNext(factory); 108 PRINTF(2)("Could not Fabricate an Object of Class '%s'\n", root->Value()); 109 return NULL; 86 110 } 87 111 } 88 112 89 void Factory::fabricate(const char* className, const char* entityName)113 BaseObject* Factory::fabricate(const char* className) 90 114 { 91 if (className == NULL) 92 return; 93 Factory* fac = Factory::first; 115 if (className == NULL || Factory::factoryList == NULL) 116 return NULL; 94 117 95 while (fac != NULL) 118 std::list<Factory*>::const_iterator factory; 119 for (factory = Factory::factoryList->begin(); factory != Factory::factoryList->end(); factory++) 120 if (*(*factory) == className) 121 break; 122 123 if (factory != Factory::factoryList->end()) 96 124 { 97 if (!strcmp(className, fac->getName())) 98 { 99 PRINTF(3)("Create a new Object of type %s\n", fac->getName()); 100 BaseObject* object = fac->fabricateDirect(); 101 if (object != NULL) 102 { 103 object->setName(entityName); 104 } 105 break; 106 } 107 fac = fac->next; 125 PRINTF(4)("Create a new Object of type %s\n", (*factory)->getName()); 126 return (*factory)->fabricateObject(NULL); 127 } 128 else 129 { 130 PRINTF(2)("Could not Fabricate an Object of Class '%s'\n", className); 131 return NULL; 108 132 } 109 133 } 134 135 136 BaseObject* Factory::fabricate(ClassID classID) 137 { 138 if (Factory::factoryList == NULL) 139 return NULL; 140 141 std::list<Factory*>::const_iterator factory; 142 for (factory = Factory::factoryList->begin(); factory != Factory::factoryList->end(); factory++) 143 if (*(*factory) == classID) 144 break; 145 146 if (factory != Factory::factoryList->end()) 147 { 148 PRINTF(4)("Create a new Object of type %s\n", (*factory)->getName()); 149 return (*factory)->fabricateObject(NULL); 150 } 151 else 152 { 153 PRINTF(2)("Could not Fabricate an Object of ClassID '%h'\n", classID); 154 return NULL; 155 } 156 } -
trunk/src/util/loading/factory.h
r5944 r5982 28 28 #include "base_object.h" 29 29 #include "debug.h" 30 #include <vector> 30 31 31 32 /** … … 40 41 41 42 public: 42 Factory (const char* factoryName = NULL, ClassID classID = CL_NULL);43 Factory (const char* factoryName, ClassID classID); 43 44 virtual ~Factory (); 44 45 45 void fabricate(const char* className, const char* entityName); 46 virtual BaseObject* fabricate(ClassID classID) = NULL; 47 virtual BaseObject* fabricate(const TiXmlElement* root) = NULL; 48 virtual BaseObject* fabricateDirect() = NULL; 46 static void deleteFactories(); 49 47 50 static void registerFactory( Factory* factory); 51 /** @returns the first factory */ 52 static Factory* getFirst() { return Factory::first; }; 48 static BaseObject* fabricate(const char* className); 49 static BaseObject* fabricate(ClassID classID); 50 static BaseObject* fabricate(const TiXmlElement* root = NULL); 51 52 bool operator==(ClassID classID) const { return (this->classID == classID); }; 53 bool operator==(const char* className) const; 53 54 54 55 protected: 55 /** sets the Next factory in the list @param nextFactory the next factory */ 56 inline void setNext( Factory* nextFactory) { this->next = nextFactory; }; 57 /** @returns the next factory */ 58 Factory* getNext() const { return this->next; }; 59 56 virtual BaseObject* fabricateObject(const TiXmlElement* root = NULL) const = 0; 60 57 61 58 protected: 62 ClassID classID; //!< The CLass-Identifyer of the Factory. 63 64 private: 65 Factory* next; //!< pointer to the next factory. 66 static Factory* first; //!< A pointer to the first factory. 59 ClassID classID; //!< The Class-Identifyer of the Factory. 60 const char* className; //!< The name of the Class. 61 static std::list<Factory*>* factoryList; //!< List of Registered Factories 67 62 }; 68 63 … … 73 68 template<class T> class tFactory : public Factory 74 69 { 75 public: 76 tFactory(const char* factoryName, ClassID classID); 77 virtual ~tFactory(); 70 public: 71 tFactory (const char* factoryName, ClassID classID) 72 : Factory(factoryName, classID) 73 { 74 } 78 75 79 76 private: 80 virtual BaseObject* fabricate(ClassID classID); 81 virtual BaseObject* fabricate(const TiXmlElement* root); 82 virtual BaseObject* fabricateDirect(); 77 /** 78 * fabricates an Object of type T, with the constructor T::T(const TiXmlElemnt*) 79 * @param root the TiXmlElement T should load parameters from. 80 * @return the newly fabricated T. 81 */ 82 virtual BaseObject* fabricateObject(const TiXmlElement* root = NULL) const 83 { 84 return new T(root); 85 } 83 86 }; 84 85 /**86 * construnts a factory with87 * @param factoryName the name of the factory88 */89 template<class T>90 tFactory<T>::tFactory(const char* factoryName, ClassID classID) : Factory(factoryName, classID)91 {92 PRINTF(4)("Class: %s loadable\n", this->getName());93 }94 95 /**96 * destructs the type-Factory97 */98 template<class T>99 tFactory<T>::~tFactory()100 {}101 102 /**103 * fabricates an Object of type T, with the constructor T::T(const TiXmlElemnt*)104 * @param root the TiXmlElement T should load parameters from.105 * @return the newly fabricated T, NULL otherwise.106 */107 template<class T>108 BaseObject* tFactory<T>::fabricate(const TiXmlElement* root)109 {110 if (root == NULL)111 return NULL;112 113 if(!strcmp(root->Value(), this->getName()))114 return new T ( root);115 else if( getNext() != NULL)116 return getNext()->fabricate( root);117 else118 return NULL;119 }120 121 122 /**123 * fabricates an Object of type T, with the constructor T::T(const TiXmlElemnt*)124 * @param classID the ClassID of T that should be created.125 * @return the newly fabricated T if fabricated NULL otherwise.126 */127 template<class T>128 BaseObject* tFactory<T>::fabricate(ClassID classID)129 {130 if(classID == this->classID)131 return this->fabricateDirect();132 else if( getNext() != NULL)133 return getNext()->fabricate( classID);134 else135 return NULL;136 }137 138 /**139 * directly fabricate an Entity of this factory.140 */141 template<class T>142 BaseObject* tFactory<T>::fabricateDirect()143 {144 return new T((const TiXmlElement*)NULL);145 }146 87 147 88 #endif /* _FACTORY_H */ -
trunk/src/util/loading/game_loader.cc
r5819 r5982 331 331 this->currentCampaign->previousLevel(); 332 332 } 333 334 /**335 * load a StoryEntity336 * @param element a XMLElement containing all the needed info337 */338 BaseObject* GameLoader::fabricate(const TiXmlElement* element)339 {340 assert( element != NULL);341 342 if( Factory::getFirst() == NULL)343 {344 PRINTF(1)("GameLoader does not know any factories, fabricate() failed\n");345 return NULL;346 }347 348 if( element->Value() != NULL)349 {350 PRINTF(4)("Attempting fabrication of a '%s'\n", element->Value());351 BaseObject* b = Factory::getFirst()->fabricate( element);352 if( b == NULL)353 PRINTF(2)("Failed to fabricate a '%s'\n", element->Value());354 else355 PRINTF(4)("Successfully fabricated a '%s'\n", element->Value());356 return b;357 }358 359 PRINTF(2)("Fabricate failed, TiElement did not contain a value\n");360 361 return NULL;362 } -
trunk/src/util/loading/game_loader.h
r5819 r5982 60 60 ErrorMessage loadDebugCampaign(Uint32 campaignID); 61 61 62 void registerFactory( Factory* factory );63 BaseObject* fabricate(const TiXmlElement* data);64 65 62 void process(const Event &event); 66 63
Note: See TracChangeset
for help on using the changeset viewer.