X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.h;h=d0e8a1a8bb9b25c636ab23a8c1e4bbdcfa5c04a7;hb=HEAD;hp=98b359e5eaedd28604a5d1f0a0085f470a657219;hpb=256b44a5009467171af53316141277027bcc0ba4;p=libs%2Fdatafile.git diff --git a/source/collection.h b/source/collection.h index 98b359e..c8470dd 100644 --- a/source/collection.h +++ b/source/collection.h @@ -89,10 +89,9 @@ private: std::vector types; ItemMap items; std::vector sources; - Collection *fallback; + Collection *fallback = nullptr; public: - Collection(); virtual ~Collection(); /** Adds an object into the collection. The name must not pre-exist. The @@ -335,7 +334,7 @@ class CollectionItemTypeBase protected: struct ExtractorBase { - virtual ~ExtractorBase() { } + virtual ~ExtractorBase() = default; }; template @@ -348,7 +347,7 @@ protected: std::vector suffixes; std::vector extractors; - CollectionItemTypeBase() { } + CollectionItemTypeBase() = default; public: virtual ~CollectionItemTypeBase(); @@ -364,7 +363,7 @@ public: virtual bool can_create() const = 0; virtual void create_item(Collection &, const std::string &) const = 0; virtual void load_item(Collection &, Parser &, const std::string &) const = 0; - virtual void notify_item(Collection &, const std::string &, const Variant &) const = 0; + virtual void notify_item(const std::string &, const Variant &) const = 0; template bool can_extract() const @@ -394,68 +393,17 @@ template class CollectionItemType: public CollectionItemTypeBase { private: - struct CreatorBase - { - virtual ~CreatorBase() { } - - virtual T *create(Collection &, const std::string &) const = 0; - }; - - template - struct Creator: CreatorBase - { - typedef T *(C::*FuncPtr)(const std::string &); - - FuncPtr func; - - Creator(FuncPtr f): func(f) { } - - virtual T *create(Collection &coll, const std::string &name) const - { return (dynamic_cast(coll).*func)(name); } - }; - - struct NotifyeeBase - { - virtual ~NotifyeeBase() { } - - virtual void notify(Collection &, const std::string &, T &) const = 0; - }; - - template - struct Notifyee: NotifyeeBase - { - typedef void (C::*FuncPtr)(const std::string &, T &); - - FuncPtr func; - - Notifyee(FuncPtr f): func(f) { } - - virtual void notify(Collection &coll, const std::string &name, T &item) const - { (dynamic_cast(coll).*func)(name, item); } - }; - template struct Extractor: CollectionItemTypeBase::Extractor { - virtual B &extract(const Variant &var) const + B &extract(const Variant &var) const override { return *var.value >(); } }; - CreatorBase *creat; - std::vector notif; + std::function create_func; + std::vector> notify_funcs; public: - CollectionItemType(): - creat(0) - { } - - ~CollectionItemType() - { - delete creat; - for(NotifyeeBase *n: notif) - delete n; - } - /** Sets a datafile keyword for this item type. The Collection's loader will accept a statement with this keyword and a single string argument - the item's name. */ @@ -481,11 +429,10 @@ public: type. It must return the created object, or null if it could not be created. It's also permissible to load the item via other means and then return null. */ - template - CollectionItemType &creator(T *(C::*func)(const std::string &)) + template + CollectionItemType &creator(F func) { - delete creat; - creat = new Creator(func); + create_func = func; return *this; } @@ -497,44 +444,44 @@ public: return *this; } - template - CollectionItemType ¬ify(void (C::*func)(const std::string &, T &)) + template + CollectionItemType ¬ify(F func) { - notif.push_back(new Notifyee(func)); + notify_funcs.emplace_back(func); return *this; } - virtual bool is_same_type(const CollectionItemTypeBase &other) const + bool is_same_type(const CollectionItemTypeBase &other) const override { return dynamic_cast *>(&other); } - virtual bool check_item_type(const Variant &var) const + bool check_item_type(const Variant &var) const override { return var.check_type >(); } - virtual void add_to_loader(Collection::Loader &) const + void add_to_loader(Collection::Loader &) const override { } - virtual bool can_create() const - { return creat!=0; } + bool can_create() const override + { return static_cast(create_func); } - virtual void create_item(Collection &coll, const std::string &name) const + void create_item(Collection &coll, const std::string &name) const override { - if(!creat) + if(!create_func) throw std::runtime_error("no creator"); - T *obj = creat->create(coll, name); + T *obj = create_func(name); if(obj) coll.add(name, obj); } - virtual void load_item(Collection &, Parser &, const std::string &) const + void load_item(Collection &, Parser &, const std::string &) const override { throw std::runtime_error("this type cannot be loaded"); } - virtual void notify_item(Collection &coll, const std::string &name, const Variant &var) const + void notify_item(const std::string &name, const Variant &var) const override { RefPtr obj = var.value >(); - for(NotifyeeBase *n: notif) - n->notify(coll, name, *obj); + for(const auto &n: notify_funcs) + n(name, *obj); } }; @@ -543,10 +490,10 @@ template class LoadableCollectionItemType: public CollectionItemType { public: - virtual void add_to_loader(Collection::Loader &loader) const + void add_to_loader(Collection::Loader &loader) const override { loader.add(this->kwd, &Collection::Loader::item); } - virtual void load_item(Collection &coll, Parser &parser, const std::string &name) const + void load_item(Collection &coll, Parser &parser, const std::string &name) const override { RefPtr obj = new T; Collection::ItemLoader ldr(*obj, coll); @@ -592,7 +539,7 @@ CollectionItemTypeBase *Collection::get_type(const std::string &name) const for(CollectionItemTypeBase *t: types) if(dynamic_cast *>(t)) return t; - CollectionItemTypeBase *type = 0; + CollectionItemTypeBase *type = nullptr; for(CollectionItemTypeBase *t: types) if(t->can_extract()) {