From fd35015016a67bb11ea7c1be2891b6ebc11f728b Mon Sep 17 00:00:00 2001
From: Jan Vesely <janvesely@janvesely.net>
Date: Thu, 24 Apr 2014 18:58:21 +0200
Subject: [PATCH] build update set according to definition

---
 .../src/rhdpda/RhdpdaDeterminizer2.cpp        | 14 ++++-----
 .../src/rhdpda/RhdpdaDeterminizer3.cpp        | 14 ++++-----
 .../src/rhdpda/RhdpdaDeterminizer4.cpp        | 10 +++----
 adeterminize/src/rhdpda/RhdpdaStructs.h       | 29 +++++++++++++++++++
 4 files changed, 45 insertions(+), 22 deletions(-)

diff --git a/adeterminize/src/rhdpda/RhdpdaDeterminizer2.cpp b/adeterminize/src/rhdpda/RhdpdaDeterminizer2.cpp
index c49ed76ea2..158cb2818a 100644
--- a/adeterminize/src/rhdpda/RhdpdaDeterminizer2.cpp
+++ b/adeterminize/src/rhdpda/RhdpdaDeterminizer2.cpp
@@ -151,7 +151,7 @@ Automaton* RhdpdaDeterminizer2::determinize()
             for (const auto& b : this->rhdpda->getInputAlphabet()) {
                 SComponent& s = unmarkedStateData->s;
 
-                set<PairOfPairs> update;
+                set<StatesPair> update;
                 for (const auto& pairOfPairs : s.pairsOfPairs) {
                     const State& r = pairOfPairs.pair1.state;
                     const Symbol& Z = pairOfPairs.pair1.symbol;
@@ -164,9 +164,7 @@ Automaton* RhdpdaDeterminizer2::determinize()
                                 if (pushTransition.getInput() == a && pushTransition.getTo() == r &&
                                         popTransition.getInput() == b && popTransition.getFrom() == rPrimed &&
                                         pushTransition.getPush().front() == Z && popTransition.getPop().front() == Z) {
-                                    StateSymbolPair pair1(p, Z);
-                                    StateSymbolPair pair2(q, Z);
-                                    update.insert(PairOfPairs(pair1, pair2));
+                                    update.insert(StatesPair(p, q));
                                 }
                             }
                         }
@@ -180,8 +178,8 @@ Automaton* RhdpdaDeterminizer2::determinize()
                     for (const auto& rPrimed : this->allRComponents) {
                         RComponent rDoublePrimed;
                         for (const auto& updateItem : update) {
-                            const State& p = updateItem.pair1.state;
-                            const State& q = updateItem.pair2.state;
+                            const State& p = updateItem.state1;
+                            const State& q = updateItem.state2;
                             for (const auto& rPrimedPair : rPrimed.pairs) {
                                 if (rPrimedPair.state == p) {
                                     const Symbol& Y = rPrimedPair.symbol;
@@ -191,8 +189,8 @@ Automaton* RhdpdaDeterminizer2::determinize()
                         }
                         SComponent sDoublePrimed;
                         for (const auto& updateItem : update) {
-                            const State& p = updateItem.pair1.state;
-                            const State& q = updateItem.pair2.state;
+                            const State& p = updateItem.state1;
+                            const State& q = updateItem.state2;
                             for (const auto& sPrimedPair : sPrimed.pairsOfPairs) {
                                 if (sPrimedPair.pair2.state == p) {
                                     const StateSymbolPair& x = sPrimedPair.pair1;
diff --git a/adeterminize/src/rhdpda/RhdpdaDeterminizer3.cpp b/adeterminize/src/rhdpda/RhdpdaDeterminizer3.cpp
index 57ea354fbb..024f367df0 100644
--- a/adeterminize/src/rhdpda/RhdpdaDeterminizer3.cpp
+++ b/adeterminize/src/rhdpda/RhdpdaDeterminizer3.cpp
@@ -150,7 +150,7 @@ Automaton* RhdpdaDeterminizer3::determinize()
             for (const auto& b : this->rhdpda->getInputAlphabet()) {
                 SComponent& s = unmarkedStateData->s;
 
-                set<PairOfPairs> update;
+                set<StatesPair> update;
                 for (const auto& pairOfPairs : s.pairsOfPairs) {
                     const State& r = pairOfPairs.pair1.state;
                     const Symbol& Z = pairOfPairs.pair1.symbol;
@@ -163,9 +163,7 @@ Automaton* RhdpdaDeterminizer3::determinize()
                                 if (pushTransition.getInput() == a && pushTransition.getTo() == r &&
                                         popTransition.getInput() == b && popTransition.getFrom() == rPrimed &&
                                         pushTransition.getPush().front() == Z && popTransition.getPop().front() == Z) {
-                                    StateSymbolPair pair1(p, Z);
-                                    StateSymbolPair pair2(q, Z);
-                                    update.insert(PairOfPairs(pair1, pair2));
+                                    update.insert(StatesPair(p, q));
                                 }
                             }
                         }
@@ -179,8 +177,8 @@ Automaton* RhdpdaDeterminizer3::determinize()
                     for (const auto& rPrimed : this->allRComponents) {
                         RComponent rDoublePrimed;
                         for (const auto& updateItem : update) {
-                            const State& p = updateItem.pair1.state;
-                            const State& q = updateItem.pair2.state;
+                            const State& p = updateItem.state1;
+                            const State& q = updateItem.state2;
                             for (const auto& rPrimedPair : rPrimed.pairs) {
                                 if (rPrimedPair.state == p) {
                                     const Symbol& Y = rPrimedPair.symbol;
@@ -190,8 +188,8 @@ Automaton* RhdpdaDeterminizer3::determinize()
                         }
                         SComponent sDoublePrimed;
                         for (const auto& updateItem : update) {
-                            const State& p = updateItem.pair1.state;
-                            const State& q = updateItem.pair2.state;
+                            const State& p = updateItem.state1;
+                            const State& q = updateItem.state2;
                             for (const auto& sPrimedPair : sPrimed.pairsOfPairs) {
                                 if (sPrimedPair.pair2.state == p) {
                                     const StateSymbolPair& x = sPrimedPair.pair1;
diff --git a/adeterminize/src/rhdpda/RhdpdaDeterminizer4.cpp b/adeterminize/src/rhdpda/RhdpdaDeterminizer4.cpp
index a14f23b5b4..1fddc484fa 100644
--- a/adeterminize/src/rhdpda/RhdpdaDeterminizer4.cpp
+++ b/adeterminize/src/rhdpda/RhdpdaDeterminizer4.cpp
@@ -164,7 +164,7 @@ Automaton* RhdpdaDeterminizer4::determinize()
         for (const auto& a : this->rhdpda->getInputAlphabet()) {
             for (const auto& b : this->rhdpda->getInputAlphabet()) {
                 SComponent& s = unmarkedStateData->s;
-                set<PairOfPairs> update;
+                set<StatesPair> update;
                 for (const auto& pairOfPairs : s.pairsOfPairs) {
                     const State& r = pairOfPairs.pair1.state;
                     const Symbol& Z = pairOfPairs.pair1.symbol;
@@ -177,9 +177,7 @@ Automaton* RhdpdaDeterminizer4::determinize()
                                 if (pushTransition.getInput() == a && pushTransition.getTo() == r &&
                                         popTransition.getInput() == b && popTransition.getFrom() == rPrimed &&
                                         pushTransition.getPush().front() == Z && popTransition.getPop().front() == Z) {
-                                    StateSymbolPair pair1(p, Z);
-                                    StateSymbolPair pair2(q, Z);
-                                    update.insert(PairOfPairs(pair1, pair2));
+                                    update.insert(StatesPair(p, q));
                                 }
                             }
                         }
@@ -191,8 +189,8 @@ Automaton* RhdpdaDeterminizer4::determinize()
                 for (const auto& sPrimed : this->allSComponents) {
                     SComponent sDoublePrimed;
                     for (const auto& updateItem : update) {
-                        const State& p = updateItem.pair1.state;
-                        const State& q = updateItem.pair2.state;
+                        const State& p = updateItem.state1;
+                        const State& q = updateItem.state2;
                         for (const auto& sPrimedPair : sPrimed.pairsOfPairs) {
                             if (sPrimedPair.pair2.state == p) {
                                 const StateSymbolPair& x = sPrimedPair.pair1;
diff --git a/adeterminize/src/rhdpda/RhdpdaStructs.h b/adeterminize/src/rhdpda/RhdpdaStructs.h
index 2db3c2b746..02ba833868 100644
--- a/adeterminize/src/rhdpda/RhdpdaStructs.h
+++ b/adeterminize/src/rhdpda/RhdpdaStructs.h
@@ -122,6 +122,35 @@ struct StateData
 };
 
 
+/**
+ * Struct fot storing pair of two states.
+ */
+struct StatesPair
+{
+    State state1;
+    State state2;
+    
+    StatesPair(const State& state1, const State& state2)
+            : state1(state1),
+              state2(state2) {}
+    
+    bool operator < (const StatesPair& other) const
+    {
+        return (state1 < other.state1) || ((state1 == other.state1) && (state2 < other.state2));
+    }
+    
+    bool operator == (const StatesPair& other) const
+    {
+        return (state1 == other.state1) && (state2 == other.state2);
+    }
+    
+    bool operator != (const StatesPair& other) const
+    {
+        return (state1 != other.state1) || (state2 != other.state2);
+    }
+};
+
+
 }
 }
 #endif
-- 
GitLab