Changeset 5982 in orxonox.OLD for trunk/src/util/loading/factory.cc
- Timestamp:
- Dec 8, 2005, 12:22:53 AM (18 years ago)
- File:
-
- 1 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 }
Note: See TracChangeset
for help on using the changeset viewer.