X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Floader.h;h=5b96cb0954812f2f17ec1d01e4b1260f8c0cf2a4;hb=refs%2Fheads%2Fwip;hp=926a2a16a4adbf2d542701867a47358ad09a3467;hpb=7e81da8d9a6e689e271f4f0450a69d8a14f515bb;p=libs%2Fdatafile.git diff --git a/source/loader.h b/source/loader.h index 926a2a1..5b96cb0 100644 --- a/source/loader.h +++ b/source/loader.h @@ -6,6 +6,7 @@ #include #include "loaderaction.h" #include "meta.h" +#include "mspdatafile_api.h" #include "parser.h" #include "statement.h" @@ -34,10 +35,10 @@ destructor. See also classes ObjectLoader and CollectionObjectLoader in objectloader.h. */ -class Loader: private NonCopyable +class MSPDATAFILE_API Loader: private NonCopyable { protected: - class ActionMap: public std::map, private NonCopyable + class MSPDATAFILE_API ActionMap: public std::map, private NonCopyable { public: ~ActionMap(); @@ -45,19 +46,19 @@ protected: private: ActionMap local_actions; - ActionMap *actions; - Parser *cur_parser; - unsigned cur_level; - const Statement *cur_st; - bool sub_loaded; - bool direct; + ActionMap *actions = nullptr; + Parser *cur_parser = nullptr; + unsigned cur_level = 0; + const Statement *cur_st = nullptr; + bool sub_loaded = false; + bool direct = false; std::vector aux_loaders; protected: - bool check_sub_loads; + bool check_sub_loads = false; - Loader(); + Loader() = default; public: - virtual ~Loader() { } + virtual ~Loader() = default; /** Loads statements from a parser. */ void load(Parser &p); @@ -83,12 +84,12 @@ protected: } /** Loads a sub-object from the statement being processed with an extra - parameter for the Loader. The Loader class of the sub-object is + arguments for the Loader. The Loader class of the sub-object is automatically used. */ - template - void load_sub(S &s, T &p) + template + void load_sub(S &s, Args &&... args) { - typename S::Loader ldr(s, p); + typename S::Loader ldr(s, std::forward(args)...); load_sub_with(ldr); } @@ -119,6 +120,10 @@ protected: void add(const std::string &k, void (L::*func)(B0, Args...), const typename std::remove_reference::type &b0) { add(k, new LoaderFuncNBound1(func, b0)); } + template + void add(const std::string &k, void (L::*func)(B0, Args...), B0 &&b0) + { add(k, new LoaderFuncNBound1(func, std::forward(b0))); } + /** Adds a keyword that is loaded into a member of the loaded object. */ template void add(const std::string &k, T0 L::*p0) @@ -130,7 +135,7 @@ protected: /** Adds a keyword that is recognized but ignored. */ void add(const std::string &k) - { add(k, 0); } + { add(k, nullptr); } private: void add(const std::string &, LoaderAction *); @@ -161,12 +166,12 @@ 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) +void load(T &obj, const std::string &fn, Args &&... args) { IO::BufferedFile in(fn); Parser parser(in, fn); - typename T::Loader loader(obj, args...); + typename T::Loader loader(obj, std::forward(args)...); loader.load(parser); } @@ -176,30 +181,30 @@ 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) +void load(T &obj, typename T::Loader::Collection &coll, const std::string &fn, Args &&... args) { RefPtr in = coll.open_raw(fn); if(!in) throw IO::file_not_found(fn); Parser parser(*in, fn); - typename T::Loader loader(obj, coll, args...); + typename T::Loader loader(obj, coll, std::forward(args)...); loader.load(parser); } /** -Loads an object from a file stored in a collection. The object must havea +Loads an object from a file stored in a collection. The object must have a public Loader class. Any extra arguments are passed to the Loader constructor. */ template -typename std::enable_if::value>::type load(T &obj, C &coll, const std::string &fn, Args &... args) +typename std::enable_if::value>::type load(T &obj, C &coll, const std::string &fn, Args &&... args) { RefPtr in = coll.open_raw(fn); if(!in) throw IO::file_not_found(fn); Parser parser(*in, fn); - typename T::Loader loader(obj, args...); + typename T::Loader loader(obj, std::forward(args)...); loader.load(parser); }