X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcollection.h;h=98b359e5eaedd28604a5d1f0a0085f470a657219;hb=256b44a5009467171af53316141277027bcc0ba4;hp=aa3c18a0fcc1a5e27f5d4ddc1278b58e65904877;hpb=fbf76ed98dbd2cca6785efe2dd489d717fa5dce6;p=libs%2Fdatafile.git diff --git a/source/collection.h b/source/collection.h index aa3c18a..98b359e 100644 --- a/source/collection.h +++ b/source/collection.h @@ -1,6 +1,7 @@ #ifndef MSP_DATAFILE_COLLECTION_H_ #define MSP_DATAFILE_COLLECTION_H_ +#include #include #include #include @@ -84,12 +85,10 @@ public: private: typedef std::map ItemMap; - typedef std::vector TypeList; - typedef std::vector SourceList; - TypeList types; + std::vector types; ItemMap items; - SourceList sources; + std::vector sources; Collection *fallback; public: @@ -104,7 +103,7 @@ public: if(!item) throw std::invalid_argument("Collection::add(item)"); - typedef typename RemoveConst::Type NCT; + typedef typename std::remove_cv::type NCT; RefPtr ptr(item); try { @@ -122,7 +121,7 @@ public: template T &get(const std::string &name) const { - return extract::Type>(get_item(items, name)); + return extract::type>(get_item(items, name)); } /** Gets a typed object from the collection. If the name is not found, @@ -131,7 +130,7 @@ public: template T &get(const std::string &name) { - typedef typename RemoveConst::Type NCT; + typedef typename std::remove_cv::type NCT; return extract(get_var(name, get_type(name))); } @@ -142,13 +141,13 @@ public: T *find(const std::string &name) const { ItemMap::const_iterator i = items.find(name); - return (i!=items.end() ? extract::Type>(i->second) : 0); + return (i!=items.end() ? extract::type>(i->second) : 0); } template T *find(const std::string &name) { - typedef typename RemoveConst::Type NCT; + typedef typename std::remove_cv::type NCT; const Variant *var = find_var(name, get_type(name)); return (var ? &extract(*var) : 0); } @@ -165,8 +164,8 @@ private: std::list extract_list(const std::vector &vars) const { std::list result; - for(std::vector::const_iterator i=vars.begin(); i!=vars.end(); ++i) - result.push_back(&extract(**i)); + for(const Variant *v: vars) + result.push_back(&extract(*v)); return result; } @@ -187,7 +186,7 @@ public: std::list get_names() const { std::list names; - gather_items::Type>(0, &names, 0, false); + gather_items::type>(0, &names, 0, false); return names; } @@ -197,7 +196,7 @@ public: std::list get_names() { std::list names; - gather_items::Type>(0, &names, 0, true); + gather_items::type>(0, &names, 0, true); return names; } @@ -206,7 +205,7 @@ public: std::list get_list() const { std::vector vars; - gather_items::Type>(&vars, 0, 0, false); + gather_items::type>(&vars, 0, 0, false); return extract_list(vars); } @@ -215,12 +214,12 @@ public: template std::list get_list() { - CollectionItemTypeBase *type = get_type::Type>(); + CollectionItemTypeBase *type = get_type::type>(); if(type) load_items_from_sources(*type); std::vector vars; - gather_items::Type>(&vars, 0, type, true); + gather_items::type>(&vars, 0, type, true); return extract_list(vars); } @@ -242,24 +241,24 @@ public: /// Checks whether a typed object exists in the collection. template bool contains(const std::string &name) const - { return get_status::Type>(name)==1; } + { return get_status::type>(name)==1; } /** Checks whether a typed object exists in the collection or is loadable from a source. */ template bool contains(const std::string &name) - { return get_status::Type>(name)>0; } + { return get_status::type>(name)>0; } /// Returns the name of an item in the collection. template const std::string &get_name(T *d) const { - typedef RefPtr::Type> RPNCT; + typedef RefPtr::type> RPNCT; - for(ItemMap::const_iterator i=items.begin(); i!=items.end(); ++i) - if(i->second.check_type()) - if(i->second.value().get()==d) - return i->first; + for(const auto &kvp: items) + if(kvp.second.check_type()) + if(kvp.second.value().get()==d) + return kvp.first; // XXX Need better exception class throw std::runtime_error("Item not found in collection"); @@ -370,8 +369,8 @@ public: template bool can_extract() const { - for(std::vector::const_iterator i=extractors.begin(); i!=extractors.end(); ++i) - if(dynamic_cast *>(*i)) + for(ExtractorBase *e: extractors) + if(dynamic_cast *>(e)) return true; return false; } @@ -379,8 +378,8 @@ public: template T *extract(const Variant &var) const { - for(std::vector::const_iterator i=extractors.begin(); i!=extractors.end(); ++i) - if(Extractor *ex = dynamic_cast *>(*i)) + for(ExtractorBase *e: extractors) + if(Extractor *ex = dynamic_cast *>(e)) return &ex->extract(var); return 0; } @@ -453,8 +452,8 @@ public: ~CollectionItemType() { delete creat; - for(typename std::vector::const_iterator i=notif.begin(); i!=notif.end(); ++i) - delete *i; + for(NotifyeeBase *n: notif) + delete n; } /** Sets a datafile keyword for this item type. The Collection's loader @@ -534,8 +533,8 @@ public: virtual void notify_item(Collection &coll, const std::string &name, const Variant &var) const { RefPtr obj = var.value >(); - for(typename std::vector::const_iterator i=notif.begin(); i!=notif.end(); ++i) - (*i)->notify(coll, name, *obj); + for(NotifyeeBase *n: notif) + n->notify(coll, name, *obj); } }; @@ -580,9 +579,9 @@ typename CollectionItemTypeChooser::Type &Collection::add_type() template typename CollectionItemTypeChooser::Type &Collection::modify_type() { - for(TypeList::const_iterator j=types.begin(); j!=types.end(); ++j) - if(CollectionItemType *t = dynamic_cast *>(*j)) - return *t; + for(CollectionItemTypeBase *t: types) + if(CollectionItemType *tt = dynamic_cast *>(t)) + return *tt; throw std::logic_error("type not found in collection"); } @@ -590,16 +589,16 @@ typename CollectionItemTypeChooser::Type &Collection::modify_type() template CollectionItemTypeBase *Collection::get_type(const std::string &name) const { - for(TypeList::const_iterator j=types.begin(); j!=types.end(); ++j) - if(dynamic_cast *>(*j)) - return *j; + for(CollectionItemTypeBase *t: types) + if(dynamic_cast *>(t)) + return t; CollectionItemTypeBase *type = 0; - for(TypeList::const_iterator j=types.begin(); j!=types.end(); ++j) - if((*j)->can_extract()) + for(CollectionItemTypeBase *t: types) + if(t->can_extract()) { - if(!name.empty() && (*j)->match_name(name)) - return *j; - type = *j; + if(!name.empty() && t->match_name(name)) + return t; + type = t; } return type; }