From ffd1d6b6c7e320046889fff9db9dfc974194387c Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Wed, 22 Jul 2015 16:41:44 +0200
Subject: [PATCH] prepare regexp refactoring

---
 alib2data/src/regexp/RegExpFromXMLParser.cpp | 25 +++++++-------------
 alib2data/src/regexp/RegExpFromXMLParser.h   |  4 ++--
 alib2data/src/regexp/RegExpToXMLComposer.cpp | 24 ++++++++-----------
 alib2data/src/regexp/RegExpToXMLComposer.h   |  1 +
 4 files changed, 21 insertions(+), 33 deletions(-)

diff --git a/alib2data/src/regexp/RegExpFromXMLParser.cpp b/alib2data/src/regexp/RegExpFromXMLParser.cpp
index 0924675f56..36fd319c9c 100644
--- a/alib2data/src/regexp/RegExpFromXMLParser.cpp
+++ b/alib2data/src/regexp/RegExpFromXMLParser.cpp
@@ -43,11 +43,10 @@ bool RegExpFromXMLParser::first(const std::deque<sax::Token>::const_iterator& in
 UnboundedRegExp RegExpFromXMLParser::parseUnboundedRegExp(std::deque<sax::Token>::iterator& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::REGEXP_UNBOUNDED_REGEXP);
 
-	UnboundedRegExp regexp;
-	parseAlphabet(input, regexp);
+	std::set<alphabet::Symbol> alphabet = parseAlphabet(input);
 
 	UnboundedRegExpElement* element = parseUnboundedRegExpElement(input);
-	regexp.setRegExp(std::move(*element));
+	UnboundedRegExp regexp(std::move(alphabet), std::move(*element));
 	delete element;
 
 	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::REGEXP_UNBOUNDED_REGEXP);
@@ -57,31 +56,23 @@ UnboundedRegExp RegExpFromXMLParser::parseUnboundedRegExp(std::deque<sax::Token>
 FormalRegExp RegExpFromXMLParser::parseFormalRegExp(std::deque<sax::Token>::iterator& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::REGEXP_FORMAL_REGEXP);
 
-	FormalRegExp regexp;
-	parseAlphabet(input, regexp);
-
+	std::set<alphabet::Symbol> alphabet = parseAlphabet(input);
 	FormalRegExpElement* element = parseFormalRegExpElement(input);
-	regexp.setRegExp(std::move(*element));
+	FormalRegExp regexp(std::move(alphabet), std::move(*element));
 	delete element;
 
 	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::REGEXP_FORMAL_REGEXP);
 	return regexp;
 }
 
-void RegExpFromXMLParser::parseAlphabet(std::deque<sax::Token>::iterator& input, UnboundedRegExp& regexp) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet");
-	while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
-		regexp.addSymbolToAlphabet(alib::xmlApi<alphabet::Symbol>::parse(input));
-	}
-	popToken(input, sax::Token::TokenType::END_ELEMENT, "alphabet");
-}
-
-void RegExpFromXMLParser::parseAlphabet(std::deque<sax::Token>::iterator& input, FormalRegExp& regexp) const {
+std::set<alphabet::Symbol> RegExpFromXMLParser::parseAlphabet(std::deque<sax::Token>::iterator& input) const {
+	std::set<alphabet::Symbol> alphabet;
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet");
 	while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
-		regexp.addSymbolToAlphabet(alib::xmlApi<alphabet::Symbol>::parse(input));
+		alphabet.insert(alib::xmlApi<alphabet::Symbol>::parse(input));
 	}
 	popToken(input, sax::Token::TokenType::END_ELEMENT, "alphabet");
+	return alphabet;
 }
 
 UnboundedRegExpElement* RegExpFromXMLParser::parseUnboundedRegExpElement(std::deque<sax::Token>::iterator& input) const {
diff --git a/alib2data/src/regexp/RegExpFromXMLParser.h b/alib2data/src/regexp/RegExpFromXMLParser.h
index 4fd2a20189..70e107f60d 100644
--- a/alib2data/src/regexp/RegExpFromXMLParser.h
+++ b/alib2data/src/regexp/RegExpFromXMLParser.h
@@ -11,6 +11,7 @@
 #include "../sax/FromXMLParserHelper.h"
 #include <set>
 #include "RegExpFeatures.h"
+#include "../alphabet/SymbolFeatures.h"
 #include "../XmlApiBase.h"
 
 namespace regexp {
@@ -23,8 +24,7 @@ public:
 	RegExpFromXMLParser() {}
 
 private:
-	void parseAlphabet(std::deque<sax::Token>::iterator& input, UnboundedRegExp& regexp) const;
-	void parseAlphabet(std::deque<sax::Token>::iterator& input, FormalRegExp& regexp) const;
+	std::set<alphabet::Symbol> parseAlphabet(std::deque<sax::Token>::iterator& input) const;
 
 	UnboundedRegExpElement* parseUnboundedRegExpElement(std::deque<sax::Token>::iterator& input) const;
 
diff --git a/alib2data/src/regexp/RegExpToXMLComposer.cpp b/alib2data/src/regexp/RegExpToXMLComposer.cpp
index d9b6ccb8c2..782db018be 100644
--- a/alib2data/src/regexp/RegExpToXMLComposer.cpp
+++ b/alib2data/src/regexp/RegExpToXMLComposer.cpp
@@ -120,28 +120,24 @@ void RegExpToXMLComposer::compose(std::deque<sax::Token>& out, const RegExpBase&
 	regexp.Accept((void*) &out, alib::ToXMLComposers::toXMLComposers);
 }
 
+void RegExpToXMLComposer::composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::Symbol>& alphabet) const {
+	out.emplace_back("alphabet", sax::Token::TokenType::START_ELEMENT);
+	for (const auto& symbol : alphabet) {
+		alib::xmlApi<alphabet::Symbol>::compose(out, symbol);
+	}
+	out.emplace_back("alphabet", sax::Token::TokenType::END_ELEMENT);
+}
+
 void RegExpToXMLComposer::compose(std::deque<sax::Token>& out, const UnboundedRegExp& regexp) const {
 	out.emplace_back(alib::Names::REGEXP_UNBOUNDED_REGEXP, sax::Token::TokenType::START_ELEMENT);
-	{
-		out.emplace_back("alphabet", sax::Token::TokenType::START_ELEMENT);
-		for (const auto& symbol: regexp.getAlphabet()) {
-			alib::xmlApi<alphabet::Symbol>::compose(out, symbol);
-		}
-		out.emplace_back("alphabet", sax::Token::TokenType::END_ELEMENT);
-	}
+	composeAlphabet(out, regexp.getAlphabet());
 	regexp.getRegExp().Accept((void*) &out, *this);
 	out.emplace_back(alib::Names::REGEXP_UNBOUNDED_REGEXP, sax::Token::TokenType::END_ELEMENT);
 }
 
 void RegExpToXMLComposer::compose(std::deque<sax::Token>& out, const FormalRegExp& regexp) const {
 	out.emplace_back(alib::Names::REGEXP_FORMAL_REGEXP, sax::Token::TokenType::START_ELEMENT);
-	{
-		out.emplace_back("alphabet", sax::Token::TokenType::START_ELEMENT);
-		for (const auto& symbol: regexp.getAlphabet()) {
-			alib::xmlApi<alphabet::Symbol>::compose(out, symbol);
-		}
-		out.emplace_back("alphabet", sax::Token::TokenType::END_ELEMENT);
-	}
+	composeAlphabet(out, regexp.getAlphabet());
 	regexp.getRegExp().Accept((void*) &out, *this);
 	out.emplace_back(alib::Names::REGEXP_FORMAL_REGEXP, sax::Token::TokenType::END_ELEMENT);
 }
diff --git a/alib2data/src/regexp/RegExpToXMLComposer.h b/alib2data/src/regexp/RegExpToXMLComposer.h
index ed7fd90b0b..9d2f5ce8a0 100644
--- a/alib2data/src/regexp/RegExpToXMLComposer.h
+++ b/alib2data/src/regexp/RegExpToXMLComposer.h
@@ -40,6 +40,7 @@ private:
 	void Visit(void*, const FormalRegExpEpsilon& epsilon) const;
 	void Visit(void*, const FormalRegExpEmpty& empty) const;
 
+	void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::Symbol>& alphabet) const;
 
 	/**
 	 * Composes XML token representation of RegExp.
-- 
GitLab