From a50e5bf1af9e5a848d73fa023dc41a548ef53d12 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <jan.travnicek@.fit.cvut.cz> Date: Mon, 3 Feb 2020 12:08:49 +0100 Subject: [PATCH] make unranked match really unranked --- alib2algo/src/arbology/exact/ExactPatternMatch.h | 13 +++++++++---- alib2algo/src/arbology/exact/ExactSubtreeMatch.h | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.h b/alib2algo/src/arbology/exact/ExactPatternMatch.h index d51bb809e2..824fbe3ff8 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 5ee6bccadf..c754d7545b 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 > -- GitLab