X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Floader.h;h=5dac2e6b46fd8d35b38f35fafcc3f8cdb3549387;hb=HEAD;hp=24cd7df1a503badc3b09ead5d36438e8307598d2;hpb=a2cce9e933089f483163456e9872e005c33dd678;p=libs%2Fdatafile.git diff --git a/source/loader.h b/source/loader.h index 24cd7df..3fe26e7 100644 --- a/source/loader.h +++ b/source/loader.h @@ -45,17 +45,17 @@ 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() = default; @@ -83,12 +83,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 +119,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) @@ -161,12 +165,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 +180,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); }