Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/spaceshipcontrol/src/util/loading/factory.h @ 6691

Last change on this file since 6691 was 6341, checked in by bensch, 19 years ago

orxonox/trunk: merged the network branche back to the trunk, so we do not get away from each other to fast

File size: 2.5 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
16/*!
17 * @file factory.h
18 * @brief A loadable object handler
19*/
20
21
22#ifndef _FACTORY_H
23#define _FACTORY_H
24
25class BaseObject;
26
27#include "parser/tinyxml/tinyxml.h"
28#include "base_object.h"
29#include "debug.h"
30#include <vector>
31#include <list>
32
33/**
34 * Creates a factory to a Loadable Class.
35 * this should be used at the beginning of all the Classes that should be loadable (in the cc-file)
36*/
37#define CREATE_FACTORY(CLASS_NAME, CLASS_ID) \
38    tFactory<CLASS_NAME>* global_##CLASS_NAME##_Factory = new tFactory<CLASS_NAME>(#CLASS_NAME, CLASS_ID)
39
40//! The Factory is a loadable object handler
41class Factory : public BaseObject {
42
43 public:
44  Factory (const char* factoryName, ClassID classID);
45  virtual ~Factory ();
46
47  static void deleteFactories();
48
49  static  BaseObject* fabricate(const char* className);
50  static  BaseObject* fabricate(ClassID classID);
51  static  BaseObject* fabricate(const TiXmlElement* root = NULL);
52
53
54  bool operator==(ClassID classID) const;
55  bool operator==(const char* className) const;
56
57  protected:
58    virtual BaseObject* fabricateObject(const TiXmlElement* root = NULL) const = 0;
59
60  protected:
61    ClassID                       classID;              //!< The Class-Identifyer of the Factory.
62    const char*                   className;            //!< The name of the Class.
63    static std::list<Factory*>*   factoryList;          //!< List of Registered Factories
64};
65
66/**
67 *  a factory that is able to load any kind of Object
68 * (this is a Functor)
69 */
70template<class T> class tFactory : public Factory
71{
72 public:
73 /**
74  * creates a new type Factory to enable the loading of T
75  * @param factoryName the Name of the Factory to load.
76  * @param classID the ID of the Class to be created.
77  */
78  tFactory (const char* factoryName, ClassID classID)
79   : Factory(factoryName, classID)
80  {  }
81
82  private:
83   /**
84    * fabricates an Object of type T, with the constructor T::T(const TiXmlElemnt*)
85    * @param root the TiXmlElement T should load parameters from.
86    * @return the newly fabricated T.
87    */
88    virtual BaseObject* fabricateObject(const TiXmlElement* root = NULL) const
89    {
90      return new T(root);
91    }
92};
93
94#endif /* _FACTORY_H */
95
Note: See TracBrowser for help on using the repository browser.