X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Floader.h;h=207ecff8dff8d7f068aa033994ef2a5e608ba56a;hb=6a033cf0f5164915168f9cb778e801ed86450e1c;hp=4ea7994e757f76476dda000f20c67fa44e21fee9;hpb=e4beb0453a1cfe200fc97607afab94c3ddee1c65;p=libs%2Fdatafile.git diff --git a/source/loader.h b/source/loader.h index 4ea7994..207ecff 100644 --- a/source/loader.h +++ b/source/loader.h @@ -3,8 +3,8 @@ #include #include -#include "except.h" #include "loaderaction.h" +#include "meta.h" #include "parser.h" #include "statement.h" @@ -36,21 +36,15 @@ See also classes ObjectLoader and CollectionObjectLoader in objectloader.h. class Loader { private: - struct ActionKey - { - std::string keyword; - std::string signature; - - ActionKey(const std::string &, const std::string &); - - bool operator<(const ActionKey &) const; - }; - - typedef std::map ActionMap; + typedef std::map ActionMap; ActionMap actions; + Parser *cur_parser; + unsigned cur_level; const Statement *cur_st; bool sub_loaded; + bool direct; + std::list aux_loaders; protected: bool check_sub_loads; @@ -65,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); @@ -132,23 +129,73 @@ protected: private: void add(const std::string &, LoaderAction *); - LoaderAction *find_action(const ActionKey &) const; +protected: + void add_auxiliary_loader(Loader &); + +private: + bool has_action(const StatementKey &) const; + LoaderAction *find_action(const StatementKey &) const; protected: /** 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; - } + 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); + + 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); + + 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. */ @@ -162,6 +209,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) { @@ -171,6 +222,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