]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/loader.h
Add Loader::get_source
[libs/datafile.git] / source / loader.h
index 7d5d8d9690dfd1c9460739e7a22332a26e6d5e42..e1522de11aaa8be8dbcba9d40f74c669cbf373d6 100644 (file)
@@ -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<typename L>
        void add(const std::string &k, void (L::*func)())
        { actions.insert(typename ActionMap::value_type(k, new LoaderFunc0<L>(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<L, A0, A1, A2, A3>(func))); }
 
+       /**
+       Adds a keyword that is loaded into a variable of the loaded object.
+       */
        template<typename L, typename T0>
        void add(const std::string &k, T0 L::*p0)
        { actions.insert(typename ActionMap::value_type(k, new LoadValue1<L, T0>(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<L, T0, T1>(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<typename S>
        void load_sub(S &s)
@@ -265,6 +274,10 @@ protected:
                loader.load(*cur_st);
        }
 
+       template<typename S, typename T>
+       void load_sub(S &s, T &p)
+       { load_sub<typename S::Loader, S, T>(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<std::string, LoaderAction *> ActionMap;