X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Floader.h;h=926a2a16a4adbf2d542701867a47358ad09a3467;hb=7e81da8d9a6e689e271f4f0450a69d8a14f515bb;hp=02caaaf9ee75dce3ca573cf929611124e551053f;hpb=c308213edfde6e137fde273678c4af2520566826;p=libs%2Fdatafile.git diff --git a/source/loader.h b/source/loader.h index 02caaaf..926a2a1 100644 --- a/source/loader.h +++ b/source/loader.h @@ -1,6 +1,7 @@ #ifndef MSP_DATAFILE_LOADER_H_ #define MSP_DATAFILE_LOADER_H_ +#include #include #include #include "loaderaction.h" @@ -33,12 +34,18 @@ destructor. See also classes ObjectLoader and CollectionObjectLoader in objectloader.h. */ -class Loader +class Loader: private NonCopyable { -private: - typedef std::map ActionMap; +protected: + class ActionMap: public std::map, private NonCopyable + { + public: + ~ActionMap(); + }; - ActionMap actions; +private: + ActionMap local_actions; + ActionMap *actions; Parser *cur_parser; unsigned cur_level; const Statement *cur_st; @@ -50,7 +57,7 @@ protected: Loader(); public: - virtual ~Loader(); + virtual ~Loader() { } /** Loads statements from a parser. */ void load(Parser &p); @@ -88,6 +95,11 @@ protected: /** Processes the current statement's substatements with another Loader. */ void load_sub_with(Loader &); + /** Sets the actions to be used when loading. If the map is empty, + init_actions will be called. */ + void set_actions(ActionMap &); + virtual void init_actions() { } + /** Adds a keyword that is loaded by calling a function. */ template void add(const std::string &k, void (L::*func)()) @@ -97,28 +109,15 @@ protected: void add(const std::string &k, void (L::*func)(A0)) { add(k, new LoaderFunc1(func)); } -#if __cplusplus>=201103L template void add(const std::string &k, void (L::*func)(Args...)) { add(k, new LoaderFuncN(func)); } -#else - template - void add(const std::string &k, void (L::*func)(A0, A1)) - { add(k, new LoaderFunc2(func)); } - - template - void add(const std::string &k, void (L::*func)(A0, A1, A2)) - { add(k, new LoaderFunc3(func)); } - - template - void add(const std::string &k, void (L::*func)(A0, A1, A2, A3)) - { add(k, new LoaderFunc4(func)); } - - template - void add(const std::string &k, void (L::*func)(A0, A1, A2, A3, A4)) - { add(k, new LoaderFunc5(func)); } -#endif + /** Adds a keyword that is loaded by calling a function with a bound + first argument. */ + template + void add(const std::string &k, void (L::*func)(B0, Args...), const typename std::remove_reference::type &b0) + { add(k, new LoaderFuncNBound1(func, b0)); } /** Adds a keyword that is loaded into a member of the loaded object. */ template @@ -157,7 +156,6 @@ 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. @@ -173,7 +171,7 @@ void load(T &obj, const std::string &fn, Args &... args) } /** -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. The collection is passed to the Loader constructor, followed by any extra arguments. */ @@ -194,7 +192,7 @@ 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) +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) @@ -205,36 +203,6 @@ typename EnableIf::value, void>::No load(T & loader.load(parser); } -#else - -/** -Loads an object from a file. The object must have a public Loader class. -*/ -template -void load(T &obj, const std::string &fn) -{ - IO::BufferedFile in(fn); - - Parser parser(in, fn); - typename T::Loader loader(obj); - 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) -{ - IO::BufferedFile in(fn); - - Parser parser(in, fn); - typename T::Loader loader(obj, arg); - loader.load(parser); -} -#endif - } // namespace DataFile } // namespace Msp