--- /dev/null
+using System;
+using M17N.Core;
+
+namespace M17N.Core
+{
+ public class MPlist
+ {
+ private MSymbol key;
+ private object val;
+ private MPlist next;
+
+ public MPlist ()
+ {
+ key = null;
+ val = null;
+ next = null;
+ }
+
+ public bool tailp { get { return (object) key == null; } }
+
+ public new string ToString ()
+ {
+ string str = "";
+
+ for (MPlist p = this; ! p.tailp; p = p.next)
+ {
+ str += (p == this ? "(" : " ") + p.key.ToString () + ":";
+ if (p.val is MSymbol)
+ str += ((MSymbol) p.val).ToString ();
+ else if (p.val is MPlist)
+ str += ((MPlist) p.val).ToString ();
+ }
+ return str + ")";
+ }
+
+ public object get (MSymbol key)
+ {
+ if ((object) key == null)
+ return null;
+ for (MPlist p = this; ! p.tailp; p = p.next)
+ if (p.key == key)
+ return p.val;
+ return null;
+ }
+
+ public object put (MSymbol key, object val)
+ {
+ MPlist p;
+
+ for (p = this; ! p.tailp; p = p.next)
+ if (p.key == key)
+ {
+ if (val != null)
+ p.val = val;
+ else
+ p.pop ();
+ return val;
+ }
+ if (val != null)
+ {
+ p.key = key;
+ p.val = val;
+ p.next = new MPlist ();
+ }
+ return val;
+ }
+
+ public object push (MSymbol key, object val)
+ {
+ MPlist p = new MPlist ();
+
+ p.key = this.key;
+ p.val = this.val;
+ p.next = this.next;
+ this.key = key;
+ this.val = val;
+ this.next = p;
+
+ return val;
+ }
+
+ public object pop ()
+ {
+ if (tailp)
+ return null;
+
+ object val = this.val;
+
+ this.key = this.next.key;
+ this.val = this.next.val;
+ this.next = this.next.next;
+ return val;
+ }
+
+ public object add (MSymbol key, object val)
+ {
+ MPlist p;
+
+ for (p = this; ! p.tailp; p = p.next);
+ if (val != null)
+ {
+ p.key = key;
+ p.val = val;
+ p.next = new MPlist ();
+ }
+ return val;
+ }
+ }
+}
using System;
+using System.Collections;
using M17N.Core;
namespace M17N.Core
{
- public class MPlist
- {
- private MSymbol key;
- private object val;
- private MPlist next;
-
- public MPlist ()
- {
- key = null;
- val = null;
- next = null;
- }
-
- public bool tailp { get { return (object) key == null; } }
-
- public new string ToString ()
- {
- string str = "";
-
- for (MPlist p = this; ! p.tailp; p = p.next)
- {
- str += (p == this ? "(" : " ") + p.key.ToString () + ":";
- if (p.val is MSymbol)
- str += ((MSymbol) p.val).ToString ();
- else if (p.val is MPlist)
- str += ((MPlist) p.val).ToString ();
- }
- return str + ")";
- }
-
- public object get (MSymbol key)
- {
- if ((object) key == null)
- return null;
- for (MPlist p = this; ! p.tailp; p = p.next)
- if (p.key == key)
- return p.val;
- return null;
- }
-
- public object put (MSymbol key, object val)
- {
- MPlist p;
-
- for (p = this; ! p.tailp; p = p.next)
- if (p.key == key)
- {
- if (val != null)
- p.val = val;
- else
- p.pop ();
- return val;
- }
- if (val != null)
- {
- p.key = key;
- p.val = val;
- p.next = new MPlist ();
- }
- return val;
- }
-
- public object push (MSymbol key, object val)
- {
- MPlist p = new MPlist ();
-
- p.key = this.key;
- p.val = this.val;
- p.next = this.next;
- this.key = key;
- this.val = val;
- this.next = p;
-
- return val;
- }
-
- public object pop ()
- {
- if (tailp)
- return null;
-
- object val = this.val;
-
- this.key = this.next.key;
- this.val = this.next.val;
- this.next = this.next.next;
- return val;
- }
-
- public object add (MSymbol key, object val)
- {
- MPlist p;
-
- for (p = this; ! p.tailp; p = p.next);
- if (val != null)
- {
- p.key = key;
- p.val = val;
- p.next = new MPlist ();
- }
- return val;
- }
- }
-
public class MSymbol
{
+ static private Hashtable pool = new Hashtable ();
+
internal class MSymbolData
{
public string name;
+ public Object value;
public MPlist plist;
- public MSymbolData next;
- public MSymbolData (string name, MSymbolData next)
+ public MSymbolData (string name)
{
this.name = name;
- this.next = next;
- }
- }
-
- static internal class MSymbolPool
- {
- const int MSYMBOL_POOL_SIZE = 1024;
- static MSymbolData[] pool = new MSymbolData[MSYMBOL_POOL_SIZE];
- static int[] used = new int[MSYMBOL_POOL_SIZE];
-
- static public MSymbolData get_data (string name)
- {
- MSymbolData data;
-
- if (used[0] > 0)
- {
- data = pool[0];
- for (int i = 0; i < used[0]; i++, data = data.next)
- if (data.name == name)
- return data;
- }
- pool[0] = data = new MSymbolData (name, pool[0]);
- used[0]++;
- return data;
}
}
public MSymbol (string name)
{
- data = MSymbolPool.get_data (name);
+ if (! pool.ContainsKey (name))
+ {
+ data = new MSymbolData (name);
+ pool.Add (name, data);
+ }
+ else
+ data = (MSymbolData) pool[name];
}
- public new string ToString () { return data.name; }
+ public override string ToString () { return data.name; }
- public new bool Equals (object sym) { return ((object) this == sym); }
+ public override bool Equals (Object sym)
+ {
+ return (this.data == ((MSymbol) sym).data);
+ }
- public new int GetHashCode () { return 0; }
+ public override int GetHashCode ()
+ {
+ return (data.name.GetHashCode ());
+ }
public static bool operator== (MSymbol sym1, MSymbol sym2)
{