From 20c8fa0593b606921d2f8fba09e182df299ddb7c Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 12 Aug 2014 21:11:30 +0200
Subject: [PATCH] simplify operators

---
 alib2data/src/automaton/UnknownAutomaton.cpp  | 12 ++-
 alib2data/src/automaton/UnknownTransition.cpp | 77 +++++++++----------
 2 files changed, 46 insertions(+), 43 deletions(-)

diff --git a/alib2data/src/automaton/UnknownAutomaton.cpp b/alib2data/src/automaton/UnknownAutomaton.cpp
index 9c6ef85db7..36a0fbdad0 100644
--- a/alib2data/src/automaton/UnknownAutomaton.cpp
+++ b/alib2data/src/automaton/UnknownAutomaton.cpp
@@ -194,6 +194,9 @@ bool UnknownAutomaton::operator>(const AutomatonBase& other) const {
 }
 
 bool UnknownAutomaton::operator==(const UnknownAutomaton& other) const {
+	std::pointer<alphabet::Symbol> blankSymbolPointer(blankSymbol);
+	std::pointer<alphabet::Symbol> otherBlankSymbolPointer(other.blankSymbol);
+
 	return states == other.states
 		&& inputAlphabet == other.inputAlphabet
 		&& initialStates == other.initialStates
@@ -201,7 +204,7 @@ bool UnknownAutomaton::operator==(const UnknownAutomaton& other) const {
 		&& stackAlphabet == other.stackAlphabet
 		&& initialSymbols == other.initialSymbols
 		&& tapeAlphabet == other.tapeAlphabet
-		&& (blankSymbol == other.blankSymbol || (blankSymbol != NULL && other.blankSymbol != NULL && *blankSymbol == *other.blankSymbol))
+		&& blankSymbolPointer == otherBlankSymbolPointer
 		&& transitions == other.transitions;
 }
 
@@ -213,6 +216,8 @@ bool UnknownAutomaton::operator<(const UnknownAutomaton& other) const {
 }
 
 void UnknownAutomaton::operator>>(std::ostream& out) const {
+	std::pointer<alphabet::Symbol> blankSymbolPointer(blankSymbol);
+
 	out << "(UnknownAutomaton"
 		<< " states = " << states
 		<< " inputAlphabet = " << inputAlphabet
@@ -221,9 +226,8 @@ void UnknownAutomaton::operator>>(std::ostream& out) const {
 		<< " stackAlphabet = " << stackAlphabet
 		<< " initialSymbols = " << initialSymbols
 		<< " tapeAlphabet = " << tapeAlphabet
-		<< " blankSymbol = ";
-	if(blankSymbol == NULL) out << "NULL"; else out << *blankSymbol;
-	out << " transitions = " << transitions
+		<< " blankSymbol = " << blankSymbolPointer
+		<< " transitions = " << transitions
 		<< ")";
 }
 
diff --git a/alib2data/src/automaton/UnknownTransition.cpp b/alib2data/src/automaton/UnknownTransition.cpp
index 916b9d85d6..19056c681f 100644
--- a/alib2data/src/automaton/UnknownTransition.cpp
+++ b/alib2data/src/automaton/UnknownTransition.cpp
@@ -7,6 +7,7 @@
 
 #include "UnknownTransition.h"
 #include "../std/vector.hpp"
+#include "../std/pointer.hpp"
 
 namespace automaton {
 
@@ -128,39 +129,35 @@ void UnknownTransition::setShift(const Shift& shift) {
 }
 
 bool UnknownTransition::operator <(const UnknownTransition& other) const {
-	if (from != other.from && from != NULL && other.from != NULL && *from != *other.from) {
-		if(from == NULL) return -1;
-		else if(other.from == NULL) return 1;
-		else return *from < *other.from;
-	} else if (input != other.input && input != NULL && other.input != NULL && *input != *other.input) {
-		if(input == NULL) return -1;
-		else if(other.input == NULL) return 1;
-		else return *input < *other.input;
-	} else if (pop != other.pop) {
-		return pop < other.pop;
-	} else if (shift != other.shift) {
-		return shift < other.shift;
-	} else if (to != other.to && to != NULL && other.to != NULL && *to != *other.to) {
-		if(to == NULL) return 1;
-		else if(other.to == NULL) return -1;
-		else return *to < *other.to;
-	} else if (output != other.output && output != NULL && other.output != NULL && *output != *other.output) {
-		if(output == NULL) return 1;
-		else if(other.output == NULL) return -1;
-		else return *output < *other.output;
-	} else {
-		return push < other.push;
-	}
+	std::pointer<automaton::State> fromPointer(from);
+	std::pointer<automaton::State> otherFromPointer(other.from);
+
+	std::pointer<std::variant<string::Epsilon, alphabet::Symbol>> inputPointer(input);
+	std::pointer<std::variant<string::Epsilon, alphabet::Symbol>> otherInputPointer(other.input);
+
+	std::pointer<automaton::State> toPointer(to);
+	std::pointer<automaton::State> otherToPointer(other.to);
+
+	std::pointer<std::variant<string::Epsilon, alphabet::Symbol>> outputPointer(output);
+	std::pointer<std::variant<string::Epsilon, alphabet::Symbol>> otherOutputPointer(other.output);
+
+	return std::tie(fromPointer, inputPointer, pop, shift, toPointer, outputPointer, push) < std::tie(otherFromPointer, otherInputPointer, pop, shift, otherToPointer, otherOutputPointer, push);
 }
 
 bool UnknownTransition::operator ==(const UnknownTransition& other) const {
-	return (from == other.from || (from != NULL && other.from != NULL && *from == *other.from))
-		&& (input == other.input || (input != NULL && other.input != NULL && *input == *other.input))
-		&& pop == other.pop
-		&& shift == other.shift
-		&& (to == other.to || (to != NULL && other.to != NULL && *to == *other.to))
-		&& (output == other.output || (output != NULL && other.output != NULL && *output == *other.output))
-		&& push == other.push;
+	std::pointer<automaton::State> fromPointer(from);
+	std::pointer<automaton::State> otherFromPointer(other.from);
+
+	std::pointer<std::variant<string::Epsilon, alphabet::Symbol>> inputPointer(input);
+	std::pointer<std::variant<string::Epsilon, alphabet::Symbol>> otherInputPointer(other.input);
+
+	std::pointer<automaton::State> toPointer(to);
+	std::pointer<automaton::State> otherToPointer(other.to);
+
+	std::pointer<std::variant<string::Epsilon, alphabet::Symbol>> outputPointer(output);
+	std::pointer<std::variant<string::Epsilon, alphabet::Symbol>> otherOutputPointer(other.output);
+
+	return fromPointer == otherFromPointer && inputPointer == otherInputPointer && pop == other.pop && shift == other.shift && toPointer == otherToPointer && outputPointer == otherOutputPointer && push == other.push;
 }
 
 bool UnknownTransition::operator !=(const UnknownTransition& other) const {
@@ -168,15 +165,17 @@ bool UnknownTransition::operator !=(const UnknownTransition& other) const {
 }
 
 std::ostream& operator<<(std::ostream& out, const UnknownTransition& transition) {
-	out << "(UnknownTransition" << " from = ";
-	if(transition.from == NULL) out << "NULL"; else out << *transition.from;
-	out << " input = ";
-	if(transition.input == NULL) out << "NULL"; else out << *transition.input;
-	out << " to = ";
-	if(transition.to == NULL) out << "NULL"; else out << *transition.to;
-	out << " output = ";
-	if(transition.output == NULL) out << "NULL"; else out << *transition.output;
-	out << " pop = " << transition.pop
+	std::pointer<automaton::State> fromPointer(transition.from);
+	std::pointer<std::variant<string::Epsilon, alphabet::Symbol>> inputPointer(transition.input);
+	std::pointer<automaton::State> toPointer(transition.to);
+	std::pointer<std::variant<string::Epsilon, alphabet::Symbol>> outputPointer(transition.output);
+
+	out << "(UnknownTransition"
+		<< " from = " << fromPointer
+		<< " input = " << inputPointer
+		<< " to = " << toPointer
+		<< " output = " << outputPointer
+		<< " pop = " << transition.pop
 		<< " push = " << transition.push
 		<< " shift = " << SHIFT_NAMES[transition.shift]
 		<< ")";
-- 
GitLab