X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.h;h=005abd0db39e3c54c8b934ea784e5431164d70e4;hb=7f49649f70becbb4345ad0b936c5e00194d9dc82;hp=34b1260c4c42b729311964736b2efc02343c03fb;hpb=41e78ee91ca058ead90fa1c8ee4339d2ef1b0f31;p=libs%2Fdatafile.git diff --git a/source/collection.h b/source/collection.h index 34b1260..005abd0 100644 --- a/source/collection.h +++ b/source/collection.h @@ -1,6 +1,7 @@ #ifndef MSP_DATAFILE_COLLECTION_H_ #define MSP_DATAFILE_COLLECTION_H_ +#include #include #include #include "collectionsource.h" @@ -236,6 +237,11 @@ protected: template CollectionItemType &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 + CollectionItemType &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. */ @@ -260,7 +266,8 @@ public: 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 &, const CollectionItemTypeBase &) const; @@ -403,7 +410,7 @@ public: 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. */ @@ -486,6 +493,16 @@ CollectionItemType &Collection::add_type() return *type; } +template +CollectionItemType &Collection::modify_type() +{ + for(TypeList::const_iterator j=types.begin(); j!=types.end(); ++j) + if(CollectionItemType *t = dynamic_cast *>(*j)) + return *t; + + throw std::logic_error("type not found in collection"); +} + template CollectionItemTypeBase *Collection::get_type(const std::string &name) const {