Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/util/loading/factory.h @ 4739

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

orxonox/trunk: factory is now registered in Factory, not in Gameloader

File size: 2.6 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 "tinyxml.h"
28#include "load_param.h"
29#include "base_object.h"
30#include "debug.h"
31
32/**
33    Creates a factory to a Loadable Class.
34    this should be used at the beginning of all the Classes that should be loadable (in the cc-file)
35  \todo make factoryName a BaseObject-parameter. (else it would be redundant)
36*/
37#define CREATE_FACTORY(CLASS_NAME) tFactory<CLASS_NAME>* global_##CLASS_NAME##_Factory = new tFactory<CLASS_NAME>(#CLASS_NAME)
38
39//! The Factory is a loadable object handler
40class Factory : public BaseObject {
41
42 public:
43  Factory (const char* factoryName = NULL);
44  ~Factory ();
45
46
47  virtual BaseObject* fabricate(const TiXmlElement* root) = NULL;
48
49  static void registerFactory( Factory* factory);
50  /** \brief sets the Next factory in the list \param nextFactory the next factory */
51  inline void setNext( Factory* nextFactory) { this->next = nextFactory; };
52  /** \returns the first factory */
53  static Factory* getFirst() { return Factory::first; };
54  /** \returns the next factory */
55  Factory* getNext(void) const { return this->next; };
56
57
58  private:
59
60  private:
61    Factory*          next;                 //!< pointer to the next factory.
62    static Factory*   first;                //!< A pointer to the first factory.
63};
64
65/**
66   \brief a factory that is able to load any kind of Object
67   (this is a Functor)
68*/
69template<class T> class tFactory : public Factory
70{
71 public:
72  tFactory(const char* factoryName);
73  virtual ~tFactory();
74
75  private:
76  virtual BaseObject* fabricate(const TiXmlElement* root);
77};
78
79/**
80   \brief construnts a factory with
81   \param factoryName the name of the factory
82*/
83template<class T>
84tFactory<T>::tFactory(const char* factoryName) : Factory(factoryName)
85{
86  PRINTF(5)("Class: %s loadable\n", this->getName());
87}
88
89
90template<class T>
91tFactory<T>::~tFactory()
92{}
93
94template<class T>
95BaseObject* tFactory<T>::fabricate(const TiXmlElement* root)
96{
97  if(!strcmp(root->Value(), this->getName()))
98    return new T ( root);
99  else if( getNext() != NULL)
100    return getNext()->fabricate( root);
101  else
102    return NULL;
103}
104
105#endif /* _FACTORY_H */
106
Note: See TracBrowser for help on using the repository browser.