From 1e8b1d9c9cde66cd3707412034c0c542fb297b2e Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Tue, 20 Jun 2017 18:54:30 +0200 Subject: [PATCH] traverse() as a global function rather than method on IfcFile --- src/ifcparse/IfcFile.h | 1 - src/ifcparse/IfcParse.cpp | 17 +++++++++++------ src/ifcparse/IfcParse.h | 2 ++ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/ifcparse/IfcFile.h b/src/ifcparse/IfcFile.h index f4e13fc463..1c6c941431 100644 --- a/src/ifcparse/IfcFile.h +++ b/src/ifcparse/IfcFile.h @@ -55,7 +55,6 @@ private: IfcSpfHeader _header; void setDefaultHeaderValues(); - void traverse(IfcUtil::IfcBaseClass*, std::set& visited, IfcEntityList::ptr list, int level, int max_level); void register_inverse(unsigned, Token); public: IfcParse::IfcSpfLexer* tokens; diff --git a/src/ifcparse/IfcParse.cpp b/src/ifcparse/IfcParse.cpp index d2502a23d4..a7bf4b369f 100644 --- a/src/ifcparse/IfcParse.cpp +++ b/src/ifcparse/IfcParse.cpp @@ -1261,7 +1261,7 @@ bool IfcFile::Init(IfcParse::IfcSpfStream* s) { return true; } -void IfcFile::traverse(IfcUtil::IfcBaseClass* instance, std::set& visited, IfcEntityList::ptr list, int level, int max_level) { +void traverse_(IfcUtil::IfcBaseClass* instance, std::set& visited, IfcEntityList::ptr list, int level, int max_level) { if (visited.find(instance) != visited.end()) { return; } @@ -1274,30 +1274,35 @@ void IfcFile::traverse(IfcUtil::IfcBaseClass* instance, std::setgetArgument(i); if (arg->type() == IfcUtil::Argument_ENTITY_INSTANCE) { - traverse(*arg, visited, list, level + 1, max_level); + traverse_(*arg, visited, list, level + 1, max_level); } else if (arg->type() == IfcUtil::Argument_AGGREGATE_OF_ENTITY_INSTANCE) { IfcEntityList::ptr entity_list_attribute = *arg; for (IfcEntityList::it it = entity_list_attribute->begin(); it != entity_list_attribute->end(); ++it) { - traverse(*it, visited, list, level + 1, max_level); + traverse_(*it, visited, list, level + 1, max_level); } } else if (arg->type() == IfcUtil::Argument_AGGREGATE_OF_AGGREGATE_OF_ENTITY_INSTANCE) { IfcEntityListList::ptr entity_list_attribute = *arg; for (IfcEntityListList::outer_it it = entity_list_attribute->begin(); it != entity_list_attribute->end(); ++it) { for (IfcEntityListList::inner_it jt = it->begin(); jt != it->end(); ++jt) { - traverse(*jt, visited, list, level + 1, max_level); + traverse_(*jt, visited, list, level + 1, max_level); } } } } } -IfcEntityList::ptr IfcFile::traverse(IfcUtil::IfcBaseClass* instance, int max_level) { +IfcEntityList::ptr IfcParse::traverse(IfcUtil::IfcBaseClass* instance, int max_level) { std::set visited; IfcEntityList::ptr return_value(new IfcEntityList); - traverse(instance, visited, return_value, 0, max_level); + traverse_(instance, visited, return_value, 0, max_level); return return_value; } +/// @note: for backwards compatibility +IfcEntityList::ptr IfcFile::traverse(IfcUtil::IfcBaseClass* instance, int max_level) { + return IfcParse::traverse(instance, max_level); +} + void IfcFile::addEntities(IfcEntityList::ptr es) { for( IfcEntityList::it i = es->begin(); i != es->end(); ++ i ) { addEntity(*i); diff --git a/src/ifcparse/IfcParse.h b/src/ifcparse/IfcParse.h index cbed319f0e..a91d530ee5 100644 --- a/src/ifcparse/IfcParse.h +++ b/src/ifcparse/IfcParse.h @@ -257,6 +257,8 @@ namespace IfcParse { }; IfcEntityInstanceData* read(unsigned int i, IfcFile* t, boost::optional offset = boost::none); + + IfcEntityList::ptr traverse(IfcUtil::IfcBaseClass* instance, int max_level = -1); } IFC_PARSE_API std::ostream& operator<< (std::ostream& os, const IfcParse::IfcFile& f);