X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=source%2Floader.h;fp=source%2Floader.h;h=207ecff8dff8d7f068aa033994ef2a5e608ba56a;hp=fe928048508d208aafe339def238a4cdc722dc2d;hb=6a033cf0f5164915168f9cb778e801ed86450e1c;hpb=41e78ee91ca058ead90fa1c8ee4339d2ef1b0f31 diff --git a/source/loader.h b/source/loader.h index fe92804..207ecff 100644 --- a/source/loader.h +++ b/source/loader.h @@ -4,6 +4,7 @@ #include #include #include "loaderaction.h" +#include "meta.h" #include "parser.h" #include "statement.h" @@ -149,6 +150,52 @@ protected: }; +#if __cplusplus>=201103L +/** +Loads an object from a file. The object must have a public Loader class. Any +extra arguments are passed to the Loader constructor. +*/ +template +void load(T &obj, const std::string &fn, Args &... args) +{ + IO::BufferedFile in(fn); + + Parser parser(in, fn); + typename T::Loader loader(obj, args...); + loader.load(parser); +} + +/** +Loads an object from a file stored in a collection. The object must havea +public Loader class. The collection is passed to the Loader constructor, +followed by any extra arguments. +*/ +template +void load(T &obj, typename T::Loader::Collection &coll, const std::string &fn, Args &... args) +{ + RefPtr in = coll.open_raw(fn); + + Parser parser(*in, fn); + typename T::Loader loader(obj, coll, args...); + loader.load(parser); +} + +/** +Loads an object from a file stored in a collection. The object must havea +public Loader class. Any extra arguments are passed to the Loader constructor. +*/ +template +typename EnableIf::value, void>::No load(T &obj, C &coll, const std::string &fn, Args &... args) +{ + RefPtr in = coll.open_raw(fn); + + Parser parser(*in, fn); + typename T::Loader loader(obj, args...); + loader.load(parser); +} + +#else + /** Loads an object from a file. The object must have a public Loader class. */ @@ -162,6 +209,10 @@ void load(T &obj, const std::string &fn) loader.load(parser); } +/** +Loads an object from a file, passing one extra argument to the Loader +constructor. The object must have a public Loader class. +*/ template void load(T &obj, const std::string &fn, U &arg) { @@ -171,6 +222,7 @@ void load(T &obj, const std::string &fn, U &arg) typename T::Loader loader(obj, arg); loader.load(parser); } +#endif } // namespace DataFile } // namespace Msp