]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/loader.h
Add Readme.txt and some other documentation
[libs/datafile.git] / source / loader.h
index 70fb7c2ba762fa2b2a4677c53363ffe7426d3009..9c0933694e074389a5931f3af8a5e2fc029ca6f7 100644 (file)
@@ -81,17 +81,17 @@ private:
 Loads a statement by calling a function that takes an array of values.
 */
 template<typename L, typename A0>
-class LoaderFunc1<L, const std::list<A0> &>: public LoaderAction
+class LoaderFunc1<L, const std::vector<A0> &>: public LoaderAction
 {
 public:
-       typedef void (L::*FuncType)(const std::list<A0> &);
+       typedef void (L::*FuncType)(const std::vector<A0> &);
 
        LoaderFunc1(FuncType f): func(f) { }
        void execute(Loader &l, const Statement &st) const
        {
                std::vector<A0> 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<A0>());
                (dynamic_cast<L &>(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<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,6 +248,9 @@ 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)); }
 
@@ -251,12 +260,12 @@ protected:
        */
        template<typename S>
        void load_sub(S &s)
-       { load_sub<S, typename S::Loader>(s); }
+       { load_sub<typename S::Loader, S>(s); }
 
        /**
        Loads a sub-object with a custom Loader class.
        */
-       template<typename S, typename L>
+       template<typename L, typename S>
        void load_sub(S &s)
        {
                if(!cur_st)
@@ -269,7 +278,7 @@ protected:
        Loads a sub-object with a custom Loader class that takes one argument in
        addition to to object to be loaded.
        */
-       template<typename S, typename L, typename T>
+       template<typename L, typename S, typename T>
        void load_sub(S &s, T &p)
        {
                if(!cur_st)