1 #ifndef MSP_DATAFILE_DYNAMICOBJECTLOADER_H_
2 #define MSP_DATAFILE_DYNAMICOBJECTLOADER_H_
4 #include <msp/core/typeregistry.h>
14 Loads a dynamically typed object, with the type specified as a statement. The
15 T template parameter is the common base class for all possible loaded types.
17 template<typename T, typename C = Collection>
18 class DynamicObjectLoader: public Loader
27 void operator()(const std::string &, DynamicObjectLoader &) const;
30 typedef Msp::TypeRegistry<CreateObject, DynamicObjectLoader &> TypeRegistry;
37 static ActionMap shared_actions;
40 DynamicObjectLoader(Collection *);
42 ~DynamicObjectLoader() { delete object; delete obj_loader; }
44 T *get_object() { T *o = object; object = 0; return o; }
46 virtual void init_actions();
48 void type(const Symbol &);
51 typename std::enable_if<NeedsCollection<typename U::Loader>::value, typename U::Loader *>::type create_object_loader(U &obj) const;
54 typename std::enable_if<!NeedsCollection<typename U::Loader>::value, typename U::Loader *>::type create_object_loader(U &obj) const;
57 virtual const TypeRegistry &get_type_registry() const = 0;
61 template<typename T, typename C>
62 Loader::ActionMap DynamicObjectLoader<T, C>::shared_actions;
64 template<typename T, typename C>
65 DynamicObjectLoader<T, C>::DynamicObjectLoader(Collection *c):
70 set_actions(shared_actions);
73 template<typename T, typename C>
74 void DynamicObjectLoader<T, C>::init_actions()
76 add("type", &DynamicObjectLoader::type);
79 template<typename T, typename C>
80 void DynamicObjectLoader<T, C>::type(const Symbol &t)
83 throw std::logic_error("duplicate type statement");
85 get_type_registry().invoke(t.name, *this);
88 template<typename T, typename C>
90 typename std::enable_if<NeedsCollection<typename U::Loader>::value, typename U::Loader *>::type DynamicObjectLoader<T, C>::create_object_loader(U &obj) const
93 throw no_collection(typeid(U));
94 return new typename U::Loader(obj, *coll);
97 template<typename T, typename C>
99 typename std::enable_if<!NeedsCollection<typename U::Loader>::value, typename U::Loader *>::type DynamicObjectLoader<T, C>::create_object_loader(U &obj) const
101 return new typename U::Loader(obj);
105 template<typename T, typename C>
107 void DynamicObjectLoader<T, C>::CreateObject<U>::operator()(const std::string &, DynamicObjectLoader &ldr) const
111 ldr.obj_loader = ldr.create_object_loader<U>(*obj);
112 ldr.add_auxiliary_loader(*ldr.obj_loader);
115 } // namespace DataFile