X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Floader.h;h=e1522de11aaa8be8dbcba9d40f74c669cbf373d6;hb=b42b462c13b3a50c3b209bc8c34bf1fcf3a151b2;hp=7d5d8d9690dfd1c9460739e7a22332a26e6d5e42;hpb=c4930d8d15a5a248ca921e0ed3f9bca8aa18b322;p=libs%2Fdatafile.git diff --git a/source/loader.h b/source/loader.h index 7d5d8d9..e1522de 100644 --- a/source/loader.h +++ b/source/loader.h @@ -189,11 +189,11 @@ private: /** -Base class for data loaders. To enable objects of a certain class to be loaded -from datafiles, create a public Loader class in it, derived from this class. -Typically the Loader class contains a reference to the object being loaded. If -you want to load data members of the object directly, the Loader class must -have a member function get_object() returning that reference. +Base class for data loaders. To give loading capabilities to a class, create a +public Loader class in it, derived from this class. Typically a loader object +contains a reference to the loaded object. To make use of loading directly +into data members, the Loader class must have a get_object() member function, +returning that reference. */ class Loader { @@ -214,6 +214,9 @@ public: protected: Loader(): cur_st(0) { } + /** + Adds a keyword that is loaded with a zero-argument function. + */ template void add(const std::string &k, void (L::*func)()) { actions.insert(typename ActionMap::value_type(k, new LoaderFunc0(func))); } @@ -234,6 +237,9 @@ protected: void add(const std::string &k, void (L::*func)(A0, A1, A2, A3)) { actions.insert(typename ActionMap::value_type(k, new LoaderFunc4(func))); } + /** + Adds a keyword that is loaded into a variable of the loaded object. + */ template void add(const std::string &k, T0 L::*p0) { actions.insert(typename ActionMap::value_type(k, new LoadValue1(p0))); } @@ -242,12 +248,15 @@ protected: void add(const std::string &k, T0 L::*p0, T1 L::*p1) { actions.insert(typename ActionMap::value_type(k, new LoadValue2(p0, p1))); } + /** + Adds a keyword that is recognized but ignored. + */ void add(const std::string &k) { actions.insert(ActionMap::value_type(k, 0)); } /** - Loads a sub-object from the statement being currently processed. The Loader - class of the sub-object is automatically used. + Loads a sub-object from the statement being processed. The Loader class of + the sub-object is automatically used. */ template void load_sub(S &s) @@ -265,6 +274,10 @@ protected: loader.load(*cur_st); } + template + void load_sub(S &s, T &p) + { load_sub(s, p); } + /** Loads a sub-object with a custom Loader class that takes one argument in addition to to object to be loaded. @@ -277,6 +290,18 @@ protected: L loader(s, p); loader.load(*cur_st); } + + /** + Returns the source of the statement being processed. This can be used to + implement relative paths in include-like statements. Note that the source + may not necessarily be a file. + */ + const std::string &get_source() const + { + if(!cur_st) + throw InvalidState("get_source called without current statement"); + return cur_st->source; + } private: typedef std::map ActionMap;