private:
typedef std::map<std::string, Variant> ItemMap;
- typedef std::list<CollectionItemTypeBase *> TypeList;
- typedef std::list<const CollectionSource *> SourceList;
+ typedef std::vector<CollectionItemTypeBase *> TypeList;
+ typedef std::vector<const CollectionSource *> SourceList;
TypeList types;
ItemMap items;
T &extract(const Variant &var) const;
template<typename T>
- std::list<T *> extract_list(const std::list<const Variant *> &vars) const
+ std::list<T *> extract_list(const std::vector<const Variant *> &vars) const
{
std::list<T *> result;
- for(std::list<const Variant *>::const_iterator i=vars.begin(); i!=vars.end(); ++i)
+ for(std::vector<const Variant *>::const_iterator i=vars.begin(); i!=vars.end(); ++i)
result.push_back(&extract<T>(**i));
return result;
}
- void gather_items(std::list<const Variant *> *, std::list<std::string> *, const CollectionItemTypeBase &, bool) const;
+ void gather_items(std::vector<const Variant *> *, std::list<std::string> *, const CollectionItemTypeBase &, bool) const;
template<typename T>
- void gather_items(std::list<const Variant *> *vars, std::list<std::string> *names, const CollectionItemTypeBase *type, bool include_sources) const
+ void gather_items(std::vector<const Variant *> *vars, std::list<std::string> *names, const CollectionItemTypeBase *type, bool include_sources) const
{
if(type || (type = get_type<T>()))
gather_items(vars, names, *type, include_sources);
template<typename T>
std::list<T *> get_list() const
{
- std::list<const Variant *> vars;
+ std::vector<const Variant *> vars;
gather_items<typename RemoveConst<T>::Type>(&vars, 0, 0, false);
return extract_list<T>(vars);
}
if(type)
load_items_from_sources(*type);
- std::list<const Variant *> vars;
+ std::vector<const Variant *> vars;
gather_items<typename RemoveConst<T>::Type>(&vars, 0, type, true);
return extract_list<T>(vars);
}
template<typename T>
CollectionItemType<T> &add_type();
+ /** Returns a mutable reference to an existing type descriptor. This can be
+ used to e.g. override the creator function of a type added by a base class. */
+ template<typename T>
+ CollectionItemType<T> &modify_type();
+
private:
/** Returns the descriptor for a type, or null if one isn't defined. An
optional name can be given to prioritize matching types. */
return *type;
}
+template<typename T>
+CollectionItemType<T> &Collection::modify_type()
+{
+ for(TypeList::const_iterator j=types.begin(); j!=types.end(); ++j)
+ if(CollectionItemType<T> *t = dynamic_cast<CollectionItemType<T> *>(*j))
+ return *t;
+
+ throw std::logic_error("type not found in collection");
+}
+
template<typename T>
CollectionItemTypeBase *Collection::get_type(const std::string &name) const
{