#ifndef HEADER_SUPERTUX_SUPERTUX_OBJECT_FACTORY_HPP
#define HEADER_SUPERTUX_SUPERTUX_OBJECT_FACTORY_HPP
-#include <map>
#include <assert.h>
+#include <map>
+#include <memory>
#include "supertux/direction.hpp"
+#include "supertux/game_object_ptr.hpp"
#include "util/reader_fwd.hpp"
class Vector;
/** Creates a new gameobject from a lisp node.
* Remember to delete the objects later
*/
- virtual GameObject* create(const Reader& reader) = 0;
+ virtual GameObjectPtr create(const Reader& reader) = 0;
};
template<class C>
class ConcreteObjectFactory : public AbstractObjectFactory
{
public:
- ConcreteObjectFactory() {}
+ ConcreteObjectFactory() {}
~ConcreteObjectFactory() {}
- GameObject* create(const Reader& reader)
+ GameObjectPtr create(const Reader& reader)
{
- return new C(reader);
+ return std::make_shared<C>(reader);
}
};
static ObjectFactory& instance();
private:
- typedef std::map<std::string, AbstractObjectFactory*> Factories;
+ typedef std::map<std::string, std::unique_ptr<AbstractObjectFactory> > Factories;
Factories factories;
public:
ObjectFactory();
~ObjectFactory();
- GameObject* create(const std::string& name, const Reader& reader);
- GameObject* create(const std::string& name, const Vector& pos, const Direction dir = AUTO);
+ GameObjectPtr create(const std::string& name, const Reader& reader);
+ GameObjectPtr create(const std::string& name, const Vector& pos, const Direction dir = AUTO);
private:
template<class C>
void add_factory(const char* name)
{
assert(factories.find(name) == factories.end());
- factories[name] = new ConcreteObjectFactory<C>();
+ factories[name] = std::unique_ptr<AbstractObjectFactory>(new ConcreteObjectFactory<C>());
}
void init_factories();
};