From 3edb19605f0703cc6e51b82ee197b4ef0b183e3e Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Sun, 27 Sep 2015 21:42:21 +0200
Subject: [PATCH] subtree jump table for PrefixRankedTree

---
 .../src/arbology/exact/SubtreeJumpTable.cpp   | 36 +++++++++++++++++--
 .../src/arbology/exact/SubtreeJumpTable.h     |  3 ++
 2 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp b/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp
index d6b5fc604a..39996c9abb 100644
--- a/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp
+++ b/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp
@@ -8,8 +8,8 @@
 #include "SubtreeJumpTable.h"
 
 #include <exception/AlibException.h>
+#include <tree/ranked/PrefixRankedTree.h>
 #include <tree/ranked/PrefixRankedBarTree.h>
-#include <tree/ranked/PrefixRankedBarPattern.h>
 #include <alphabet/RankedSymbol.h>
 
 #include <map>
@@ -30,6 +30,18 @@ std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedBarTree
 	return res;
 }
 
+auto SubtreeSizesPrefixRankedBarTree = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedBarTree > ( SubtreeJumpTable::getInstance ( ), SubtreeJumpTable::compute );
+
+std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedTree & subject ) {
+	std::vector < int > res;
+
+	buildDataPointers ( res, subject, 0 );
+
+	return res;
+}
+
+auto SubtreeSizesPrefixRankedTree = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedTree > ( SubtreeJumpTable::getInstance ( ), SubtreeJumpTable::compute );
+
 /**
  * used to compute subtree jump table.
  * @param begin - index of a root node of a complete subtree to process
@@ -49,7 +61,27 @@ int SubtreeJumpTable::buildDataPointers ( std::vector < int > & res, const tree:
 	return index;
 }
 
-auto SubtreeSizesPrefixRankedBarTree = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedBarTree > ( SubtreeJumpTable::getInstance ( ), SubtreeJumpTable::compute );
+/**
+ * used to compute subtree jump table.
+ * @param begin - index of a root node of a complete subtree to process
+ * @return index, increased by one, of the last node in the subtree starting at index begin
+ */
+int SubtreeJumpTable::buildDataPointers ( std::vector < int > & res, const tree::PrefixRankedTree & subject, int begin ) {
+	for ( unsigned i = 0; i < subject.getContent ( ).size ( ); i++ )
+		res.push_back ( 0 );
+
+	return buildDataPointersInternal ( res, subject, begin );
+}
+
+int SubtreeJumpTable::buildDataPointersInternal ( std::vector < int > & res, const tree::PrefixRankedTree & subject, int begin ) {
+	int index = begin + 1;
+
+	for ( unsigned i = 0; i < subject.getContent ( )[begin].getRank ( ).getData ( ); i++ )
+		index = buildDataPointersInternal ( res, subject, index );
+
+	res[begin] = index;
+	return index;
+}
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/SubtreeJumpTable.h b/alib2algo/src/arbology/exact/SubtreeJumpTable.h
index 37e588c874..526a22d710 100644
--- a/alib2algo/src/arbology/exact/SubtreeJumpTable.h
+++ b/alib2algo/src/arbology/exact/SubtreeJumpTable.h
@@ -24,8 +24,11 @@ public:
 	static std::vector < int > compute ( const tree::RankedTreeWrapper & subject );
 
 	static std::vector < int > compute ( const tree::PrefixRankedBarTree & subject );
+	static std::vector < int > compute ( const tree::PrefixRankedTree & subject );
 
 	static int buildDataPointers ( std::vector < int > & res, const tree::PrefixRankedBarTree & subject, int begin );
+	static int buildDataPointers ( std::vector < int > & res, const tree::PrefixRankedTree & subject, int begin );
+	static int buildDataPointersInternal ( std::vector < int > & res, const tree::PrefixRankedTree & subject, int begin );
 
 	static SubtreeJumpTable & getInstance ( ) {
 		static SubtreeJumpTable res;
-- 
GitLab