X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.h;h=b2c91d6879c82ef486b9b29b78f0f4054779dd59;hb=ae5c70255ce06515224299985672c540d0b237a7;hp=0595aaca7caddb801d094d9ed847362c669c8be7;hpb=4f036ceabe12869c86cb6821f698fbb65cd47ea6;p=libs%2Fdatafile.git diff --git a/source/collection.h b/source/collection.h index 0595aac..b2c91d6 100644 --- a/source/collection.h +++ b/source/collection.h @@ -137,6 +137,8 @@ protected: insert_unique(items, name, ptr); } + void add_future(const std::string &name); + public: /// Gets a typed object from the collection. template @@ -144,7 +146,7 @@ public: { typedef typename RemoveConst::Type NCT; - T *ptr = get_item(items, name).value >(); + T *ptr = get_item(items, name).value >().get(); if(!ptr) throw key_error(typeid(ItemMap)); return *ptr; @@ -157,7 +159,7 @@ public: private: template - void collect_items(std::list *objects, std::list *names, std::list *future_names) + void collect_items(std::list *objects, std::list *names, std::list *future_names) const { typedef RefPtr::Type> RPNCT; @@ -302,15 +304,20 @@ protected: { }; std::string kwd; + std::vector suffixes; TagBase *tag; CollectionItemTypeBase(); public: virtual ~CollectionItemTypeBase(); + void set_keyword(const std::string &); + void add_suffix(const std::string &); 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 bool check_type() const @@ -360,6 +367,7 @@ private: virtual ~StoreBase() { } virtual void store(Collection &, const std::string &, T *) = 0; + virtual Variant create_future() const = 0; virtual void add_to_loader(Collection::Loader &, const std::string &) = 0; }; @@ -371,6 +379,9 @@ private: virtual void store(Collection &coll, const std::string &name, T *obj) { coll.add(name, static_cast(obj)); } + virtual Variant create_future() const + { return RefPtr(0); } + virtual void add_to_loader(Collection::Loader &loader, const std::string &kwd) { Collection::Loader::Add::add(loader, kwd); } }; @@ -394,7 +405,17 @@ public: item's name. */ CollectionItemType &keyword(const std::string &k) { - kwd = k; + set_keyword(k); + return *this; + } + + /** Adds a suffix that is used to match names when looking for future + 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. */ + CollectionItemType &suffix(const std::string &s) + { + add_suffix(s); return *this; } @@ -438,6 +459,9 @@ public: if(obj) store->store(coll, name, obj); } + + virtual Variant create_future() const + { return store->create_future(); } };