From cf05476f0e211284b3812a911dcbdf4066377f5a Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Mon, 20 Oct 2014 14:48:19 +0200
Subject: [PATCH] primitive::Integer in RankedSymbol and fix parsing

---
 alib2data/src/alphabet/RankedSymbol.cpp          | 16 ++++++++--------
 alib2data/src/alphabet/RankedSymbol.h            |  9 +++++----
 alib2data/src/alphabet/SymbolFeatures.h          |  4 +++-
 alib2data/src/alphabet/SymbolFromXMLParser.cpp   | 10 ++++++++--
 .../src/alphabet/SymbolToStringComposer.cpp      |  8 +++++---
 alib2data/src/alphabet/SymbolToXMLComposer.cpp   |  2 +-
 6 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/alib2data/src/alphabet/RankedSymbol.cpp b/alib2data/src/alphabet/RankedSymbol.cpp
index a5320a7408..0c300b7f41 100644
--- a/alib2data/src/alphabet/RankedSymbol.cpp
+++ b/alib2data/src/alphabet/RankedSymbol.cpp
@@ -2,23 +2,23 @@
 
 namespace alphabet {
 
-RankedSymbol::RankedSymbol(int number, int rank) : label(label::labelFrom(number)), rank(rank) {
+RankedSymbol::RankedSymbol(int number, int rank) : label(label::labelFrom(number)), rank(primitive::Integer(rank)) {
 
 }
 
-RankedSymbol::RankedSymbol(char character, int rank) : label(label::labelFrom(character)), rank(rank) {
+RankedSymbol::RankedSymbol(char character, int rank) : label(label::labelFrom(character)), rank(primitive::Integer(rank)) {
 
 }
 
-RankedSymbol::RankedSymbol(const std::string& label, int rank) : label(label::labelFrom(label)), rank(rank) {
+RankedSymbol::RankedSymbol(const std::string& label, int rank) : label(label::labelFrom(label)), rank(primitive::Integer(rank)) {
 
 }
 
-RankedSymbol::RankedSymbol(const label::Label& label, int rank) : label(label), rank(rank) {
+RankedSymbol::RankedSymbol(const label::Label& label, const primitive::Integer& rank) : label(label), rank(rank) {
 
 }
 
-RankedSymbol::RankedSymbol(label::Label&& label, int rank) : label(std::move(label)), rank(rank) {
+RankedSymbol::RankedSymbol(label::Label&& label, primitive::Integer&& rank) : label(std::move(label)), rank(std::move(rank)) {
 
 }
 
@@ -34,7 +34,7 @@ const label::Label& RankedSymbol::getLabel() const {
 	return label;
 }
 
-int RankedSymbol::getRank() const {
+const primitive::Integer& RankedSymbol::getRank() const {
 	return rank;
 }
 
@@ -61,11 +61,11 @@ bool RankedSymbol::operator <(const RankedSymbol& other) const {
 }
 
 void RankedSymbol::operator>>(std::ostream& out) const {
-	out << "(RankedSymbol " << this->label << " #" << rank << ")";
+	out << "(RankedSymbol " << label << " #" << rank << ")";
 }
 
 RankedSymbol::operator std::string () const {
-	return (std::string) label + "_" + std::to_string(rank);
+	return (std::string) label + "_" + (std::string) rank;
 }
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/RankedSymbol.h b/alib2data/src/alphabet/RankedSymbol.h
index bda49d7815..c13b2c94ba 100644
--- a/alib2data/src/alphabet/RankedSymbol.h
+++ b/alib2data/src/alphabet/RankedSymbol.h
@@ -4,6 +4,7 @@
 #include "../label/Label.h"
 #include "SymbolBase.h"
 #include <ostream>
+#include "../primitive/Integer.h"
 
 namespace alphabet {
 
@@ -13,7 +14,7 @@ namespace alphabet {
 class RankedSymbol : public std::acceptor<RankedSymbol, VisitableSymbolBase, std::acceptor<RankedSymbol, alib::VisitableObjectBase, SymbolBase> > {
 protected:
 	label::Label label;
-	int rank;
+	primitive::Integer rank;
 	
 public:
 	explicit RankedSymbol(int number, int rank);
@@ -25,8 +26,8 @@ public:
 	 * @param symbol name of the symbol
 	 * @param rank of the symbol
 	 */
-	explicit RankedSymbol(const label::Label& label, int rank);
-	explicit RankedSymbol(label::Label&& label, int rank);
+	explicit RankedSymbol(const label::Label& label, const primitive::Integer& rank);
+	explicit RankedSymbol(label::Label&& label, primitive::Integer&& rank);
 
 	virtual SymbolBase* clone() const;
 	virtual SymbolBase* plunder() &&;
@@ -39,7 +40,7 @@ public:
 	/**
 	 * @return rank of the symbol
 	 */
-	int getRank() const;
+	const primitive::Integer& getRank() const;
 
 	virtual bool operator <(const alib::ObjectBase& other) const;
 	virtual bool operator ==(const alib::ObjectBase& other) const;
diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h
index cce97fbfe6..23d2f2c799 100644
--- a/alib2data/src/alphabet/SymbolFeatures.h
+++ b/alib2data/src/alphabet/SymbolFeatures.h
@@ -14,7 +14,9 @@ enum class FEATURES {
 	LABELED,
 	BLANK,
 	BOTTOM,
-	END
+	END,
+	RANKED,
+	BAR
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
index a2769e2896..408d7b1002 100644
--- a/alib2data/src/alphabet/SymbolFromXMLParser.cpp
+++ b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
@@ -15,7 +15,7 @@
 namespace alphabet {
 
 Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input) const {
-	return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END}));
+	return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR}));
 }
 
 Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std::set<FEATURES>& features) const {
@@ -31,6 +31,12 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std:
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "EndSymbol")) {
 		if(!features.count(FEATURES::END)) throw exception::AlibException();
 		return Symbol(parseEndSymbol(input));
+	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "RankedSymbol")) {
+		if(!features.count(FEATURES::RANKED)) throw exception::AlibException();
+		return Symbol(parseRankedSymbol(input));
+	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "BarSymbol")) {
+		if(!features.count(FEATURES::BAR)) throw exception::AlibException();
+		return Symbol(parseBarSymbol(input));
 	} else {
 		throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol", sax::Token::TokenType::START_ELEMENT), input.front());
 	}
@@ -72,7 +78,7 @@ EndSymbol SymbolFromXMLParser::parseEndSymbol(std::list<sax::Token>& input) cons
 RankedSymbol SymbolFromXMLParser::parseRankedSymbol(std::list<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "RankedSymbol");
 	label::Label data = alib::api<label::Label>::parse(input);
-	int rank = std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER));
+	primitive::Integer rank = alib::api<primitive::Integer>::parse(input);
 	popToken(input, sax::Token::TokenType::END_ELEMENT, "RankedSymbol");
 	return RankedSymbol(data, rank);
 }
diff --git a/alib2data/src/alphabet/SymbolToStringComposer.cpp b/alib2data/src/alphabet/SymbolToStringComposer.cpp
index 3b365ce9a6..f42d3eb9d4 100644
--- a/alib2data/src/alphabet/SymbolToStringComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToStringComposer.cpp
@@ -7,6 +7,7 @@
 
 #include "SymbolToStringComposer.h"
 #include "../label/LabelToStringComposer.h"
+#include "../primitive/PrimitiveToStringComposer.h"
 #include <algorithm>
 #include "LabeledSymbol.h"
 #include "RankedSymbol.h"
@@ -41,9 +42,10 @@ void SymbolToStringComposer::Visit(void* userData, const EndSymbol&) {
 void SymbolToStringComposer::Visit(void* userData, const RankedSymbol& symbol) {
 	std::stringstream &out = *((std::stringstream*) userData);
 
-	label::LabelToStringComposer composer;
-	out << composer.compose(symbol.getLabel());
-	out << std::to_string(symbol.getRank());
+	label::LabelToStringComposer composer1;
+	out << composer1.compose(symbol.getLabel());
+	primitive::PrimitiveToStringComposer composer2;
+	out << composer2.compose(primitive::Primitive(symbol.getRank()));
 }
 
 void SymbolToStringComposer::Visit(void* userData, const BarSymbol&) {
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
index d3a4e07231..263155c543 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
@@ -56,7 +56,7 @@ std::list<sax::Token> SymbolToXMLComposer::compose(const RankedSymbol& symbol) c
 	std::list<sax::Token> out;
 	out.push_back(sax::Token("RankedSymbol", sax::Token::TokenType::START_ELEMENT));
 	out.splice(out.end(), alib::api<label::Label>::compose(symbol.getLabel()));
-	out.push_back(sax::Token(std::to_string(symbol.getRank()), sax::Token::TokenType::CHARACTER));
+	out.splice(out.end(), alib::api<primitive::Integer>::compose(symbol.getRank()));
 	out.push_back(sax::Token("RankedSymbol", sax::Token::TokenType::END_ELEMENT));
 	return out;
 }
-- 
GitLab