From: Mikko Rasa Date: Fri, 7 Dec 2012 10:28:15 +0000 (+0200) Subject: Add support for fallback collections X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=a5d5fa04bcbe360fc55fdb25b45937b29fb5c9cd;p=libs%2Fdatafile.git Add support for fallback collections --- diff --git a/source/collection.cpp b/source/collection.cpp index fbe894a..0709919 100644 --- a/source/collection.cpp +++ b/source/collection.cpp @@ -5,6 +5,10 @@ using namespace std; namespace Msp { namespace DataFile { +Collection::Collection(): + fallback(0) +{ } + Collection::~Collection() { for(TypeList::iterator i = types.begin(); i!=types.end(); ++i) @@ -30,6 +34,16 @@ const Variant &Collection::get_var(const string &name, const CollectionItemTypeB (*j)->load(*this, *type, name); loaded = items.count(name); } + if(!loaded && fallback) + { + for(TypeList::const_iterator j=fallback->types.begin(); j!=fallback->types.end(); ++j) + if((*j)->is_same_type(*type)) + { + if(fallback->get_status(name, **j)) + return fallback->get_var(name, *j); + break; + } + } } return get_item(items, name); @@ -99,6 +113,11 @@ void Collection::load_items_from_sources(const CollectionItemTypeBase &type) } } +void Collection::set_fallback(Collection *f) +{ + fallback = f; +} + Collection::Loader::Loader(Collection &c): coll(c) diff --git a/source/collection.h b/source/collection.h index bbde9f9..ee7eb46 100644 --- a/source/collection.h +++ b/source/collection.h @@ -45,6 +45,11 @@ method for details. Collections can have sources for loading objects on demand. Automatic loading only works on a non-const Collection. See class CollectionSource for details. + +A fallback collection can be designated as another way of loading items that +are not present. Items retrieted from the fallback collection are shared +between the collections, and are only deleted when all collections in the chain +have been destroyed. */ class Collection { @@ -86,11 +91,12 @@ private: TypeList types; ItemMap items; SourceList sources; + Collection *fallback; Collection(const Collection &); Collection &operator=(const Collection &); public: - Collection() { } + Collection(); virtual ~Collection(); /** Adds an object into the collection. The name must not pre-exist. The @@ -262,6 +268,11 @@ private: void gather_names_from_sources(std::list &, const CollectionItemTypeBase &) const; void load_items_from_sources(const CollectionItemTypeBase &); + +protected: + /** Sets a fallback collection, which will be consulted if an item is not + found. */ + void set_fallback(Collection *); }; template @@ -309,6 +320,7 @@ public: const std::string &get_keyword() const { return kwd; } void add_suffix(const std::string &); bool match_name(const std::string &) const; + virtual bool is_same_type(const CollectionItemTypeBase &) const = 0; virtual bool check_item_type(const Variant &) const = 0; virtual void add_to_loader(Collection::Loader &) const = 0; virtual bool can_create() const = 0; @@ -423,6 +435,9 @@ public: return *this; } + virtual bool is_same_type(const CollectionItemTypeBase &other) const + { return dynamic_cast *>(&other); } + virtual bool check_item_type(const Variant &var) const { return var.check_type >(); }