delete *i;
}
-void Collection::add_future(const std::string &name)
+void Collection::add_future(const string &name)
{
- if(items.count(name))
- throw key_error(typeid(ItemMap));
-
for(TypeList::const_iterator i=types.begin(); i!=types.end(); ++i)
if((*i)->match_name(name))
{
- items.insert(ItemMap::value_type(name, (*i)->create_future()));
+ insert_unique(items, name, (*i)->create_future());
+ return;
+ }
+}
+
+void Collection::add_future_with_keyword(const string &name, const string &keyword)
+{
+ for(TypeList::const_iterator i=types.begin(); i!=types.end(); ++i)
+ if((*i)->get_keyword()==keyword)
+ {
+ insert_unique(items, name, (*i)->create_future());
return;
}
- /* XXX throw something? If we do, DirectoryCollection needs some way to
- check if a name matches any item type. */
+ throw runtime_error("Collection::add_future_with_keyword");
}
insert_unique(items, name, ptr);
}
+ /** Adds the name of a future object, guessing its type. If a type matching
+ the name can't be found, nothing is done. */
void add_future(const std::string &name);
+ /** Adds the name of a future object, using a keyword to determine its type.
+ The keyword must be known to the collection. */
+ void add_future_with_keyword(const std::string &name, const std::string &);
+
public:
/// Gets a typed object from the collection.
template<typename T>
virtual ~CollectionItemTypeBase();
void set_keyword(const std::string &);
+ const std::string &get_keyword() const { return kwd; }
void add_suffix(const std::string &);
+ bool match_name(const std::string &) const;
virtual void add_to_loader(Collection::Loader &) const = 0;
virtual bool can_create() const = 0;
virtual void create_item(Collection &, const std::string &) const = 0;
- bool match_name(const std::string &) const;
virtual Variant create_future() const = 0;
template<typename T>