From: Mikko Rasa Date: Fri, 24 May 2019 17:25:39 +0000 (+0300) Subject: Add more flexible versions of the load function X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=commitdiff_plain;h=6a033cf0f5164915168f9cb778e801ed86450e1c;hp=41e78ee91ca058ead90fa1c8ee4339d2ef1b0f31 Add more flexible versions of the load function Firstly there's a variadic version of the basic load function. Secondly and perhaps more importantly there are versions which can load an object from a file stored in a collection. All of these are only implemented for C++11 for now, since supporting the old version seems increasingly irrelevant. --- 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