Add current level to another debug message
[supertux.git] / src / supertux / object_factory.hpp
index b734a1f..9e3d2f1 100644 (file)
 #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;
@@ -36,19 +38,19 @@ public:
   /** 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);
   }
 };
 
@@ -58,22 +60,22 @@ public:
   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();
 };