X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fobjectloader.h;h=978366f730e51cc197fe7dd20ab7f56f4b52e84e;hb=fbe7e81c08a6b5a3f9ccdcbeb4dd4d351a5f4226;hp=515ea6b8b81c6d51338735a704f960a0f27b802a;hpb=3eb3c5cce35d3d6193afadecc3707f9c2448f370;p=libs%2Fdatafile.git diff --git a/source/objectloader.h b/source/objectloader.h index 515ea6b..978366f 100644 --- a/source/objectloader.h +++ b/source/objectloader.h @@ -1,13 +1,7 @@ -/* $Id$ - -This file is part of libmspdatafile -Copyright © 2010 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef MSP_DATAFILE_OBJECTLOADER_H_ #define MSP_DATAFILE_OBJECTLOADER_H_ +#include "except.h" #include "loader.h" namespace Msp { @@ -20,7 +14,7 @@ Provides the basic functionality of an object loader. Deriving from this allows loading values directly into member variables of the objects. */ template -class ObjectLoader: public Loader +class ObjectLoader: virtual public Loader { public: typedef O Object; @@ -35,6 +29,27 @@ public: }; +/** +Convenience class for loading derived objects. Inherits from the base class +loader and shadows its members with ones for the derived type. +*/ +template +class DerivedObjectLoader: public B +{ +public: + typedef O Object; + +protected: + O &obj; + + template + DerivedObjectLoader(O &o, Args &&... a): B(o, std::forward(a)...), obj(o) { } + +public: + O &get_object() const { return obj; } +}; + + /** Provides functionality for loading objects with a Collection. Deriving from this allows loading pointers to objects in the collection automatically. @@ -46,7 +61,7 @@ public: typedef C Collection; protected: - C *coll; + C *coll = nullptr; CollectionObjectLoader(O &o, C *c): ObjectLoader(o), coll(c) { } @@ -54,7 +69,7 @@ public: C &get_collection() const { if(!coll) - throw InvalidState("No collection"); + throw no_collection(typeid(O)); return *coll; } };