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