Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/powerups/src/util/loading/factory.cc @ 5985

Last change on this file since 5985 was 5985, checked in by manuel, 18 years ago

merge: factory has now create from class name string function (svn merge -r 5955:HEAD ../trunk/ powerups/)

File size: 3.7 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Christian Meyer
13   co-programmer: Benjamin Grauer
14*/
15#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_LOADING
16
17#include "factory.h"
18
19//#include "shell_command.h"
20
21using namespace std;
22
23//SHELL_COMMAND(create, Factory, fabricate);
24
25
26/*  --------------------------------------------------
27 *               Factory
28 *   --------------------------------------------------
29 */
30
31/**
32 *  constructor
33
34   set everything to zero and define factoryName
35*/
36Factory::Factory (const char* factoryName, ClassID classID)
37{
38  this->setClassID(CL_FACTORY, "Factory");
39  this->setName(factoryName);
40
41  this->classID = classID;
42  this->className = factoryName;
43
44  if( Factory::factoryList == NULL)
45    Factory::factoryList = new std::list<Factory*>;
46
47  Factory::factoryList->push_back(this);
48}
49
50/** a reference to the First Factory */
51std::list<Factory*>* Factory::factoryList = NULL;
52
53/**
54 *  destructor
55 *
56 * clear the Q
57 */
58Factory::~Factory ()
59{
60  //  printf("%s\n", this->factoryName);
61  //  Factory* tmpDel = this->next;
62  //  this->next = NULL;
63}
64
65void 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
80/**
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 */
85bool Factory::operator==(const char* className) const
86{
87  return(className != NULL && !strcmp(className, this->className));
88}
89
90
91BaseObject* 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())
102  {
103    PRINTF(4)("Create a new Object of type %s\n", (*factory)->getName());
104    return (*factory)->fabricateObject(root);
105  }
106  else
107  {
108    PRINTF(2)("Could not Fabricate an Object of Class '%s'\n", root->Value());
109    return NULL;
110  }
111}
112
113BaseObject* Factory::fabricate(const char* className)
114{
115  if (className == NULL || Factory::factoryList == NULL)
116    return NULL;
117
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())
124  {
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;
132  }
133}
134
135
136BaseObject* 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 TracBrowser for help on using the repository browser.