- /** Checks whether a name exists in the collection. Does not care about the
- type of the object. */
- bool contains(const std::string &n) const;
+private:
+ template<typename T>
+ unsigned get_status(const std::string &name) const
+ {
+ ItemMap::const_iterator i = items.find(name);
+ if(i==items.end())
+ {
+ if(CollectionItemTypeBase *type = get_type<T>())
+ {
+ for(SourceList::const_iterator j=sources.begin(); j!=sources.end(); ++j)
+ if((*j)->is_loadable(*type, name))
+ return 2;
+ }
+ return 0;
+ }
+
+ typedef RefPtr<typename RemoveConst<T>::Type> RPNCT;
+ if(!i->second.check_type<RPNCT>())
+ return 0;
+
+ return 1;
+ }
+
+public:
+ /// Checks whether a typed object exists in the collection.
+ template<typename T>
+ bool contains(const std::string &name) const
+ { return get_status<T>(name)==1; }
+
+ /** Checks whether a typed object exists in the collection or is loadable
+ from a source. */
+ template<typename T>
+ bool contains(const std::string &name)
+ { return get_status<T>(name)>0; }