X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.h;h=3d5b7f0a6abce95bc8aa5d6ec05749be3ec6f8b2;hb=8955db30f9cd1c1566b349da29e669f065f84e36;hp=bf44773e54f1b0914cd5b46a80130b8022b881ee;hpb=bbb5a5b00b4008684d5c32b3ea2fd21f7a5fad54;p=libs%2Fdatafile.git diff --git a/source/collection.h b/source/collection.h index bf44773..3d5b7f0 100644 --- a/source/collection.h +++ b/source/collection.h @@ -55,34 +55,27 @@ public: template friend class CollectionItemType; private: - template::value> - struct Add; - Collection &coll; public: Loader(Collection &); Collection &get_object() const { return coll; } private: - template - void coll_item(const std::string &n) - { - RefPtr it = new T; - load_sub(*it, dynamic_cast(coll)); - coll.add(n, it.get()); - it.release(); - } - template void item(const std::string &n) { RefPtr it = new T; - load_sub(*it); + ItemLoader ldr(*it, coll); + load_sub_with(ldr); coll.add(n, it.get()); it.release(); } }; +protected: + template::value> + class ItemLoader; + private: typedef std::map ItemMap; typedef std::list TypeList; @@ -137,6 +130,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 +139,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 +152,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; @@ -270,19 +265,22 @@ protected: CollectionItemType &add_type(); }; - -template -struct Collection::Loader::Add +template +class Collection::ItemLoader: public T::Loader { - static void add(Loader &loader, const std::string &kwd) - { loader.add(kwd, &Loader::item); } +public: + ItemLoader(T &o, Collection &): + T::Loader(o) + { } }; -template -struct Collection::Loader::Add +template +class Collection::ItemLoader: public T::Loader { - static void add(Loader &loader, const std::string &kwd) - { loader.add(kwd, &Loader::coll_item); } +public: + ItemLoader(T &o, Collection &c): + T::Loader(o, dynamic_cast(c)) + { } }; @@ -299,22 +297,23 @@ protected: template class Tag: public TagBase - { - public: - virtual ~Tag() { } - }; + { }; std::string kwd; + std::vector suffixes; TagBase *tag; - CollectionItemTypeBase(): tag(0) { } + CollectionItemTypeBase(); public: - virtual ~CollectionItemTypeBase() - { delete tag; } + 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 @@ -364,6 +363,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; }; @@ -375,8 +375,11 @@ 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); } + { loader.add(kwd, &Collection::Loader::item); } }; CreatorBase *creat; @@ -398,7 +401,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; } @@ -442,6 +455,9 @@ public: if(obj) store->store(coll, name, obj); } + + virtual Variant create_future() const + { return store->create_future(); } };