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