X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdynamicobjectloader.h;h=687dacaf5363cf74b179a486c017731ae4976451;hb=d8bda96a0aac09774bb1e2a8b57ac2e48a93b3c1;hp=c83d91407f4312520911807d67145cfb63a54282;hpb=794461b9f73a20c086f456459e39a98387060c3a;p=libs%2Fdatafile.git diff --git a/source/dynamicobjectloader.h b/source/dynamicobjectloader.h index c83d914..687daca 100644 --- a/source/dynamicobjectloader.h +++ b/source/dynamicobjectloader.h @@ -2,6 +2,7 @@ #define MSP_DATAFILE_DYNAMICOBJECTLOADER_H_ #include +#include "collection.h" #include "except.h" #include "loader.h" @@ -29,10 +30,11 @@ protected: typedef Msp::TypeRegistry TypeRegistry; - Collection *coll; + Collection *coll = nullptr; + T *object = nullptr; private: - T *object; - Loader *obj_loader; + Loader *obj_loader = nullptr; + void (*store_func)(Collection &, const std::string &, T *) = nullptr; static ActionMap shared_actions; @@ -41,12 +43,17 @@ protected: public: ~DynamicObjectLoader() { delete object; delete obj_loader; } - T *get_object() { T *o = object; object = 0; return o; } private: - virtual void init_actions(); + void init_actions() override; + +public: + T *get_object() { T *o = object; object = 0; return o; } + T *store_object(Collection &, const std::string &); - void type(const Symbol &); +protected: + virtual void type(const Symbol &); +private: template typename std::enable_if::value, typename U::Loader *>::type create_object_loader(U &obj) const; @@ -63,9 +70,7 @@ Loader::ActionMap DynamicObjectLoader::shared_actions; template DynamicObjectLoader::DynamicObjectLoader(Collection *c): - coll(c), - object(0), - obj_loader(0) + coll(c) { set_actions(shared_actions); } @@ -76,6 +81,18 @@ void DynamicObjectLoader::init_actions() add("type", &DynamicObjectLoader::type); } +template +T *DynamicObjectLoader::store_object(Collection &c, const std::string &name) +{ + if(!store_func) + throw std::logic_error("no store function"); + + T *o = object; + store_func(c, name, object); + object = 0; + return o; +} + template void DynamicObjectLoader::type(const Symbol &t) { @@ -110,6 +127,7 @@ void DynamicObjectLoader::CreateObject::operator()(const std::string &, ldr.object = obj; ldr.obj_loader = ldr.create_object_loader(*obj); ldr.add_auxiliary_loader(*ldr.obj_loader); + ldr.store_func = [](Collection &c, const std::string &n, T *o){ c.add(n, static_cast(o)); }; } } // namespace DataFile