|
From: <sik...@us...> - 2006-05-22 23:40:00
|
Revision: 59 Author: sik0fewl Date: 2006-05-22 16:39:47 -0700 (Mon, 22 May 2006) ViewCVS: http://svn.sourceforge.net/perceptioncrash/?rev=59&view=rev Log Message: ----------- Abstract Factory class. Still needs some work. Modified Paths: -------------- trunk/perceptioncrash/src/KeyboardMouseInputController.cpp trunk/perceptioncrash/src/KeyboardMouseInputController.hpp Added Paths: ----------- trunk/perceptioncrash/src/Factory.hpp Added: trunk/perceptioncrash/src/Factory.hpp =================================================================== --- trunk/perceptioncrash/src/Factory.hpp (rev 0) +++ trunk/perceptioncrash/src/Factory.hpp 2006-05-22 23:39:47 UTC (rev 59) @@ -0,0 +1,61 @@ +#ifndef PC_FACTORY_HPP +#define PC_FACTORY_HPP + +#include <map> +#include <string> +#include <stdexcept> + +#include "tinyxml/tinyxml.h" + +template <typename T> +class Factory +{ + public: + typedef T*(*CreatorFuncPtr)(); + + private: + typedef std::map<std::string, CreatorFuncPtr> CreatorMap; + CreatorMap creators; + + public: + void register_(std::string const &id, CreatorFuncPtr creator) + { + creators.insert(std::make_pair(id, creator)); + } + + T* create(std::string const &id) + { + typename CreatorMap::iterator i = creators.find(id); + + if (i != creators.end()) + return i->second(); + else + throw std::runtime_error("Factory for '" + id + "' does not exist"); + } +}; + +template <typename T> Factory<T>& factory() +{ + static Factory<T> factory_; + return factory_; +} + +template <typename T, typename U> T* +new_creator() +{ + return new U; +} + +template <typename T, typename U> +struct RegisterFactory +{ + typedef Factory<T> FactoryType; + + RegisterFactory(std::string const &id) + { + factory<T>().register_(id, static_cast<T* (*)()>(&new_creator<T, U>)); + } +}; + + +#endif /* PC_FACTORY_HPP */ Property changes on: trunk/perceptioncrash/src/Factory.hpp ___________________________________________________________________ Name: svn:keywords + Id Name: svn:eol-style + native Modified: trunk/perceptioncrash/src/KeyboardMouseInputController.cpp =================================================================== --- trunk/perceptioncrash/src/KeyboardMouseInputController.cpp 2006-05-22 08:22:17 UTC (rev 58) +++ trunk/perceptioncrash/src/KeyboardMouseInputController.cpp 2006-05-22 23:39:47 UTC (rev 59) @@ -1,7 +1,13 @@ #include <Ogre.h> +#include <iostream> + #include "KeyboardMouseInputController.hpp" +namespace { + RegisterFactory<InputController, KeyboardMouseInputController> KeyboardMouseInputControllerFactory("KeyboardMouseInputController"); +} + KeyboardMouseInputController::KeyboardMouseInputController() { /// @todo this can be implemented with events(current) or unbuffered input. @@ -9,9 +15,13 @@ InputManager* inputManager = InputManager::getSingletonPtr(); inputManager->getEventProcessor()->addKeyListener(this); inputManager->getEventProcessor()->addMouseMotionListener(this); +} - /// @todo Remove this. This is just for testing. - mKeyboardMap.insert(std::pair<int, Button>(Ogre::KC_SPACE, "select")); +KeyboardMouseInputController::KeyboardMouseInputController(TiXmlElement* node) +{ + KeyboardMouseInputController(); + + // create from xml node } KeyboardMouseInputController::~KeyboardMouseInputController() Modified: trunk/perceptioncrash/src/KeyboardMouseInputController.hpp =================================================================== --- trunk/perceptioncrash/src/KeyboardMouseInputController.hpp 2006-05-22 08:22:17 UTC (rev 58) +++ trunk/perceptioncrash/src/KeyboardMouseInputController.hpp 2006-05-22 23:39:47 UTC (rev 59) @@ -6,6 +6,7 @@ #include "InputManager.hpp" #include "InputController.hpp" +#include "Factory.hpp" class KeyboardMouseInputController : public InputController, public Ogre::KeyListener, @@ -14,6 +15,7 @@ { public: KeyboardMouseInputController(); + KeyboardMouseInputController(TiXmlElement* node); ~KeyboardMouseInputController(); bool isButtonDown(Button button); @@ -49,4 +51,5 @@ std::multimap<int, Button> mMouseMap; }; + #endif /* PC_KEYBOARD_MOUSE_INPUT_CONTROLLER_HPP */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |