X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Floader.h;h=cf2b5454b907a038e66745a7ecd7fadf239dcf56;hb=14f031aead619ce8a3fff1c283c3d205d421cd1f;hp=3e39872a5c2f1263d6748a761d28a52baa97e0f7;hpb=42752616c307bfb5a25fda5dae38c5e3d2f21694;p=libs%2Fdatafile.git diff --git a/source/loader.h b/source/loader.h index 3e39872..cf2b545 100644 --- a/source/loader.h +++ b/source/loader.h @@ -33,24 +33,30 @@ 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; bool sub_loaded; bool direct; - std::list aux_loaders; + std::vector aux_loaders; protected: bool check_sub_loads; Loader(); public: - virtual ~Loader(); + virtual ~Loader() { } /** Loads statements from a parser. */ void load(Parser &p); @@ -88,6 +94,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,6 +108,12 @@ 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)); } @@ -112,6 +129,15 @@ protected: template void add(const std::string &k, void (L::*func)(A0, A1, A2, A3, A4)) { add(k, new LoaderFunc5(func)); } +#endif + +#if __cplusplus>=201103L + /** 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 RemoveReference::Type &b0) + { add(k, new LoaderFuncNBound1(func, b0)); } +#endif /** Adds a keyword that is loaded into a member of the loaded object. */ template @@ -166,7 +192,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. */