diff --git a/src/ifcparse/IfcFile.h b/src/ifcparse/IfcFile.h index daa31feb27..1e871412fe 100644 --- a/src/ifcparse/IfcFile.h +++ b/src/ifcparse/IfcFile.h @@ -39,6 +39,7 @@ public: typedef boost::unordered_map entity_by_id_t; typedef std::map entity_by_guid_t; typedef std::map > entities_by_ref_t; + typedef std::map ref_map_t; typedef entity_by_id_t::const_iterator const_iterator; class type_iterator : private entities_by_type_t::const_iterator { @@ -77,6 +78,7 @@ private: entities_by_type_t bytype; entities_by_type_t bytype_excl; entities_by_ref_t byref; + ref_map_t by_ref_cached_; entity_by_guid_t byguid; entity_entity_map_t entity_file_map; diff --git a/src/ifcparse/IfcParse.cpp b/src/ifcparse/IfcParse.cpp index 20d7cb53dd..cd904790af 100644 --- a/src/ifcparse/IfcParse.cpp +++ b/src/ifcparse/IfcParse.cpp @@ -1795,12 +1795,19 @@ IfcEntityList::ptr IfcFile::entitiesByReference(int t) { entities_by_ref_t::const_iterator it = byref.find(t); IfcEntityList::ptr ret; if (it != byref.end()) { - ret.reset(new IfcEntityList); - ret->reserve((unsigned)it->second.size()); - const std::vector& ids = it->second; - for (std::vector::const_iterator jt = ids.begin(); jt != ids.end(); ++jt) { - ret->push(entityById(*jt)); - } + ref_map_t::const_iterator cached_it = by_ref_cached_.find(t); + if (cached_it != by_ref_cached_.end()) { + ret = cached_it->second; + } + else { + ret.reset(new IfcEntityList); + ret->reserve((unsigned)it->second.size()); + const std::vector& ids = it->second; + for (std::vector::const_iterator jt = ids.begin(); jt != ids.end(); ++jt) { + ret->push(entityById(*jt)); + } + by_ref_cached_[t] = ret; + } } return ret; }