From 41edea273b589912011d73ce4f6e9e5bcb1efe6c Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 19 May 2015 08:14:30 +0200
Subject: [PATCH] +PrefixRankedNotation

---
 alib2data/src/XmlApi.cpp                      |  17 +++
 alib2data/src/XmlApi.hpp                      |   9 ++
 alib2data/src/object/ObjectBase.h             |   5 +-
 alib2data/src/tree/TreeBase.h                 |   2 +-
 alib2data/src/tree/TreeFeatures.h             |   2 +-
 alib2data/src/tree/TreeFromRawParser.cpp      |   5 +-
 alib2data/src/tree/TreeFromXMLParser.cpp      |  21 +++
 alib2data/src/tree/TreeFromXMLParser.h        |   2 +
 alib2data/src/tree/TreeToRawComposer.cpp      |  27 ++++
 alib2data/src/tree/TreeToRawComposer.h        |   5 +-
 alib2data/src/tree/TreeToXMLComposer.cpp      |  13 ++
 alib2data/src/tree/TreeToXMLComposer.h        |   6 +-
 .../src/tree/ranked/PrefixRankedNotation.cpp  | 120 ++++++++++++++++++
 .../src/tree/ranked/PrefixRankedNotation.h    |  80 ++++++++++++
 14 files changed, 303 insertions(+), 11 deletions(-)
 create mode 100644 alib2data/src/tree/ranked/PrefixRankedNotation.cpp
 create mode 100644 alib2data/src/tree/ranked/PrefixRankedNotation.h

diff --git a/alib2data/src/XmlApi.cpp b/alib2data/src/XmlApi.cpp
index cb7bbd5f05..6eaa7dfc41 100644
--- a/alib2data/src/XmlApi.cpp
+++ b/alib2data/src/XmlApi.cpp
@@ -107,6 +107,7 @@ const std::string Names::PRIMITIVE_CHARACTER = "Character";
 const std::string Names::PRIMITIVE_UNSIGNED = "Unsigned";
 const std::string Names::PRIMITIVE_BOOL = "Bool";
 const std::string Names::TREE_RANKED_TREE = "RankedTree";
+const std::string Names::TREE_PREFIX_RANKED_NOTATION = "PrefixRankedNotation";
 const std::string Names::TREE_UNRANKED_TREE = "UnrankedTree";
 
 Void xmlApi<Void>::parse(std::deque<sax::Token>& input) {
@@ -1136,6 +1137,18 @@ void xmlApi<tree::Tree>::compose(std::deque<sax::Token>& output, const tree::Tre
 	ToXMLComposers::treeComposer.compose(output, data);
 }
 
+tree::PrefixRankedNotation xmlApi<tree::PrefixRankedNotation>::parse(std::deque<sax::Token>& input) {
+	return FromXMLParsers::treeParser.parsePrefixRankedNotation(input);
+}
+
+bool xmlApi<tree::PrefixRankedNotation>::first(const std::deque<sax::Token>& input) {
+	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::TREE_RANKED_TREE);
+}
+
+void xmlApi<tree::PrefixRankedNotation>::compose(std::deque<sax::Token>& output, const tree::PrefixRankedNotation& data) {
+	ToXMLComposers::treeComposer.compose(output, data);
+}
+
 tree::RankedTree xmlApi<tree::RankedTree>::parse(std::deque<sax::Token>& input) {
 	return FromXMLParsers::treeParser.parseRankedTree(input);
 }
@@ -1436,6 +1449,10 @@ void ToXMLComposers::Visit(void* data, const tree::RankedTree& tree) const {
 	xmlApi<tree::RankedTree>::compose(*((std::deque<sax::Token>*) data), tree);
 }
 
+void ToXMLComposers::Visit(void* data, const tree::PrefixRankedNotation& tree) const {
+	xmlApi<tree::PrefixRankedNotation>::compose(*((std::deque<sax::Token>*) data), tree);
+}
+
 void ToXMLComposers::Visit(void* data, const tree::UnrankedTree& tree) const {
 	xmlApi<tree::UnrankedTree>::compose(*((std::deque<sax::Token>*) data), tree);
 }
diff --git a/alib2data/src/XmlApi.hpp b/alib2data/src/XmlApi.hpp
index a4f7c9772d..7eb140fe3b 100644
--- a/alib2data/src/XmlApi.hpp
+++ b/alib2data/src/XmlApi.hpp
@@ -108,6 +108,7 @@ public:
 	const static std::string PRIMITIVE_UNSIGNED;
 	const static std::string PRIMITIVE_BOOL;
 	const static std::string TREE_RANKED_TREE;
+	const static std::string TREE_PREFIX_RANKED_NOTATION;
 	const static std::string TREE_UNRANKED_TREE;
 
 };
@@ -763,6 +764,13 @@ struct xmlApi<tree::RankedTree> {
 	static void compose(std::deque<sax::Token>& output, const tree::RankedTree& data);
 };
 
+template<>
+struct xmlApi<tree::PrefixRankedNotation> {
+	static tree::PrefixRankedNotation parse(std::deque<sax::Token>& input);
+	static bool first(const std::deque<sax::Token>& input);
+	static void compose(std::deque<sax::Token>& output, const tree::PrefixRankedNotation& data);
+};
+
 template<>
 struct xmlApi<tree::UnrankedTree> {
 	static tree::UnrankedTree parse(std::deque<sax::Token>& input);
@@ -891,6 +899,7 @@ private:
 	void Visit(void*, const primitive::Bool& primitive) const;
 
 	void Visit(void*, const tree::RankedTree& tree) const;
+	void Visit(void*, const tree::PrefixRankedNotation& tree) const;
 	void Visit(void*, const tree::UnrankedTree& tree) const;
 
 public:
diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h
index b5bc6f416f..2682c9137c 100644
--- a/alib2data/src/object/ObjectBase.h
+++ b/alib2data/src/object/ObjectBase.h
@@ -139,6 +139,7 @@ class Bool;
 namespace tree {
 
 class RankedTree;
+class PrefixRankedNotation;
 class UnrankedTree;
 
 }
@@ -159,7 +160,7 @@ typedef std::acceptor_base<ObjectBase,
 			alphabet::EndSymbol, alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, alphabet::UniqueSymbol, alphabet::StartSymbol,
 			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap,
 			primitive::String, primitive::Integer, primitive::Character, primitive::Unsigned, primitive::Bool,
-			tree::RankedTree, tree::UnrankedTree
+			tree::RankedTree, tree::PrefixRankedNotation, tree::UnrankedTree
 	> VisitableObjectBase;
 
 class ObjectBase :
@@ -176,7 +177,7 @@ class ObjectBase :
 			alphabet::EndSymbol, alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, alphabet::UniqueSymbol, alphabet::StartSymbol,
 			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap,
 			primitive::String, primitive::Integer, primitive::Character, primitive::Unsigned, primitive::Bool,
-			tree::RankedTree, tree::UnrankedTree
+			tree::RankedTree, tree::PrefixRankedNotation, tree::UnrankedTree
 	>, public VisitableObjectBase, public std::cow_shared_ptr_base {
 };
 
diff --git a/alib2data/src/tree/TreeBase.h b/alib2data/src/tree/TreeBase.h
index 8de49f03ae..4a91f60f7e 100644
--- a/alib2data/src/tree/TreeBase.h
+++ b/alib2data/src/tree/TreeBase.h
@@ -17,7 +17,7 @@ namespace tree {
 class TreeBase;
 
 typedef std::acceptor_base<TreeBase,
-			tree::RankedTree, tree::UnrankedTree
+			tree::RankedTree, tree::PrefixRankedNotation, tree::UnrankedTree
 	> VisitableTreeBase;
 
 /**
diff --git a/alib2data/src/tree/TreeFeatures.h b/alib2data/src/tree/TreeFeatures.h
index 4947e68e07..5021cb77bf 100644
--- a/alib2data/src/tree/TreeFeatures.h
+++ b/alib2data/src/tree/TreeFeatures.h
@@ -11,7 +11,7 @@
 namespace tree {
 
 enum class FEATURES {
-	RANKED_TREE, UNRANKED_TREE
+	RANKED_TREE, PREFIX_RANKED_NOTATION, UNRANKED_TREE
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/TreeFromRawParser.cpp b/alib2data/src/tree/TreeFromRawParser.cpp
index 55d4139d28..fc5bfcd739 100644
--- a/alib2data/src/tree/TreeFromRawParser.cpp
+++ b/alib2data/src/tree/TreeFromRawParser.cpp
@@ -8,6 +8,7 @@
 #include "TreeFromRawParser.h"
 #include "TreeException.h"
 #include "ranked/RankedTree.h"
+#include "ranked/PrefixRankedNotation.h"
 #include "unranked/UnrankedTree.h"
 #include "../alphabet/LabeledSymbol.h"
 #include "../label/Label.h"
@@ -15,7 +16,7 @@
 namespace tree {
 
 Tree TreeFromRawParser::parseTree(std::deque<sax::Token>& input) const {
-	return parseTree(input, std::set<FEATURES>({FEATURES::RANKED_TREE, FEATURES::UNRANKED_TREE}));
+	return parseTree(input, std::set<FEATURES>({FEATURES::RANKED_TREE, FEATURES::PREFIX_RANKED_NOTATION, FEATURES::UNRANKED_TREE}));
 }
 
 Tree TreeFromRawParser::parseTree(std::deque<sax::Token> &input, const std::set<FEATURES>& features) const {
@@ -32,6 +33,8 @@ Tree TreeFromRawParser::parseTree(std::deque<sax::Token> &input, const std::set<
 	delete root;
 	if(features.count(FEATURES::UNRANKED_TREE)) return Tree{tree};
 
+	if(features.count(FEATURES::PREFIX_RANKED_NOTATION)) return Tree{PrefixRankedNotation{RankedTree{tree}}};
+
 	if(features.count(FEATURES::RANKED_TREE)) return Tree{RankedTree{tree}};
 
 	throw exception::AlibException("Invalid input");
diff --git a/alib2data/src/tree/TreeFromXMLParser.cpp b/alib2data/src/tree/TreeFromXMLParser.cpp
index b69bc3f6de..3337f077fd 100644
--- a/alib2data/src/tree/TreeFromXMLParser.cpp
+++ b/alib2data/src/tree/TreeFromXMLParser.cpp
@@ -38,6 +38,17 @@ RankedTree TreeFromXMLParser::parseRankedTree(std::deque<sax::Token>& input) con
 	return tree;
 }
 
+PrefixRankedNotation TreeFromXMLParser::parsePrefixRankedNotation(std::deque<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_PREFIX_RANKED_NOTATION);
+
+	std::set<alphabet::RankedSymbol> rankedAlphabet = parseRankedAlphabet(input);
+	std::vector<alphabet::RankedSymbol> data = parseContentData(input);
+	PrefixRankedNotation tree(rankedAlphabet, std::move(data));
+
+	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_PREFIX_RANKED_NOTATION);
+	return tree;
+}
+
 UnrankedTree TreeFromXMLParser::parseUnrankedTree(std::deque<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_UNRANKED_TREE);
 
@@ -68,6 +79,16 @@ std::set<alphabet::LabeledSymbol> TreeFromXMLParser::parseAlphabet(std::deque<sa
 	return symbols;
 }
 
+std::vector<alphabet::RankedSymbol> TreeFromXMLParser::parseContentData(std::deque<sax::Token>& input) const {
+	std::vector<alphabet::RankedSymbol> data;
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "content");
+	while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
+		data.push_back(alib::xmlApi<alphabet::RankedSymbol>::parse(input));
+	}
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "content");
+	return data;
+}
+
 RankedNode * TreeFromXMLParser::parseRankedNode(std::deque<sax::Token> &input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "rankedNode");
 	alphabet::RankedSymbol symbol = alib::xmlApi<alphabet::RankedSymbol>::parse(input);
diff --git a/alib2data/src/tree/TreeFromXMLParser.h b/alib2data/src/tree/TreeFromXMLParser.h
index f6514aa991..346e3620c3 100644
--- a/alib2data/src/tree/TreeFromXMLParser.h
+++ b/alib2data/src/tree/TreeFromXMLParser.h
@@ -37,6 +37,7 @@ public:
 
 private:
 	RankedNode * parseRankedNode(std::deque<sax::Token> &input) const;
+	std::vector<alphabet::RankedSymbol> parseContentData(std::deque<sax::Token> &input) const;
 	UnrankedNode * parseUnrankedNode(std::deque<sax::Token> &input) const;
 	std::set<alphabet::RankedSymbol> parseRankedAlphabet(std::deque<sax::Token> &input) const;
 	std::set<alphabet::LabeledSymbol> parseAlphabet(std::deque<sax::Token> &input) const;
@@ -45,6 +46,7 @@ private:
 	Tree parseTree(std::deque<sax::Token>& input, const std::set<FEATURES>& features) const;
 
 	RankedTree parseRankedTree(std::deque<sax::Token>& input) const;
+	PrefixRankedNotation parsePrefixRankedNotation(std::deque<sax::Token>& input) const;
 	UnrankedTree parseUnrankedTree(std::deque<sax::Token>& input) const;
 
 	template<typename T> friend struct alib::xmlApi;
diff --git a/alib2data/src/tree/TreeToRawComposer.cpp b/alib2data/src/tree/TreeToRawComposer.cpp
index f94f258ecf..b5a664e45b 100644
--- a/alib2data/src/tree/TreeToRawComposer.cpp
+++ b/alib2data/src/tree/TreeToRawComposer.cpp
@@ -23,6 +23,11 @@ void TreeToRawComposer::compose(std::deque<sax::Token>& out, const RankedTree& t
 	composeNode(out, tree.getRoot());
 }
 
+void TreeToRawComposer::compose(std::deque<sax::Token>& out, const PrefixRankedNotation& tree) const {
+	unsigned i = 0;
+	composeNotation(out, i, tree.getContent());
+}
+
 void TreeToRawComposer::compose(std::deque<sax::Token>& out, const UnrankedTree& tree) const {
 	composeNode(out, tree.getRoot());
 }
@@ -40,6 +45,23 @@ void TreeToRawComposer::composeNode(std::deque<sax::Token>& out, const RankedNod
 	}
 }
 
+void TreeToRawComposer::composeNotation(std::deque<sax::Token>& out, unsigned& index, const std::vector<alphabet::RankedSymbol>& notation) const {
+	unsigned size = notation[index].getRank().getData();
+	unsigned root = index;
+	if(size == 0) {
+		out.emplace_back(sax::Token((std::string) notation[root], sax::Token::TokenType::CHARACTER));
+	} else {
+		out.emplace_back(sax::Token((std::string) notation[root], sax::Token::TokenType::START_ELEMENT));
+
+		index += 1;
+		for(unsigned i = 0; i < size; i++) {
+			composeNotation(out, index, notation);
+		}
+
+		out.emplace_back(sax::Token((std::string) notation[root], sax::Token::TokenType::END_ELEMENT));
+	}
+}
+
 void TreeToRawComposer::composeNode(std::deque<sax::Token>& out, const UnrankedNode& node) const {
 	if(node.getChildren().size() == 0) {
 
@@ -58,6 +80,11 @@ void TreeToRawComposer::Visit(void* userData, const RankedTree& tree) const {
 	this->compose(res, tree);
 }
 
+void TreeToRawComposer::Visit(void* userData, const PrefixRankedNotation& tree) const {
+	std::deque<sax::Token> &res = *((std::deque<sax::Token>*) userData);
+	this->compose(res, tree);
+}
+
 void TreeToRawComposer::Visit(void* userData, const UnrankedTree& tree) const {
 	std::deque<sax::Token> &res = *((std::deque<sax::Token>*) userData);
 	this->compose(res, tree);
diff --git a/alib2data/src/tree/TreeToRawComposer.h b/alib2data/src/tree/TreeToRawComposer.h
index ec0654a548..daf6236121 100644
--- a/alib2data/src/tree/TreeToRawComposer.h
+++ b/alib2data/src/tree/TreeToRawComposer.h
@@ -31,12 +31,13 @@ public:
 	TreeToRawComposer() {}
 
 	void Visit(void*, const RankedTree& empty) const;
+	void Visit(void*, const PrefixRankedNotation& empty) const;
 	void Visit(void*, const UnrankedTree& empty) const;
 
 	void compose(std::deque<sax::Token>& out, const Tree& tree) const;
 
 	void compose(std::deque<sax::Token>& out, const RankedTree& tree) const;
-
+	void compose(std::deque<sax::Token>& out, const PrefixRankedNotation& tree) const;
 	void compose(std::deque<sax::Token>& out, const UnrankedTree& tree) const;
 
 private:
@@ -48,7 +49,7 @@ private:
 	void compose(std::deque<sax::Token>& out, const TreeBase& tree) const;
 
 	void composeNode(std::deque<sax::Token>& out, const RankedNode& node) const;
-
+	void composeNotation(std::deque<sax::Token>& out, unsigned& index, const std::vector<alphabet::RankedSymbol>& notation) const;
 	void composeNode(std::deque<sax::Token>& out, const UnrankedNode& node) const;
 
 	static const TreeToRawComposer TREE_TO_RAW_COMPOSER;
diff --git a/alib2data/src/tree/TreeToXMLComposer.cpp b/alib2data/src/tree/TreeToXMLComposer.cpp
index d7347acb3b..f385fbffd6 100644
--- a/alib2data/src/tree/TreeToXMLComposer.cpp
+++ b/alib2data/src/tree/TreeToXMLComposer.cpp
@@ -44,6 +44,19 @@ void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const RankedTree& t
 	out.emplace_back(sax::Token(alib::Names::TREE_RANKED_TREE, sax::Token::TokenType::END_ELEMENT));
 }
 
+void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const PrefixRankedNotation& tree) const {
+	out.emplace_back(sax::Token(alib::Names::TREE_PREFIX_RANKED_NOTATION, sax::Token::TokenType::START_ELEMENT));
+
+	composeAlphabet(out, tree.getAlphabet());
+	out.emplace_back("content", sax::Token::TokenType::START_ELEMENT);
+	for(const auto& symbol : tree.getContent()) {
+		alib::xmlApi<alphabet::RankedSymbol>::compose(out, symbol);
+	}
+	out.emplace_back("content", sax::Token::TokenType::END_ELEMENT);
+
+	out.emplace_back(sax::Token(alib::Names::TREE_PREFIX_RANKED_NOTATION, sax::Token::TokenType::END_ELEMENT));
+}
+
 void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const UnrankedTree& tree) const {
 	out.emplace_back(sax::Token(alib::Names::TREE_UNRANKED_TREE, sax::Token::TokenType::START_ELEMENT));
 
diff --git a/alib2data/src/tree/TreeToXMLComposer.h b/alib2data/src/tree/TreeToXMLComposer.h
index 4a00196ec1..6aed53c640 100644
--- a/alib2data/src/tree/TreeToXMLComposer.h
+++ b/alib2data/src/tree/TreeToXMLComposer.h
@@ -12,6 +12,7 @@
 #include <deque>
 #include "Tree.h"
 #include "ranked/RankedTree.h"
+#include "ranked/PrefixRankedNotation.h"
 #include "unranked/UnrankedTree.h"
 #include "../sax/Token.h"
 
@@ -33,7 +34,6 @@ public:
 
 private:
 	void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::RankedSymbol>& symbols) const;
-
 	void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::LabeledSymbol>& symbols) const;
 
 	/**
@@ -42,15 +42,13 @@ private:
 	 * @return list of xml tokens representing the tree
 	 */
 	void compose(std::deque<sax::Token>& out, const TreeBase& tree) const;
-
 	void compose(std::deque<sax::Token>& out, const Tree& tree) const;
 
 	void compose(std::deque<sax::Token>& out, const RankedTree& tree) const;
-
+	void compose(std::deque<sax::Token>& out, const PrefixRankedNotation& tree) const;
 	void compose(std::deque<sax::Token>& out, const UnrankedTree& tree) const;
 
 	void composeNode(std::deque<sax::Token>& out, const RankedNode& node) const;
-
 	void composeNode(std::deque<sax::Token>& out, const UnrankedNode& node) const;
 
 	template<typename T> friend struct alib::xmlApi;
diff --git a/alib2data/src/tree/ranked/PrefixRankedNotation.cpp b/alib2data/src/tree/ranked/PrefixRankedNotation.cpp
new file mode 100644
index 0000000000..cca535d8ca
--- /dev/null
+++ b/alib2data/src/tree/ranked/PrefixRankedNotation.cpp
@@ -0,0 +1,120 @@
+/*
+ * PrefixRankedNotation.cpp
+ *
+ *  Created on: Nov 23, 2013
+ *      Author: Jan Travnicek
+ */
+
+#include "PrefixRankedNotation.h"
+#include "../../exception/AlibException.h"
+
+#include <sstream>
+#include <algorithm>
+#include <deque>
+
+#include "RankedTree.h"
+
+namespace tree {
+
+PrefixRankedNotation::PrefixRankedNotation(const std::set<alphabet::RankedSymbol>& alphabet, const std::vector<alphabet::RankedSymbol>& data) {
+	this->alphabet = alphabet;
+	setContent(data);
+}
+
+PrefixRankedNotation::PrefixRankedNotation(std::set<alphabet::RankedSymbol>&& alphabet, std::vector<alphabet::RankedSymbol>&& data) {
+	this->alphabet = std::move(alphabet);
+	setContent(std::move(data));
+}
+
+PrefixRankedNotation::PrefixRankedNotation(const std::vector<alphabet::RankedSymbol>& data) {
+	alphabet = std::set<alphabet::RankedSymbol>(data.begin(), data.end());
+	m_Data = data;
+}
+
+PrefixRankedNotation::PrefixRankedNotation(std::vector<alphabet::RankedSymbol>&& data) {
+	alphabet = std::set<alphabet::RankedSymbol>(data.begin(), data.end());
+	m_Data = std::move(data);
+}
+
+PrefixRankedNotation::PrefixRankedNotation(const RankedTree& tree) {
+	alphabet = tree.getAlphabet();
+	std::deque<const RankedNode*> queue {&tree.getRoot()};
+	while(!queue.empty()) {
+		const RankedNode* elem = queue.back();
+		queue.pop_back();
+
+		m_Data.push_back(elem->getSymbol());
+		for(const RankedNode* child : elem->getChildren()) {
+			queue.push_back(child);
+		}
+	}
+}
+
+TreeBase* PrefixRankedNotation::clone() const {
+	return new PrefixRankedNotation(*this);
+}
+
+TreeBase* PrefixRankedNotation::plunder() && {
+	return new PrefixRankedNotation(std::move(*this));
+}
+
+bool PrefixRankedNotation::removeSymbolFromAlphabet(const alphabet::RankedSymbol & symbol) {
+	if(std::any_of(m_Data.begin(), m_Data.end(), [&](const alphabet::RankedSymbol & s) { return s == symbol; } ) )
+		throw exception::AlibException("Input symbol \"" + (std::string) symbol + "\" is used.");
+
+	return alphabet.erase(symbol);
+}
+
+const std::vector<alphabet::RankedSymbol>& PrefixRankedNotation::getContent() const {
+	return this->m_Data;
+}
+
+void PrefixRankedNotation::setContent(std::vector<alphabet::RankedSymbol> data) {
+	std::set<alphabet::RankedSymbol> minimalAlphabet(data.begin(), data.end());
+	std::set<alphabet::RankedSymbol> unknownSymbols;
+	std::set_difference(minimalAlphabet.begin(), minimalAlphabet.end(), alphabet.begin(), alphabet.end(), std::inserter(unknownSymbols, unknownSymbols.end()));
+
+	if(unknownSymbols.size() > 0)
+		throw exception::AlibException("Input symbols not in the alphabet.");
+
+	this->m_Data = std::move(data);
+}
+
+bool PrefixRankedNotation::isEmpty() const {
+	return this->m_Data.size() == 0;
+}
+
+int PrefixRankedNotation::compare(const PrefixRankedNotation& other) const {
+	auto first = std::tie(m_Data, alphabet);
+	auto second = std::tie(other.m_Data, other.alphabet);
+
+	std::compare<decltype(first)> comp;
+	return comp(first, second);
+}
+
+void PrefixRankedNotation::operator >>(std::ostream& out) const {
+	if( this->isEmpty() ) {
+		out << "(Epsilon)";
+	} else {
+		out << "(PrefixRankedNotation ";
+		for(const alphabet::RankedSymbol& symbol : this->m_Data)
+			out << symbol;
+		out << ")";
+	}
+}
+
+PrefixRankedNotation::operator std::string () const {
+	std::stringstream ss;
+	if( this->isEmpty() ) {
+		ss << "E";
+	} else {
+		ss << "\"";
+		for(const alphabet::RankedSymbol& symbol : this->m_Data)
+			ss << (std::string) symbol;
+		ss << "\"";
+	}
+	return std::move(ss).str();
+}
+
+} /* namespace tree */
+
diff --git a/alib2data/src/tree/ranked/PrefixRankedNotation.h b/alib2data/src/tree/ranked/PrefixRankedNotation.h
new file mode 100644
index 0000000000..6ad54a8f63
--- /dev/null
+++ b/alib2data/src/tree/ranked/PrefixRankedNotation.h
@@ -0,0 +1,80 @@
+/*
+ * PrefixRankedNotation.h
+ *
+ *  Created on: Nov 23, 2013
+ *      Author: Jan Travnicek
+ */
+
+#ifndef PREFIX_RANKED_NOTATION_H_
+#define PREFIX_RANKED_NOTATION_H_
+
+#include <set>
+#include <vector>
+
+#include "../../alphabet/RankedSymbol.h"
+#include "../TreeBase.h"
+#include "../common/RankedAlphabet.h"
+
+namespace tree {
+
+/**
+ * Represents regular expression parsed from the XML. Regular expression is stored
+ * as a tree of LinearStringElement.
+ */
+class PrefixRankedNotation : public std::acceptor<PrefixRankedNotation, VisitableTreeBase, std::acceptor<PrefixRankedNotation, alib::VisitableObjectBase, TreeBase> >, public RankedAlphabet {
+	std::vector<alphabet::RankedSymbol> m_Data;
+
+public:
+	explicit PrefixRankedNotation(const std::set<alphabet::RankedSymbol>& alphabet, const std::vector<alphabet::RankedSymbol>& data);
+	explicit PrefixRankedNotation(std::set<alphabet::RankedSymbol>&& alphabet, std::vector<alphabet::RankedSymbol>&& data);
+	explicit PrefixRankedNotation(const std::vector<alphabet::RankedSymbol>& data);
+	explicit PrefixRankedNotation(std::vector<alphabet::RankedSymbol>&& data);
+	explicit PrefixRankedNotation(const RankedTree& tree);
+
+	virtual TreeBase* clone() const;
+	virtual TreeBase* plunder() &&;
+
+	virtual bool removeSymbolFromAlphabet(const alphabet::RankedSymbol & symbol);
+
+	/**
+	 * @return List of symbols forming tree (const version).
+	 */
+	const std::vector<alphabet::RankedSymbol>& getContent() const;
+
+	void setContent(std::vector<alphabet::RankedSymbol> data);
+
+	/**
+	 * @return true if tree is an empty word (vector length is 0)
+	 */
+	bool isEmpty() const;
+
+	virtual int compare(const ObjectBase& other) const {
+		return -other.compare(*this);
+	}
+
+	virtual int compare(const PrefixRankedNotation& other) const;
+
+	virtual void operator >>(std::ostream& out) const;
+
+	virtual explicit operator std::string() const;
+
+	virtual int selfTypeId() const {
+		return typeId(*this);
+	}
+};
+
+} /* namespace tree */
+
+namespace std {
+
+template<>
+struct compare<::tree::PrefixRankedNotation> {
+	int operator()(const ::tree::PrefixRankedNotation& first, const ::tree::PrefixRankedNotation& second) const {
+		return first.compare(second);
+	}
+};
+
+} /* namespace std */
+
+#endif /* PREFIX_RANKED_NOTATION_H_ */
+
-- 
GitLab