X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Floader.h;h=7799a7eacb5dd404915f25cbfe87f0665f515436;hb=b0186e8878204a29e25ca4063c1dac4dea908508;hp=bb1292cc7b3c2740adc14a6c596bde54c4a59678;hpb=2d289d20a9a4aeac7774976e4213a7c72f1dc75b;p=libs%2Fdatafile.git diff --git a/source/loader.h b/source/loader.h index bb1292c..7799a7e 100644 --- a/source/loader.h +++ b/source/loader.h @@ -4,6 +4,7 @@ #include #include #include "loaderaction.h" +#include "meta.h" #include "parser.h" #include "statement.h" @@ -38,9 +39,12 @@ private: typedef std::map ActionMap; ActionMap actions; + Parser *cur_parser; + unsigned cur_level; const Statement *cur_st; bool sub_loaded; - std::list aux_loaders; + bool direct; + std::vector aux_loaders; protected: bool check_sub_loads; @@ -55,6 +59,9 @@ private: /** Loads data from a statement. */ void load(const Statement &st); + /** Loads statemsnts from a parser, feeding them directly to actions. */ + void load_direct(Parser &, unsigned); + /** Processes a single statement */ void load_statement(const Statement &st); @@ -90,6 +97,12 @@ protected: void add(const std::string &k, void (L::*func)(A0)) { add(k, new LoaderFunc1(func)); } +#if __cplusplus>=201103L + template + void add(const std::string &k, void (L::*func)(Args...)) + { add(k, new LoaderFuncN(func)); } + +#else template void add(const std::string &k, void (L::*func)(A0, A1)) { add(k, new LoaderFunc2(func)); } @@ -105,6 +118,15 @@ protected: template void add(const std::string &k, void (L::*func)(A0, A1, A2, A3, A4)) { add(k, new LoaderFunc5(func)); } +#endif + +#if __cplusplus>=201103L + /** Adds a keyword that is loaded by calling a function with a bound + first argument. */ + template + void add(const std::string &k, void (L::*func)(B0, Args...), const typename RemoveReference::Type &b0) + { add(k, new LoaderFuncNBound1(func, b0)); } +#endif /** Adds a keyword that is loaded into a member of the loaded object. */ template @@ -135,10 +157,64 @@ protected: source may not necessarily be a file. */ const std::string &get_source() const; + /** Returns the keyword of the statement being processed. Can be used to + implement dynamic keywords. */ + const std::string &get_keyword() const; + virtual void finish() { } }; +#if __cplusplus>=201103L +/** +Loads an object from a file. The object must have a public Loader class. Any +extra arguments are passed to the Loader constructor. +*/ +template +void load(T &obj, const std::string &fn, Args &... args) +{ + IO::BufferedFile in(fn); + + Parser parser(in, fn); + typename T::Loader loader(obj, args...); + loader.load(parser); +} + +/** +Loads an object from a file stored in a collection. The object must havea +public Loader class. The collection is passed to the Loader constructor, +followed by any extra arguments. +*/ +template +void load(T &obj, typename T::Loader::Collection &coll, const std::string &fn, Args &... args) +{ + RefPtr in = coll.open_raw(fn); + if(!in) + throw IO::file_not_found(fn); + + Parser parser(*in, fn); + typename T::Loader loader(obj, coll, args...); + loader.load(parser); +} + +/** +Loads an object from a file stored in a collection. The object must havea +public Loader class. Any extra arguments are passed to the Loader constructor. +*/ +template +typename EnableIf::value, void>::No load(T &obj, C &coll, const std::string &fn, Args &... args) +{ + RefPtr in = coll.open_raw(fn); + if(!in) + throw IO::file_not_found(fn); + + Parser parser(*in, fn); + typename T::Loader loader(obj, args...); + loader.load(parser); +} + +#else + /** Loads an object from a file. The object must have a public Loader class. */ @@ -152,6 +228,10 @@ void load(T &obj, const std::string &fn) loader.load(parser); } +/** +Loads an object from a file, passing one extra argument to the Loader +constructor. The object must have a public Loader class. +*/ template void load(T &obj, const std::string &fn, U &arg) { @@ -161,6 +241,7 @@ void load(T &obj, const std::string &fn, U &arg) typename T::Loader loader(obj, arg); loader.load(parser); } +#endif } // namespace DataFile } // namespace Msp