2 using System.Collections.Generic;
9 static MText mt = new MText ("012345678");
10 static MSymbol key = MSymbol.PropertyKey ("fse",
11 MProperty.Flags.FrontSensitive);
12 static MSymbol val0 = MSymbol.Of ("0");
13 static MSymbol val1 = MSymbol.Of ("1");
14 static MSymbol val2 = MSymbol.Of ("2");
15 static MProperty prop0 = new MProperty (key, val0);
16 static MProperty prop1 = new MProperty (key, val1);
17 static MProperty prop2 = new MProperty (key, val2);
19 // Each property is identified by its beginning point.
20 // The character at position i has the property that begins at prop[i].
21 // If the character has no property, prop[i] == -1.
22 static int[] prop = new int[LENGTH];
24 // The property beginning at position i ends at position end[i].
25 // If no property begins at position i, end[i] is undefined.
26 static int[] end = new int[LENGTH];
28 // The property beginning at position i has value value[i].
29 // If no property begings at positoin i, value[i] is undefined.
30 static MSymbol[] value = new MSymbol[LENGTH];
32 static void TestPushProp (int from, int to, MProperty newprop)
34 Console.WriteLine ("from {0}, to {1}, push {2}.\n", from, to, newprop.Val);
38 if (from > 0 && prop[from - 1] == prop[from] && prop[from] != -1)
41 for (i = prop[from]; i < n; i++)
44 if (to < LENGTH && prop[to - 1] == prop[to] && prop[to] != -1)
47 for (i = to; i < n; i++)
50 for (i = from; i < to; i++)
53 value[from] = (MSymbol) newprop.Val;
55 mt.PushProp (from, to, newprop);
58 static void TestPopProp (int from, int to, MSymbol key)
60 Console.WriteLine ("from {0}, to {1}, pop.\n", from, to);
64 Console.WriteLine ("prop[from] = {0}", prop[from]);
65 if (from > 0 && prop[from - 1] == prop[from] && prop[from] != -1)
66 for (i = prop[from]; i < from; i++)
69 if (to < LENGTH && prop[to - 1] == prop[to] && prop[to] != -1)
72 for (i = to; i < n; i++)
76 for (i = from; i < to; i++)
79 mt.PopProp (from, to, key);
82 static void TestDelIns (int from, int to, int from2)
84 Console.WriteLine ("from {0}, to {1}, moveto {2}.\n", from, to, from2);
86 int i, n, l = to - from;
87 int[] prop2 = new int[LENGTH], end2 = new int[LENGTH];
88 MSymbol[] value2 = new MSymbol[LENGTH];
91 // sensitivity for deletion
92 if (from > 0 && prop[from] != -1)
95 for (i = prop[from - 1] == prop[from] ? prop[from] : from; i < n; i++)
99 if (to < LENGTH && prop[to] != -1)
102 for (i = prop[to - 1] == prop[to] ? prop[to] : to; i < n; i++)
108 for (i = from; i < to; i++)
112 prop2[i - from] = prop[i] - from + from2;
113 end2[prop2[i - from]] = end[prop[i]] - from + from2;
114 value2[prop2[i - from]] = value[prop[i]];
117 prop2[i - from] = -1;
122 for (i = to; i < LENGTH; i++)
126 prop[i - l] = prop[i] - l;
127 end[prop[i - l]] = end[prop[i]] - l;
128 value[prop[i - l]] = value[prop[i]];
133 prop[LENGTH - l] = -1;
136 // sensitivity for insertion
137 if (from2 > 0 && prop[from2 - 1] == prop[from2] && prop[from2] != -1)
139 n = end[prop[from2]];
140 for (i = prop[from2 - 1] == prop[from2] ? prop[from2] : from2;
147 for (i = LENGTH - 1; i >= from2 + l; i--)
149 if (prop[i - l] != -1)
151 prop[i] = prop[i - l] + l;
152 end[prop[i]] = end[prop[i - l]] + l;
153 value[prop[i]] = value[prop[i - l]];
161 for (i = from2; i < from2 + l; i++)
163 if (prop2[i - from2] != -1)
165 prop[i] = prop2[i - from2];
166 end[prop[i]] = end2[prop2[i - from2]];
167 value[prop[i]] = value2[prop2[i - from2]];
174 MText mt2 = mt.Dup ();
176 mt.Ins (from2, mt2, from, to);
179 static bool Compare ()
181 for (int i = 0; i < LENGTH; i++)
183 object val = mt.GetProp (i, key);
185 if (prop[i] == -1 && (MSymbol) val != null)
187 Console.WriteLine ("value[{0}] is nil, GetProp returned {1}",
189 val == null ? MSymbol.nil : val);
193 if (prop[i] != -1 && (value[prop[i]] != (MSymbol) val))
195 Console.WriteLine ("value[{0}] is {1}, GetProp returned {2}",
197 value[prop[i]] == null ? MSymbol.nil : value[prop[i]],
198 val == null ? MSymbol.nil : val);
207 for (int i = 0; i <= LENGTH; i++)
208 Console.Write ("{0} ", i);
209 Console.WriteLine ("\n-------------------");
214 Console.Write ("{0} ", value[prop[0]]);
216 for (int i = 1; i < LENGTH; i++)
220 else if (prop[i - 1] == prop[i])
221 Console.Write ("< ");
223 Console.Write ("{0} ", value[prop[i]]);
225 Console.Write ("\n");
228 static void DebugDump (int n)
233 Console.Write ("\n#{0}\n ", n);
234 for (i = 0; i <= LENGTH; i++)
235 Console.Write ("{0} ", i);
236 Console.Write ("\n----------------------\nP ");
237 for (i = 0; i < LENGTH; i++)
240 Console.Write ("{0} ", prop[i]);
244 Console.Write ("\nE ");
246 Console.Write ("{0} ", end[0]);
249 for (i = 1; i < LENGTH; i++)
251 if (prop[i - 1] != prop[i] && prop[i] != -1)
252 Console.Write ("{0} ", end[i]);
256 Console.Write ("\nV ");
258 Console.Write ("{0} ", value[0]);
261 for (i = 1; i < LENGTH; i++)
263 if (prop[i - 1] != prop[i] && prop[i] != -1)
264 Console.Write ("{0} ", value[i]);
268 Console.Write ("\n");
272 public static void Main (string[] args)
274 Random r = new Random (int.Parse (args[0]));
275 int check = (args.Length > 1 ? int.Parse (args[1]) : 0xFFFFFFF);
277 for (int i = 0; i < LENGTH; i++)
280 for (int loop = 0; loop < 1000000; loop++)
284 Console.WriteLine ("--- loop = {0} ---\n", loop);
287 mt.DumpPropNested ();
293 from = r.Next (LENGTH);
294 to = r.Next (LENGTH) + 1;
295 } while (from == to);
320 TestPushProp (from, to, prop);
323 TestPopProp (from, to, key);
326 TestDelIns (from, to, r.Next (LENGTH - (to - from) + 1));
331 mt.DumpPropNested ();
333 if (Compare () == false)
335 Console.WriteLine ("");
337 Console.WriteLine ("Failed.");