X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Floader.h;h=e1522de11aaa8be8dbcba9d40f74c669cbf373d6;hb=2f79370bffe0bac865dc97c5114dc87c1936fbb4;hp=70fb7c2ba762fa2b2a4677c53363ffe7426d3009;hpb=de02b5618273df1b94085934f699371b4be31783;p=libs%2Fdatafile.git diff --git a/source/loader.h b/source/loader.h index 70fb7c2..e1522de 100644 --- a/source/loader.h +++ b/source/loader.h @@ -81,17 +81,17 @@ private: Loads a statement by calling a function that takes an array of values. */ template -class LoaderFunc1 &>: public LoaderAction +class LoaderFunc1 &>: public LoaderAction { public: - typedef void (L::*FuncType)(const std::list &); + typedef void (L::*FuncType)(const std::vector &); LoaderFunc1(FuncType f): func(f) { } void execute(Loader &l, const Statement &st) const { std::vector values; values.reserve(st.args.size()); - for(ValueArray::iterator i=st.args.begin(); i!=st.args.end(); ++i) + for(ValueArray::const_iterator i=st.args.begin(); i!=st.args.end(); ++i) values.push_back(i->get()); (dynamic_cast(l).*func)(values); } @@ -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,21 +248,24 @@ 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) - { load_sub(s); } + { load_sub(s); } /** Loads a sub-object with a custom Loader class. */ - template + template void load_sub(S &s) { if(!cur_st) @@ -265,11 +274,15 @@ 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. */ - template + template void load_sub(S &s, T &p) { if(!cur_st) @@ -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;