#ifndef MSP_DATAFILE_COLLECTION_H_
#define MSP_DATAFILE_COLLECTION_H_
+#include <msp/core/attributes.h>
#include <msp/core/maputils.h>
#include <msp/core/refptr.h>
#include "collectionsource.h"
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. */
IO::Seekable *open_raw(const std::string &) const;
protected:
- IO::Seekable *open_from_sources(const std::string &n) { return open_raw(n); }
+ // Deprecated. Use open_raw instead.
+ DEPRECATED IO::Seekable *open_from_sources(const std::string &n) { return open_raw(n); }
private:
void gather_names_from_sources(std::list<std::string> &, const CollectionItemTypeBase &) const;
return *this;
}
- /** Adds a suffix that is used to match names when looking for future
+ /** Adds a suffix that is used to match names when looking for loadable
objects. There is no implied separator; a name matches if it ends with the
suffix. If a keyword is defined before any suffixes, then "."+keyword is
added as a suffix. */
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
{