]> git.tdb.fi Git - libs/datafile.git/commitdiff
Add support for storing the loaded object in DynamicObjectLoader
authorMikko Rasa <tdb@tdb.fi>
Tue, 5 Oct 2021 22:00:48 +0000 (01:00 +0300)
committerMikko Rasa <tdb@tdb.fi>
Tue, 5 Oct 2021 22:00:48 +0000 (01:00 +0300)
This allows the object to be stored in the collection using its actual
type rather than the base class.

source/dynamicobjectloader.h

index c83d91407f4312520911807d67145cfb63a54282..b5830b8c9512a9a95840a6bf57c08f87f25b62ba 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_DATAFILE_DYNAMICOBJECTLOADER_H_
 
 #include <msp/core/typeregistry.h>
+#include "collection.h"
 #include "except.h"
 #include "loader.h"
 
@@ -33,6 +34,7 @@ protected:
 private:
        T *object;
        Loader *obj_loader;
+       std::function<void(Collection &, const std::string &, T *)> store_func;
 
        static ActionMap shared_actions;
 
@@ -41,10 +43,14 @@ protected:
 public:
        ~DynamicObjectLoader() { delete object; delete obj_loader; }
 
-       T *get_object() { T *o = object; object = 0; return o; }
 private:
        virtual void init_actions();
 
+public:
+       T *get_object() { T *o = object; object = 0; return o; }
+       void store_object(Collection &, const std::string &);
+
+private:
        void type(const Symbol &);
 
        template<typename U>
@@ -76,6 +82,16 @@ void DynamicObjectLoader<T, C>::init_actions()
        add("type", &DynamicObjectLoader::type);
 }
 
+template<typename T, typename C>
+void DynamicObjectLoader<T, C>::store_object(Collection &c, const std::string &name)
+{
+       if(!store_func)
+               throw std::logic_error("no store function");
+
+       store_func(c, name, object);
+       object = 0;
+}
+
 template<typename T, typename C>
 void DynamicObjectLoader<T, C>::type(const Symbol &t)
 {
@@ -110,6 +126,7 @@ void DynamicObjectLoader<T, C>::CreateObject<U>::operator()(const std::string &,
        ldr.object = obj;
        ldr.obj_loader = ldr.create_object_loader<U>(*obj);
        ldr.add_auxiliary_loader(*ldr.obj_loader);
+       ldr.store_func = [&ldr](Collection &c, const std::string &n, T *o){ c.add(n, static_cast<U *>(o)); };
 }
 
 } // namespace DataFile