From 76c532f3f5ff079cf7b2016343a1ff73d497c50f Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Fri, 28 Sep 2012 12:10:23 +0300 Subject: [PATCH] Improve the API for future objects add_future is now documented as ignoring names that don't match any type, and there's a new function to add future objects with a keyword. --- source/collection.cpp | 20 +++++++++++++------- source/collection.h | 9 ++++++++- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/source/collection.cpp b/source/collection.cpp index a16ae5a..5ac12ab 100644 --- a/source/collection.cpp +++ b/source/collection.cpp @@ -11,20 +11,26 @@ Collection::~Collection() 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"); } diff --git a/source/collection.h b/source/collection.h index 3d5b7f0..9f5ddfc 100644 --- a/source/collection.h +++ b/source/collection.h @@ -130,8 +130,14 @@ protected: 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 @@ -308,11 +314,12 @@ public: 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 -- 2.45.2