diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.h b/alib2algo/src/arbology/exact/ExactPatternMatch.h index d51bb809e290fce91eecd4838d2c569b795c0129..824fbe3ff8b5a5836efa4d7d165c60415a307792 100644 --- a/alib2algo/src/arbology/exact/ExactPatternMatch.h +++ b/alib2algo/src/arbology/exact/ExactPatternMatch.h @@ -92,12 +92,17 @@ bool ExactPatternMatch::matchHelper ( const ext::tree < SymbolType > & subject, if ( subject.getData ( ) != pattern.getData ( ) ) return false; - if ( subject.getChildren ( ).size ( ) != pattern.getChildren ( ).size ( ) ) return false; + auto patternIter = pattern.getChildren ( ).begin ( ); + auto subjectIter = subject.getChildren ( ).begin ( ); - for ( const ext::tuple < const ext::tree < SymbolType > &, const ext::tree < SymbolType > & > & childs : ext::make_tuple_foreach ( subject.getChildren ( ), pattern.getChildren ( ) ) ) - if ( !matchHelper ( std::get < 0 > ( childs ), std::get < 1 > ( childs ), subtreeVariable ) ) return false; + while ( patternIter != pattern.getChildren ( ).end ( ) || subjectIter != subject.getChildren ( ).end ( ) ) { + if ( matchHelper ( * subjectIter, * patternIter, subtreeVariable ) ) + ++ patternIter; - return true; + ++ subjectIter; + } + + return patternIter == pattern.getChildren ( ).end ( ); } template < class SymbolType > diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatch.h b/alib2algo/src/arbology/exact/ExactSubtreeMatch.h index 5ee6bccadf93b9664af1d167f3de4b3ae1e0eb34..c754d7545bc7da2e1c8ef4da06aebce38a90fe90 100644 --- a/alib2algo/src/arbology/exact/ExactSubtreeMatch.h +++ b/alib2algo/src/arbology/exact/ExactSubtreeMatch.h @@ -54,12 +54,17 @@ template < class SymbolType > bool ExactSubtreeMatch::matchHelper ( const ext::tree < SymbolType > & subject, const ext::tree < SymbolType > & pattern ) { if ( subject.getData ( ) != pattern.getData ( ) ) return false; - if ( subject.getChildren ( ).size ( ) != pattern.getChildren ( ).size ( ) ) return false; + auto patternIter = pattern.getChildren ( ).begin ( ); + auto subjectIter = subject.getChildren ( ).begin ( ); - for ( const ext::tuple < const ext::tree < SymbolType > &, const ext::tree < SymbolType > & > & childs : ext::make_tuple_foreach ( subject.getChildren ( ), pattern.getChildren ( ) ) ) - if ( !matchHelper ( std::get < 0 > ( childs ), std::get < 1 > ( childs ) ) ) return false; + while ( patternIter != pattern.getChildren ( ).end ( ) || subjectIter != subject.getChildren ( ).end ( ) ) { + if ( matchHelper ( * subjectIter, * patternIter ) ) + ++ patternIter; - return true; + ++ subjectIter; + } + + return patternIter == pattern.getChildren ( ).end ( ); } template < class SymbolType >