public class Test
{
- const int LENGTH = 10;
- const int DEPTH = 10;
- static MText mt = new MText ("0123456789");
+ const int LENGTH = 9;
+ static MText mt = new MText ("012345678");
static MSymbol key = MSymbol.PropertyKey ("se",
MProperty.Flags.Sensitive);
static MSymbol val0 = MSymbol.Of ("0");
int i, n;
if (from > 0 && prop[from - 1] == prop[from] && prop[from] != -1)
- for (i = prop[from]; i < from; i++)
- prop[i] = -1;
+ {
+ n = end[prop[from]];
+ for (i = prop[from]; i < n; i++)
+ prop[i] = -1;
+ }
if (to < LENGTH && prop[to - 1] == prop[to] && prop[to] != -1)
{
n = end[prop[to]];
int i, n;
+ Console.WriteLine ("prop[from] = {0}", prop[from]);
if (from > 0 && prop[from - 1] == prop[from] && prop[from] != -1)
- for (i = prop[from]; i < from - 1; i++)
+ for (i = prop[from]; i < from; i++)
prop[i] = -1;
if (to < LENGTH && prop[to - 1] == prop[to] && prop[to] != -1)
Console.WriteLine ("from {0}, to {1}, moveto {2}.\n", from, to, from2);
int i, n, l = to - from;
- int[] prop2 = new int[LENGTH];
+ int[] prop2 = new int[LENGTH], end2 = new int[LENGTH];
+ MSymbol[] value2 = new MSymbol[LENGTH];
+ DebugDump (0);
// sensitivity for deletion
if (from > 0 && prop[from - 1] == prop[from] && prop[from] != -1)
{
prop[i] = -1;
}
+ DebugDump (1);
// copy
for (i = from; i < to; i++)
- prop2[i - from] = prop[i];
+ {
+ if (prop[i] != -1)
+ {
+ prop2[i - from] = prop[i] - from + from2;
+ end2[prop2[i - from]] = end[prop[i]] - from + from2;
+ value2[prop2[i - from]] = value[prop[i]];
+ }
+ else
+ prop2[i - from] = -1;
+ }
+ DebugDump (2);
// delete
for (i = to; i < LENGTH; i++)
- prop[i - l] = prop[i];
+ {
+ if (prop[i] != -1)
+ {
+ prop[i - l] = prop[i] - l;
+ end[prop[i - l]] = end[prop[i]] - l;
+ value[prop[i - l]] = value[prop[i]];
+ }
+ else
+ prop[i - l] = -1;
+ }
+ DebugDump (3);
// sensitivity for insertion
if (from2 > 0 && prop[from2 - 1] == prop[from2] && prop[from2] != -1)
{
prop[i] = -1;
}
+ DebugDump (4);
// move
for (i = LENGTH - 1; i >= from2 + l; i--)
- prop[i] = prop[i - l];
+ {
+ if (prop[i - l] != -1)
+ {
+ prop[i] = prop[i - l] + l;
+ end[prop[i]] = end[prop[i - l]] + l;
+ value[prop[i]] = value[prop[i - l]];
+ }
+ else
+ prop[i] = -1;
+ }
+ DebugDump (5);
// insert
for (i = from2; i < from2 + l; i++)
- prop[i] = prop2[i - from2];
+ {
+ if (prop2[i - from2] != -1)
+ {
+ prop[i] = prop2[i - from2];
+ end[prop[i]] = end2[prop2[i - from2]];
+ value[prop[i]] = value2[prop2[i - from2]];
+ }
+ else
+ prop[i] = -1;
+ }
+ DebugDump (6);
MText mt2 = mt.Dup ();
mt.Del (from, to);
static void Dump ()
{
- for (int i = 0; i < LENGTH; i++)
+ for (int i = 0; i <= LENGTH; i++)
Console.Write ("{0} ", i);
Console.WriteLine ("\n-------------------");
if (prop[0] == -1)
Console.Write (" ");
else
- Console.Write ("{0}", value[prop[0]]);
+ Console.Write ("{0} ", value[prop[0]]);
for (int i = 1; i < LENGTH; i++)
{
else
Console.Write ("{0} ", value[prop[i]]);
}
+ Console.Write ("\n");
+ }
+
+ static void DebugDump (int n)
+ {
+ /*
+ int i;
+
+ Console.Write ("\n#{0}\n ", n);
+ for (i = 0; i <= LENGTH; i++)
+ Console.Write ("{0} ", i);
+ Console.Write ("\n----------------------\nP ");
+ for (i = 0; i < LENGTH; i++)
+ {
+ if (prop[i] != -1)
+ Console.Write ("{0} ", prop[i]);
+ else
+ Console.Write (" ");
+ }
+ Console.Write ("\nE ");
+ if (prop[0] != -1)
+ Console.Write ("{0} ", end[0]);
+ else
+ Console.Write (" ");
+ for (i = 1; i < LENGTH; i++)
+ {
+ if (prop[i - 1] != prop[i] && prop[i] != -1)
+ Console.Write ("{0} ", end[i]);
+ else
+ Console.Write (" ");
+ }
+ Console.Write ("\nV ");
+ if (prop[0] != -1)
+ Console.Write ("{0} ", value[0]);
+ else
+ Console.Write (" ");
+ for (i = 1; i < LENGTH; i++)
+ {
+ if (prop[i - 1] != prop[i] && prop[i] != -1)
+ Console.Write ("{0} ", value[i]);
+ else
+ Console.Write (" ");
+ }
+ Console.Write ("\n");
+ */
}
public static void Main (string[] args)
int check = (args.Length > 1 ? int.Parse (args[1]) : 0xFFFFFFF);
for (int i = 0; i < LENGTH; i++)
- prop[i] = end[i] = -1;
-
+ prop[i] = -1;
for (int loop = 0; loop < 1000000; loop++)
{