From 000d11daab57c2a264fbc3125a982ba5cbd4d71a Mon Sep 17 00:00:00 2001 From: Stinkfist0 Date: Fri, 21 Dec 2018 12:06:35 +0200 Subject: [PATCH] IfcFile: possibility to mark an entity as modified so that potential cache is invalidated. --- src/ifcparse/IfcFile.h | 4 ++++ src/ifcparse/IfcParse.cpp | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/ifcparse/IfcFile.h b/src/ifcparse/IfcFile.h index 1e871412fe..66f5c86159 100644 --- a/src/ifcparse/IfcFile.h +++ b/src/ifcparse/IfcFile.h @@ -148,6 +148,10 @@ public: /// in the first function argument. IfcEntityList::ptr traverse(IfcUtil::IfcBaseClass* instance, int max_level=-1); + /// Marks entity as modified so that potential cache for it is invalidated. + /// @todo Currently the whole cache is invalidated. Implement more fine-grained invalidation. + void mark_entity_as_modified(int id); + #ifdef USE_MMAP bool Init(const std::string& fn, bool mmap=false); #else diff --git a/src/ifcparse/IfcParse.cpp b/src/ifcparse/IfcParse.cpp index cd904790af..9e2b3bb41d 100644 --- a/src/ifcparse/IfcParse.cpp +++ b/src/ifcparse/IfcParse.cpp @@ -1213,7 +1213,9 @@ void IfcEntityInstanceData::setArgument(unsigned int i, Argument* a, IfcUtil::Ar if (this->file) { register_inverse_visitor visitor(*this->file, *this); apply_individual_instance_visitor(copy).apply(visitor); - } + + this->file->mark_entity_as_modified(id_); + } if (i < attributes_.size()) { attributes_[i] = copy; @@ -1429,6 +1431,11 @@ IfcEntityList::ptr IfcFile::traverse(IfcUtil::IfcBaseClass* instance, int max_le return IfcParse::traverse(instance, max_level); } +void IfcFile::mark_entity_as_modified(int /*id*/) +{ + by_ref_cached_.clear(); +} + void IfcFile::addEntities(IfcEntityList::ptr es) { for( IfcEntityList::it i = es->begin(); i != es->end(); ++ i ) { addEntity(*i);