6 void DiffPaths(const PWPath &p1, const PWPath &p2, unsigned Edges1[],
\r
7 unsigned *ptruDiffCount1, unsigned Edges2[], unsigned *ptruDiffCount2)
\r
16 const unsigned uEdgeCount1 = p1.GetEdgeCount();
\r
17 const unsigned uEdgeCount2 = p2.GetEdgeCount();
\r
19 unsigned uDiffCount1 = 0;
\r
20 unsigned uDiffCount2 = 0;
\r
21 unsigned uEdgeIndex1 = 0;
\r
22 unsigned uEdgeIndex2 = 0;
\r
23 const PWEdge *Edge1 = &p1.GetEdge(uEdgeIndex1);
\r
24 const PWEdge *Edge2 = &p2.GetEdge(uEdgeIndex2);
\r
27 unsigned uEdgeIndexTop1 = uEdgeIndex1;
\r
28 unsigned uEdgeIndexTop2 = uEdgeIndex2;
\r
29 Edge1 = &p1.GetEdge(uEdgeIndex1);
\r
30 Edge2 = &p2.GetEdge(uEdgeIndex2);
\r
32 Log("e1[%u] PLA%u PLB%u %c, e2[%u] PLA%u PLB %u %c DC1=%u DC2=%u\n",
\r
33 uEdgeIndex1, Edge1->uPrefixLengthA, Edge1->uPrefixLengthB, Edge1->cType,
\r
34 uEdgeIndex2, Edge2->uPrefixLengthA, Edge2->uPrefixLengthB, Edge2->cType,
\r
35 uDiffCount1, uDiffCount2);
\r
37 if (Edge1->uPrefixLengthA == Edge2->uPrefixLengthA &&
\r
38 Edge1->uPrefixLengthB == Edge2->uPrefixLengthB)
\r
40 if (!Edge1->Equal(*Edge2))
\r
42 Edges1[uDiffCount1++] = uEdgeIndex1;
\r
43 Edges2[uDiffCount2++] = uEdgeIndex2;
\r
49 else if (Edge2->uPrefixLengthA < Edge1->uPrefixLengthA ||
\r
50 Edge2->uPrefixLengthB < Edge1->uPrefixLengthB)
\r
51 Edges2[uDiffCount2++] = uEdgeIndex2++;
\r
53 else if (Edge1->uPrefixLengthA < Edge2->uPrefixLengthA ||
\r
54 Edge1->uPrefixLengthB < Edge2->uPrefixLengthB)
\r
55 Edges1[uDiffCount1++] = uEdgeIndex1++;
\r
57 if (uEdgeCount1 == uEdgeIndex1)
\r
59 while (uEdgeIndex2 < uEdgeCount2)
\r
60 Edges2[uDiffCount2++] = uEdgeIndex2++;
\r
63 if (uEdgeCount2 == uEdgeIndex2)
\r
65 while (uEdgeIndex1 < uEdgeCount1)
\r
66 Edges1[uDiffCount1++] = uEdgeIndex1++;
\r
69 if (uEdgeIndex1 == uEdgeIndexTop1 && uEdgeIndex2 == uEdgeIndexTop2)
\r
70 Quit("DiffPaths stuck");
\r
74 Log("DiffCount1=%u (%u %u)\n", uDiffCount1, uEdgeCount1, uEdgeCount2);
\r
76 for (unsigned i = 0; i < uDiffCount1; ++i)
\r
78 const PWEdge e = p1.GetEdge(Edges1[i]);
\r
79 Log(" %u=%c%u.%u", Edges1[i], e.cType, e.uPrefixLengthA, e.uPrefixLengthB);
\r
82 Log("DiffCount2=%u\n", uDiffCount2);
\r
84 for (unsigned i = 0; i < uDiffCount2; ++i)
\r
86 const PWEdge e = p2.GetEdge(Edges2[i]);
\r
87 Log(" %u=%c%u.%u", Edges2[i], e.cType, e.uPrefixLengthA, e.uPrefixLengthB);
\r
91 *ptruDiffCount1 = uDiffCount1;
\r
92 *ptruDiffCount2 = uDiffCount2;
\r
95 void TestDiffPaths()
\r
100 p1.AppendEdge('M', 1, 1);
\r
101 p1.AppendEdge('M', 2, 2);
\r
102 p1.AppendEdge('M', 3, 3);
\r
104 p2.AppendEdge('M', 1, 1);
\r
105 p2.AppendEdge('D', 2, 1);
\r
106 p2.AppendEdge('I', 2, 2);
\r
107 p2.AppendEdge('M', 3, 3);
\r
109 unsigned Edges1[64];
\r
110 unsigned Edges2[64];
\r
111 unsigned uDiffCount1;
\r
112 unsigned uDiffCount2;
\r
113 DiffPaths(p1, p2, Edges1, &uDiffCount1, Edges2, &uDiffCount2);
\r