Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / muscle / diffpaths.cpp
diff --git a/website/archive/binaries/mac/src/muscle/diffpaths.cpp b/website/archive/binaries/mac/src/muscle/diffpaths.cpp
new file mode 100644 (file)
index 0000000..632ada6
--- /dev/null
@@ -0,0 +1,114 @@
+#include "muscle.h"\r
+#include "pwpath.h"\r
+\r
+#define TRACE  0\r
+\r
+void DiffPaths(const PWPath &p1, const PWPath &p2, unsigned Edges1[],\r
+  unsigned *ptruDiffCount1, unsigned Edges2[], unsigned *ptruDiffCount2)\r
+       {\r
+#if    TRACE\r
+       Log("DiffPaths\n");\r
+       Log("p1=");\r
+       p1.LogMe();\r
+       Log("p2=");\r
+       p2.LogMe();\r
+#endif\r
+       const unsigned uEdgeCount1 = p1.GetEdgeCount();\r
+       const unsigned uEdgeCount2 = p2.GetEdgeCount();\r
+\r
+       unsigned uDiffCount1 = 0;\r
+       unsigned uDiffCount2 = 0;\r
+       unsigned uEdgeIndex1 = 0;\r
+       unsigned uEdgeIndex2 = 0;\r
+       const PWEdge *Edge1 = &p1.GetEdge(uEdgeIndex1);\r
+       const PWEdge *Edge2 = &p2.GetEdge(uEdgeIndex2);\r
+       for (;;)\r
+               {\r
+               unsigned uEdgeIndexTop1 = uEdgeIndex1;\r
+               unsigned uEdgeIndexTop2 = uEdgeIndex2;\r
+               Edge1 = &p1.GetEdge(uEdgeIndex1);\r
+               Edge2 = &p2.GetEdge(uEdgeIndex2);\r
+#if    TRACE\r
+               Log("e1[%u] PLA%u PLB%u %c, e2[%u] PLA%u PLB %u %c  DC1=%u DC2=%u\n",\r
+                 uEdgeIndex1, Edge1->uPrefixLengthA, Edge1->uPrefixLengthB, Edge1->cType,\r
+                 uEdgeIndex2, Edge2->uPrefixLengthA, Edge2->uPrefixLengthB, Edge2->cType,\r
+                 uDiffCount1, uDiffCount2);\r
+#endif\r
+               if (Edge1->uPrefixLengthA == Edge2->uPrefixLengthA &&\r
+                 Edge1->uPrefixLengthB == Edge2->uPrefixLengthB)\r
+                       {\r
+                       if (!Edge1->Equal(*Edge2))\r
+                               {\r
+                               Edges1[uDiffCount1++] = uEdgeIndex1;\r
+                               Edges2[uDiffCount2++] = uEdgeIndex2;\r
+                               }\r
+                       ++uEdgeIndex1;\r
+                       ++uEdgeIndex2;\r
+                       }\r
+\r
+               else if (Edge2->uPrefixLengthA < Edge1->uPrefixLengthA ||\r
+                 Edge2->uPrefixLengthB < Edge1->uPrefixLengthB)\r
+                       Edges2[uDiffCount2++] = uEdgeIndex2++;\r
+\r
+               else if (Edge1->uPrefixLengthA < Edge2->uPrefixLengthA ||\r
+                 Edge1->uPrefixLengthB < Edge2->uPrefixLengthB)\r
+                       Edges1[uDiffCount1++] = uEdgeIndex1++;\r
+\r
+               if (uEdgeCount1 == uEdgeIndex1)\r
+                       {\r
+                       while (uEdgeIndex2 < uEdgeCount2)\r
+                               Edges2[uDiffCount2++] = uEdgeIndex2++;\r
+                       goto Done;\r
+                       }\r
+               if (uEdgeCount2 == uEdgeIndex2)\r
+                       {\r
+                       while (uEdgeIndex1 < uEdgeCount1)\r
+                               Edges1[uDiffCount1++] = uEdgeIndex1++;\r
+                       goto Done;\r
+                       }\r
+               if (uEdgeIndex1 == uEdgeIndexTop1 && uEdgeIndex2 == uEdgeIndexTop2)\r
+                       Quit("DiffPaths stuck");\r
+               }\r
+Done:;\r
+#if    TRACE\r
+       Log("DiffCount1=%u (%u %u)\n", uDiffCount1, uEdgeCount1, uEdgeCount2);\r
+       Log("Diffs1=");\r
+       for (unsigned i = 0; i < uDiffCount1; ++i)\r
+               {\r
+               const PWEdge e = p1.GetEdge(Edges1[i]);\r
+               Log(" %u=%c%u.%u", Edges1[i], e.cType, e.uPrefixLengthA, e.uPrefixLengthB); \r
+               }\r
+       Log("\n");\r
+       Log("DiffCount2=%u\n", uDiffCount2);\r
+       Log("Diffs2=");\r
+       for (unsigned i = 0; i < uDiffCount2; ++i)\r
+               {\r
+               const PWEdge e = p2.GetEdge(Edges2[i]);\r
+               Log(" %u=%c%u.%u", Edges2[i], e.cType, e.uPrefixLengthA, e.uPrefixLengthB); \r
+               }\r
+       Log("\n");\r
+#endif\r
+       *ptruDiffCount1 = uDiffCount1;\r
+       *ptruDiffCount2 = uDiffCount2;\r
+       }\r
+\r
+void TestDiffPaths()\r
+       {\r
+       PWPath p1;\r
+       PWPath p2;\r
+\r
+       p1.AppendEdge('M', 1, 1);\r
+       p1.AppendEdge('M', 2, 2);\r
+       p1.AppendEdge('M', 3, 3);\r
+\r
+       p2.AppendEdge('M', 1, 1);\r
+       p2.AppendEdge('D', 2, 1);\r
+       p2.AppendEdge('I', 2, 2);\r
+       p2.AppendEdge('M', 3, 3);\r
+\r
+       unsigned Edges1[64];\r
+       unsigned Edges2[64];\r
+       unsigned uDiffCount1;\r
+       unsigned uDiffCount2;\r
+       DiffPaths(p1, p2, Edges1, &uDiffCount1, Edges2, &uDiffCount2);\r
+       }\r