X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Floader.h;h=9736d269d90ffdde9e83ea7a835032cad98ebd16;hb=82e19fd15e24f913fba0cf8a4fb0352f282c3389;hp=02caaaf9ee75dce3ca573cf929611124e551053f;hpb=c308213edfde6e137fde273678c4af2520566826;p=libs%2Fdatafile.git diff --git a/source/loader.h b/source/loader.h index 02caaaf..9736d26 100644 --- a/source/loader.h +++ b/source/loader.h @@ -33,12 +33,14 @@ destructor. See also classes ObjectLoader and CollectionObjectLoader in objectloader.h. */ -class Loader +class Loader: private NonCopyable { -private: +protected: typedef std::map ActionMap; - ActionMap actions; +private: + ActionMap local_actions; + ActionMap *actions; Parser *cur_parser; unsigned cur_level; const Statement *cur_st; @@ -88,6 +90,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)()) @@ -120,6 +127,14 @@ protected: { 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 void add(const std::string &k, T0 L::*p0)