X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=source%2Floader.h;h=4a1faa3f7af650ff4f4ec3726cc768fea77255cb;hp=57481cff28d36fca44b19db0c91784e7ecc54573;hb=b0b9af7216560da2a46ea38fe2df959f4dfb126f;hpb=215e719d0ef85f748898660d15d01e77ac551de9 diff --git a/source/loader.h b/source/loader.h index 57481cf..4a1faa3 100644 --- a/source/loader.h +++ b/source/loader.h @@ -1,17 +1,8 @@ -/* $Id$ - -This file is part of libmspdatafile -Copyright © 2006-2008 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef MSP_DATAFILE_LOADER_H_ #define MSP_DATAFILE_LOADER_H_ #include -#include #include -#include "except.h" #include "loaderaction.h" #include "parser.h" #include "statement.h" @@ -39,18 +30,30 @@ 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: - typedef std::map ActionMap; + struct ActionKey + { + std::string keyword; + std::string signature; - ActionMap actions; - const Statement *cur_st; + ActionKey(const std::string &, const std::string &); + bool operator<(const ActionKey &) const; + }; + + typedef std::map ActionMap; + + ActionMap actions; + const Statement *cur_st; + bool sub_loaded; protected: - Loader(): cur_st(0) { } + bool check_sub_loads; + + Loader(); public: virtual ~Loader(); @@ -128,56 +131,18 @@ protected: private: void add(const std::string &, LoaderAction *); + LoaderAction *find_action(const ActionKey &) 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() { } -}; + /** Throws a data_error from the current line. */ + void error(const std::string &) const; - -/** -Provides the basic functionality of an object loader. Deriving from this -allows loading values directly into member variables of the objects. -*/ -template -class BasicLoader: public Loader -{ -public: - typedef O Object; - -protected: - O &obj; - -public: - BasicLoader(O &o): obj(o) { } - O &get_object() const { return obj; } -}; - - -/** -Provides functionality for loading objects with a Collection. Deriving from -this allows loading pointers to objects in the collection automatically. -*/ -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; } + virtual void finish() { } }; @@ -187,10 +152,9 @@ Loads an object from a file. The object must have a public Loader class. template void load(T &obj, const std::string &fn) { - IO::File in(fn); - IO::Buffered buf(in); + IO::BufferedFile in(fn); - Parser parser(buf, fn); + Parser parser(in, fn); typename T::Loader loader(obj); loader.load(parser); } @@ -198,10 +162,9 @@ void load(T &obj, const std::string &fn) template void load(T &obj, const std::string &fn, U &arg) { - IO::File in(fn); - IO::Buffered buf(in); + IO::BufferedFile in(fn); - Parser parser(buf, fn); + Parser parser(in, fn); typename T::Loader loader(obj, arg); loader.load(parser); }