X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fdynamicobjectloader.h;h=9706c957e7403eba40960e016d79dec1171fb8ac;hb=a2cce9e933089f483163456e9872e005c33dd678;hp=b5830b8c9512a9a95840a6bf57c08f87f25b62ba;hpb=616f6fa9d983da10bf323c45d7a44d94c5a09f1e;p=libs%2Fdatafile.git diff --git a/source/dynamicobjectloader.h b/source/dynamicobjectloader.h index b5830b8..9706c95 100644 --- a/source/dynamicobjectloader.h +++ b/source/dynamicobjectloader.h @@ -31,10 +31,10 @@ protected: typedef Msp::TypeRegistry TypeRegistry; Collection *coll; -private: T *object; +private: Loader *obj_loader; - std::function store_func; + void (*store_func)(Collection &, const std::string &, T *); static ActionMap shared_actions; @@ -48,11 +48,12 @@ private: public: T *get_object() { T *o = object; object = 0; return o; } - void store_object(Collection &, const std::string &); + T *store_object(Collection &, const std::string &); -private: - 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; @@ -70,8 +71,9 @@ Loader::ActionMap DynamicObjectLoader::shared_actions; template DynamicObjectLoader::DynamicObjectLoader(Collection *c): coll(c), - object(0), - obj_loader(0) + object(nullptr), + obj_loader(nullptr), + store_func(nullptr) { set_actions(shared_actions); } @@ -83,13 +85,15 @@ void DynamicObjectLoader::init_actions() } template -void DynamicObjectLoader::store_object(Collection &c, const std::string &name) +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 @@ -126,7 +130,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 = [&ldr](Collection &c, const std::string &n, T *o){ c.add(n, static_cast(o)); }; + ldr.store_func = [](Collection &c, const std::string &n, T *o){ c.add(n, static_cast(o)); }; } } // namespace DataFile