]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/loader.h
Add a shortcut function for loading something from a file.
[libs/datafile.git] / source / loader.h
index 2fe0292bff01d5a6cdbab98e387daf0bbfab309e..c6936f96f6eef5869f62ffe3ed9307f34038dd2c 100644 (file)
@@ -6,6 +6,7 @@ Distributed under the LGPL
 #ifndef MSP_PARSER_LOADER_H_
 #define MSP_PARSER_LOADER_H_
 
+#include <fstream>
 #include <map>
 #include <msp/error.h>
 #include "parser.h"
@@ -172,6 +173,9 @@ protected:
        void add(const std::string &k, T L::*p)
        { actions.insert(typename ActionMap::value_type(k, new LoadValue<L, T>(p))); }
 
+       void add(const std::string &k)
+       { actions.insert(ActionMap::value_type(k, 0)); }
+
        template<typename S>
        void load_sub(S &s)
        { load_sub<S, typename S::Loader>(s); }
@@ -196,11 +200,24 @@ private:
                ActionMap::iterator j=actions.find(st.keyword);
                if(j==actions.end())
                        throw Exception(st.get_location()+": Unknown keyword '"+st.keyword+"'");
-               j->second->execute(*this, st);
+               if(j->second)
+                       j->second->execute(*this, st);
                cur_st=0;
        }
 };
 
+template<typename T>
+void load(T &obj, const std::string &fn)
+{
+       std::ifstream in(fn.c_str());
+       if(!in)
+               throw Exception("Couldn't open "+fn);
+
+       Parser parser(in, fn);
+       typename T::Loader loader(obj);
+       loader.load(parser);
+}
+
 } // namespace Parser
 } // namespace Msp