X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Floader.h;h=8a1103d11f14d4c251033a20a1189a2a886599e8;hb=b39ce68f12c30eedb272b65fe78baec5864d89ca;hp=3c4785c493017eadeef3f2c20bb70e05b4bb9cf8;hpb=7df5e45c7f414f6a07681dc4ec2abb63b091a309;p=libs%2Fdatafile.git diff --git a/source/loader.h b/source/loader.h index 3c4785c..8a1103d 100644 --- a/source/loader.h +++ b/source/loader.h @@ -3,7 +3,6 @@ #include #include -#include "except.h" #include "loaderaction.h" #include "parser.h" #include "statement.h" @@ -31,36 +30,27 @@ When loading has finished successfully, the virtual function finish() is called. Any post-processing of the data should be placed here and not in the destructor. -See also classes BasicLoader and BasicLoader2. +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 allow_pointer_reload; bool check_sub_loads; Loader(); public: virtual ~Loader(); - bool is_pointer_reload_allowed() const { return allow_pointer_reload; } - /** Loads statements from a parser. */ void load(Parser &p); @@ -68,6 +58,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); @@ -135,59 +128,23 @@ 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; virtual void finish() { } }; -/** -Deprecated. See ObjectLoader in objectloader.h. -*/ -template -class BasicLoader: public Loader -{ -public: - typedef O Object; - -protected: - O &obj; - -public: - BasicLoader(O &o): obj(o) { } - O &get_object() const { return obj; } -}; - - -/** -Deprecated. See CollectionObjectLoader in objectloader.h. -*/ -template -class BasicLoader2: public BasicLoader -{ -public: - typedef C Collection; - -protected: - C &coll; - -public: - BasicLoader2(O &o, C &c): BasicLoader(o), coll(c) { } - C &get_collection() const { return coll; } -}; - - /** Loads an object from a file. The object must have a public Loader class. */