From 80a6aae34ce9635b6492cd37959ceb91d8b15b70 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Wed, 29 Jul 2015 09:04:05 +0200
Subject: [PATCH] refactor next label

---
 alib2data/src/alphabet/NextSymbol.cpp      |  5 +-
 alib2data/src/automaton/Automaton.cpp      |  3 +-
 alib2data/src/common/wrapper.hpp           |  4 +
 alib2data/src/label/HexavigesimalLabel.cpp |  9 ++
 alib2data/src/label/HexavigesimalLabel.h   |  3 +
 alib2data/src/label/Label.cpp              | 10 +++
 alib2data/src/label/Label.h                |  4 +
 alib2data/src/label/LabelBase.h            |  3 +
 alib2data/src/label/LabelPairLabel.cpp     |  9 ++
 alib2data/src/label/LabelPairLabel.h       |  3 +
 alib2data/src/label/LabelSetLabel.cpp      |  9 ++
 alib2data/src/label/LabelSetLabel.h        |  3 +
 alib2data/src/label/NextLabel.cpp          | 99 ----------------------
 alib2data/src/label/NextLabel.h            | 55 ------------
 alib2data/src/label/ObjectLabel.cpp        |  9 ++
 alib2data/src/label/ObjectLabel.h          |  3 +
 alib2data/src/label/PrimitiveLabel.cpp     | 10 +++
 alib2data/src/label/PrimitiveLabel.h       |  3 +
 alib2data/src/label/UniqueLabel.cpp        |  9 ++
 alib2data/src/label/UniqueLabel.h          |  3 +
 20 files changed, 97 insertions(+), 159 deletions(-)
 delete mode 100644 alib2data/src/label/NextLabel.cpp
 delete mode 100644 alib2data/src/label/NextLabel.h

diff --git a/alib2data/src/alphabet/NextSymbol.cpp b/alib2data/src/alphabet/NextSymbol.cpp
index b4e58180ec..6b371c4b87 100644
--- a/alib2data/src/alphabet/NextSymbol.cpp
+++ b/alib2data/src/alphabet/NextSymbol.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "NextSymbol.h"
-#include "../label/NextLabel.h"
 #include "LabeledSymbol.h"
 #include "RankedSymbol.h"
 #include "SymbolPairSymbol.h"
@@ -25,11 +24,11 @@ namespace alphabet {
 void NextSymbol::Visit(void* userData, const LabeledSymbol& symbol) const {
 	Symbol* &out = *((Symbol**) userData);
 
-	out = new Symbol(LabeledSymbol(label::NextLabel::nextLabel(symbol.getLabel())));
+	out = new Symbol(LabeledSymbol(symbol.getLabel().next()));
 }
 
 void NextSymbol::Visit(void*, LabeledSymbol& symbol) const {
-	label::NextLabel::nextLabel(symbol.getLabel());
+	symbol.getLabel().inc();
 }
 
 void NextSymbol::Visit(void* userData, const BlankSymbol& symbol) const {
diff --git a/alib2data/src/automaton/Automaton.cpp b/alib2data/src/automaton/Automaton.cpp
index 4485dc10a0..44c46338ba 100644
--- a/alib2data/src/automaton/Automaton.cpp
+++ b/alib2data/src/automaton/Automaton.cpp
@@ -7,7 +7,6 @@
 
 #include "Automaton.h"
 #include "common/State.h"
-#include "../label/NextLabel.h"
 #include <climits>
 #include "AutomatonException.h"
 
@@ -16,7 +15,7 @@ namespace automaton {
 State createUniqueState(State nextState, const std::set<State>& other) {
 	int i = 0;
 	do {
-		label::NextLabel::nextLabel(nextState.getName());
+		nextState.getName().inc();
 		if(other.count(nextState) == 0)
 			return std::move(nextState);
 	} while(++i < INT_MAX);
diff --git a/alib2data/src/common/wrapper.hpp b/alib2data/src/common/wrapper.hpp
index 66ed1d4afe..a6874ac07e 100644
--- a/alib2data/src/common/wrapper.hpp
+++ b/alib2data/src/common/wrapper.hpp
@@ -39,6 +39,10 @@ public:
 		return *data;
 	}
 
+	void setData(T* data) {
+		this->data = std::cow_shared_ptr<T>(data);
+	}
+
 	void setData(const T& data) {
 		this->data = std::cow_shared_ptr<T>(data.clone());
 	}
diff --git a/alib2data/src/label/HexavigesimalLabel.cpp b/alib2data/src/label/HexavigesimalLabel.cpp
index c5f6c00e89..272fa1a7df 100644
--- a/alib2data/src/label/HexavigesimalLabel.cpp
+++ b/alib2data/src/label/HexavigesimalLabel.cpp
@@ -60,6 +60,15 @@ void HexavigesimalLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(HexavigesimalLabel::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
 }
 
+LabelBase* HexavigesimalLabel::next() const {
+	return new HexavigesimalLabel(hexavigesimal + 1);
+}
+
+LabelBase* HexavigesimalLabel::inc() && {
+	hexavigesimal++;
+	return NULL;
+}
+
 } /* namespace label */
 
 namespace alib {
diff --git a/alib2data/src/label/HexavigesimalLabel.h b/alib2data/src/label/HexavigesimalLabel.h
index b39da67ceb..097379a99a 100644
--- a/alib2data/src/label/HexavigesimalLabel.h
+++ b/alib2data/src/label/HexavigesimalLabel.h
@@ -58,6 +58,9 @@ public:
 	static HexavigesimalLabel parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual LabelBase* next() const;
+	virtual LabelBase* inc() &&;
 };
 
 } /* namespace label */
diff --git a/alib2data/src/label/Label.cpp b/alib2data/src/label/Label.cpp
index e1e82ab841..ca4688e80e 100644
--- a/alib2data/src/label/Label.cpp
+++ b/alib2data/src/label/Label.cpp
@@ -12,6 +12,16 @@
 
 namespace label {
 
+Label Label::next() const {
+	return Label(this->getData().next());
+}
+
+void Label::inc() {
+	LabelBase* res = std::move(this->getData()).inc();
+	if(res == NULL) return;
+	this->setData(res);
+}
+
 label::Label labelFrom(int number) {
 	return label::Label { label::PrimitiveLabel { primitive::primitiveFrom (number) } };
 }
diff --git a/alib2data/src/label/Label.h b/alib2data/src/label/Label.h
index 0a9b7b66a2..4b0a0a61e1 100644
--- a/alib2data/src/label/Label.h
+++ b/alib2data/src/label/Label.h
@@ -19,6 +19,10 @@ namespace label {
  */
 class Label : public alib::wrapper<LabelBase>, public alib::WrapperBase {
 	using alib::wrapper<LabelBase>::wrapper;
+
+public:
+	Label next() const;
+	void inc();
 };
 
 label::Label labelFrom(int number);
diff --git a/alib2data/src/label/LabelBase.h b/alib2data/src/label/LabelBase.h
index c5030f0fa5..0f06d2cec1 100644
--- a/alib2data/src/label/LabelBase.h
+++ b/alib2data/src/label/LabelBase.h
@@ -41,6 +41,9 @@ public:
 
 	virtual LabelBase* clone() const = 0;
 	virtual LabelBase* plunder() && = 0;
+
+	virtual LabelBase* next() const = 0;
+	virtual LabelBase* inc() && = 0;
 };
 
 } /* namespace label */
diff --git a/alib2data/src/label/LabelPairLabel.cpp b/alib2data/src/label/LabelPairLabel.cpp
index ef71bb9a58..424cfd5bee 100644
--- a/alib2data/src/label/LabelPairLabel.cpp
+++ b/alib2data/src/label/LabelPairLabel.cpp
@@ -11,6 +11,7 @@
 #include "Label.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueLabel.h"
 
 namespace label {
 
@@ -70,6 +71,14 @@ void LabelPairLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(LabelPairLabel::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
 }
 
+LabelBase* LabelPairLabel::next() const {
+	return new UniqueLabel(Label(*this), primitive::Integer(0));
+}
+
+LabelBase* LabelPairLabel::inc() && {
+	return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0));
+}
+
 } /* namespace label */
 
 namespace alib {
diff --git a/alib2data/src/label/LabelPairLabel.h b/alib2data/src/label/LabelPairLabel.h
index e3e07477b3..e6bb8c3fad 100644
--- a/alib2data/src/label/LabelPairLabel.h
+++ b/alib2data/src/label/LabelPairLabel.h
@@ -55,6 +55,9 @@ public:
 	static LabelPairLabel parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual LabelBase* next() const;
+	virtual LabelBase* inc() &&;
 };
 
 } /* namespace label */
diff --git a/alib2data/src/label/LabelSetLabel.cpp b/alib2data/src/label/LabelSetLabel.cpp
index 3964755e62..cdc5277786 100644
--- a/alib2data/src/label/LabelSetLabel.cpp
+++ b/alib2data/src/label/LabelSetLabel.cpp
@@ -11,6 +11,7 @@
 #include "Label.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueLabel.h"
 
 namespace label {
 
@@ -75,6 +76,14 @@ void LabelSetLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(LabelSetLabel::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
 }
 
+LabelBase* LabelSetLabel::next() const {
+	return new UniqueLabel(Label(*this), primitive::Integer(0));
+}
+
+LabelBase* LabelSetLabel::inc() && {
+	return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0));
+}
+
 } /* namespace label */
 
 namespace alib {
diff --git a/alib2data/src/label/LabelSetLabel.h b/alib2data/src/label/LabelSetLabel.h
index 11e047d51f..55bf621eff 100644
--- a/alib2data/src/label/LabelSetLabel.h
+++ b/alib2data/src/label/LabelSetLabel.h
@@ -55,6 +55,9 @@ public:
 	static LabelSetLabel parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual LabelBase* next() const;
+	virtual LabelBase* inc() &&;
 };
 
 } /* namespace label */
diff --git a/alib2data/src/label/NextLabel.cpp b/alib2data/src/label/NextLabel.cpp
deleted file mode 100644
index 30fede9afc..0000000000
--- a/alib2data/src/label/NextLabel.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * NextLabel.cpp
- *
- *  Created on: Nov 23, 2013
- *      Author: Jan Travnicek
- */
-
-#include "NextLabel.h"
-#include "PrimitiveLabel.h"
-#include "HexavigesimalLabel.h"
-#include "LabelSetLabel.h"
-#include "ObjectLabel.h"
-#include "LabelPairLabel.h"
-#include "UniqueLabel.h"
-
-namespace label {
-
-void NextLabel::Visit(void* userData, const PrimitiveLabel& label) const {
-	Label* &out = *((Label**) userData);
-
-	out = new Label(PrimitiveLabel(label.getData().next()));
-}
-
-void NextLabel::Visit(void*, PrimitiveLabel& label) const {
-	label.getData().inc();
-}
-
-void NextLabel::Visit(void* userData, const HexavigesimalLabel& label) const {
-	Label* &out = *((Label**) userData);
-
-	out = new Label(HexavigesimalLabel(label.getData() + 1));
-}
-
-void NextLabel::Visit(void*, HexavigesimalLabel& label) const {
-	label.setData(label.getData() + 1);
-}
-
-void NextLabel::Visit(void* userData, const ObjectLabel& label) const {
-	Label* &out = *((Label**) userData);
-
-	out = new Label(UniqueLabel(Label(label), primitive::Integer(0)));
-}
-
-void NextLabel::Visit(void* userData, ObjectLabel&) const {
-	Label &out = *((Label*) userData);
-
-	out = Label(UniqueLabel(std::move(out), primitive::Integer(0)));
-}
-
-void NextLabel::Visit(void* userData, const LabelSetLabel& label) const {
-	Label* &out = *((Label**) userData);
-
-	out = new Label(UniqueLabel(Label(label), primitive::Integer(0)));
-}
-
-void NextLabel::Visit(void* userData, LabelSetLabel&) const {
-	Label &out = *((Label*) userData);
-
-	out = Label(UniqueLabel(std::move(out), primitive::Integer(0)));
-}
-
-void NextLabel::Visit(void* userData, const LabelPairLabel& label) const {
-	Label* &out = *((Label**) userData);
-
-	out = new Label(UniqueLabel(Label(label), primitive::Integer(0)));
-}
-
-void NextLabel::Visit(void* userData, LabelPairLabel&) const {
-	Label &out = *((Label*) userData);
-
-	out = Label(UniqueLabel(std::move(out), primitive::Integer(0)));
-}
-
-void NextLabel::Visit(void* userData, const UniqueLabel& label) const {
-	Label* &out = *((Label**) userData);
-
-	out = new Label(UniqueLabel(label.getLabel(), primitive::Integer(label.getId().getData() + 1)));
-}
-
-void NextLabel::Visit(void*, UniqueLabel& label) const {
-	label.getId().setData(label.getId().getData() + 1);
-}
-
-Label NextLabel::nextLabel(const Label& label) {
-	Label* out;
-	label.getData().Accept((void*) &out, NextLabel::NEXT_LABEL);
-
-	Label nextLabel(std::move(*out));
-	delete out;
-	return std::move(nextLabel);
-}
-
-void NextLabel::nextLabel(Label& label) {
-	label.getData().Accept((void*) &label, NextLabel::NEXT_LABEL);
-}
-
-const NextLabel NextLabel::NEXT_LABEL;
-
-} /* namespace label */
diff --git a/alib2data/src/label/NextLabel.h b/alib2data/src/label/NextLabel.h
deleted file mode 100644
index d72a33f8c7..0000000000
--- a/alib2data/src/label/NextLabel.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * NextLabel.h
- *
- *  Created on: Nov 23, 2013
- *      Author: Jan Travnciek
- */
-
-#ifndef NEXT_LABEL_H_
-#define NEXT_LABEL_H_
-
-#include "LabelFeatures.h"
-#include "LabelBase.h"
-
-namespace label {
-
-/**
- * This class contains methods to print XML representation of string to the output stream.
- */
-class NextLabel : public VisitableLabelBase::const_visitor_type, public VisitableLabelBase::visitor_type {
-	void Visit(void*, const PrimitiveLabel& label) const;
-	void Visit(void*, PrimitiveLabel& label) const;
-
-	void Visit(void*, const HexavigesimalLabel& label) const;
-	void Visit(void*, HexavigesimalLabel& label) const;
-
-	void Visit(void*, const ObjectLabel& label) const;
-	void Visit(void*, ObjectLabel& label) const;
-
-	void Visit(void*, const LabelSetLabel& label) const;
-	void Visit(void*, LabelSetLabel& label) const;
-
-	void Visit(void*, const LabelPairLabel& label) const;
-	void Visit(void*, LabelPairLabel& label) const;
-
-	void Visit(void*, const UniqueLabel& label) const;
-	void Visit(void*, UniqueLabel& label) const;
-
-public:
-	NextLabel() {}
-
-	/**
-	 * Prints XML representation of String to the output stream.
-	 * @param string String to print
-	 * @param out output stream to which print the String
-	 */
-	static Label nextLabel(const Label& label);
-
-	static void nextLabel(Label& label);
-
-	static const NextLabel NEXT_LABEL;
-};
-
-} /* namespace label */
-
-#endif /* NEXT_LABEL_H_ */
diff --git a/alib2data/src/label/ObjectLabel.cpp b/alib2data/src/label/ObjectLabel.cpp
index 5419423141..5d40ef75a4 100644
--- a/alib2data/src/label/ObjectLabel.cpp
+++ b/alib2data/src/label/ObjectLabel.cpp
@@ -10,6 +10,7 @@
 #include "Label.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueLabel.h"
 
 namespace label {
 
@@ -56,6 +57,14 @@ void ObjectLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(ObjectLabel::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
 }
 
+LabelBase* ObjectLabel::next() const {
+	return new UniqueLabel(Label(*this), primitive::Integer(0));
+}
+
+LabelBase* ObjectLabel::inc() && {
+	return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0));
+}
+
 } /* namespace label */
 
 namespace alib {
diff --git a/alib2data/src/label/ObjectLabel.h b/alib2data/src/label/ObjectLabel.h
index 769004aec9..7dd0711c8f 100644
--- a/alib2data/src/label/ObjectLabel.h
+++ b/alib2data/src/label/ObjectLabel.h
@@ -56,6 +56,9 @@ public:
 	static ObjectLabel parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual LabelBase* next() const;
+	virtual LabelBase* inc() &&;
 };
 
 } /* namespace label */
diff --git a/alib2data/src/label/PrimitiveLabel.cpp b/alib2data/src/label/PrimitiveLabel.cpp
index 1133ea0b79..a895a07b84 100644
--- a/alib2data/src/label/PrimitiveLabel.cpp
+++ b/alib2data/src/label/PrimitiveLabel.cpp
@@ -10,6 +10,7 @@
 #include "Label.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueLabel.h"
 
 namespace label {
 
@@ -60,6 +61,15 @@ void PrimitiveLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(PrimitiveLabel::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
 }
 
+LabelBase* PrimitiveLabel::next() const {
+	return new PrimitiveLabel(primitive.next());
+}
+
+LabelBase* PrimitiveLabel::inc() && {
+	primitive.inc();
+	return NULL;
+}
+
 } /* namespace label */
 
 namespace alib {
diff --git a/alib2data/src/label/PrimitiveLabel.h b/alib2data/src/label/PrimitiveLabel.h
index 0207928a77..c1eda1b881 100644
--- a/alib2data/src/label/PrimitiveLabel.h
+++ b/alib2data/src/label/PrimitiveLabel.h
@@ -58,6 +58,9 @@ public:
 	static PrimitiveLabel parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual LabelBase* next() const;
+	virtual LabelBase* inc() &&;
 };
 
 } /* namespace label */
diff --git a/alib2data/src/label/UniqueLabel.cpp b/alib2data/src/label/UniqueLabel.cpp
index 39130c8b17..eb5c4e378a 100644
--- a/alib2data/src/label/UniqueLabel.cpp
+++ b/alib2data/src/label/UniqueLabel.cpp
@@ -78,6 +78,15 @@ void UniqueLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(UniqueLabel::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
 }
 
+LabelBase* UniqueLabel::next() const {
+	return new UniqueLabel(label, id.next());
+}
+
+LabelBase* UniqueLabel::inc() && {
+	id.inc();
+	return NULL;
+}
+
 } /* namespace label */
 
 namespace alib {
diff --git a/alib2data/src/label/UniqueLabel.h b/alib2data/src/label/UniqueLabel.h
index 87e196a049..4ac916e929 100644
--- a/alib2data/src/label/UniqueLabel.h
+++ b/alib2data/src/label/UniqueLabel.h
@@ -60,6 +60,9 @@ public:
 	static UniqueLabel parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual LabelBase* next() const;
+	virtual LabelBase* inc() &&;
 };
 
 } /* namespace label */
-- 
GitLab