namespace Msp {
namespace DataFile {
+Collection::Collection():
+ fallback(0)
+{ }
+
Collection::~Collection()
{
for(TypeList::iterator i = types.begin(); i!=types.end(); ++i)
(*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);
}
}
+void Collection::set_fallback(Collection *f)
+{
+ fallback = f;
+}
+
Collection::Loader::Loader(Collection &c):
coll(c)
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
{
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
void gather_names_from_sources(std::list<std::string> &, 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<typename T>
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;
return *this;
}
+ virtual bool is_same_type(const CollectionItemTypeBase &other) const
+ { return dynamic_cast<const CollectionItemType<T> *>(&other); }
+
virtual bool check_item_type(const Variant &var) const
{ return var.check_type<RefPtr<T> >(); }