*** empty log message ***
[m17n/m17n-lib-cs.git] / MSymbol.cs
index 06e5370..b92bcbf 100644 (file)
 using System;
+using System.Collections;
 using M17N.Core;
 
 namespace M17N.Core
 {
-  public class MPlist
+  public class MSymbol
   {
-    private MSymbol key;
-    private object val;
-    private MPlist next;
+    static private Hashtable pool = new Hashtable ();
 
-    public MPlist ()
+    private class MSymbolData
     {
-      key = null;
-      val = null;
-      next = null;
-    }
-
-    public bool tailp { get { return (object) key == null; } }
-
-    public new string ToString ()
-    {
-      string str = "";
+      public string name;
+      public object value;
+      public MPlist plist;
 
-      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 MSymbolData (string name)
+      {
+       this.name = name;
+      }
     }
 
-    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;
-    }
+    private MSymbolData data;
 
-    public object put (MSymbol key, object val)
-    {
-      MPlist p;
+    public static MSymbol nil = new MSymbol ("nil");
+    public static MSymbol t = new MSymbol ("t");
+    public static MSymbol symbol = new MSymbol ("symbol");
+    public static MSymbol mtext = new MSymbol ("mtext");
+    public static MSymbol plist = new MSymbol ("plist");
+    public static MSymbol integer = new MSymbol ("integer");
 
-      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)
+    public MSymbol (string name)
+    {
+      if (! pool.ContainsKey (name))
        {
-         p.key = key;
-         p.val = val;
-         p.next = new MPlist ();
+         data = new MSymbolData (name);
+         pool.Add (name, data);
        }
-      return val;
+      else
+       data = (MSymbolData) pool[name];
     }
 
-    public object push (MSymbol key, object val)
+    public override string ToString ()
     {
-      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;
+      string str = "";
 
-      for (p = this; ! p.tailp; p = p.next);
-      if (val != null)
+      foreach (char c in data.name)
        {
-         p.key = key;
-         p.val = val;
-         p.next = new MPlist ();
+         if (c == '\\' || c == ' ' || c == '\'' || c == '\"' || c == ':')
+           str += "\\";
+         str += c;
        }
-      return val;
+      return str;
     }
-  }
 
-  public class MSymbol
-  {
-    internal class MSymbolData
+    public override bool Equals (object sym)
     {
-      public string name;
-      public MPlist plist;
-      public MSymbolData next;
-
-      public MSymbolData (string name, MSymbolData next)
-      {
-       this.name = name;
-       this.next = next;
-      }
+      if (sym == null)
+       return false;
+      return (this.data == ((MSymbol) sym).data);
     }
 
-    static internal class MSymbolPool
+    public override int GetHashCode ()
     {
-      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;
-      }
+      return (data.name.GetHashCode ());
     }
 
-    static public MSymbol nil = new MSymbol ("nil");
-    static public MSymbol t = new MSymbol ("t");
-
-    private MSymbolData data;
-
-    public MSymbol (string name)
+    public static bool operator== (MSymbol sym1, MSymbol sym2)
     {
-      data = MSymbolPool.get_data (name);
+      return (sym1.data == sym2.data);
     }
 
-    public new string ToString () { return data.name; }
-
-    public new bool Equals (object sym) { return ((object) this == sym); }
-
-    public new int GetHashCode () { return 0; }
-
-    public static bool operator== (MSymbol sym1, MSymbol sym2)
+    public static bool operator!= (MSymbol sym1, MSymbol sym2)
     {
-      return ((object) sym1.data == (object) sym2.data);
+      return (sym1.data != sym2.data);
     }
 
-    public static bool operator!= (MSymbol sym1, MSymbol sym2)
+    public MPlist Find (MSymbol key)
     {
-      return ((object) sym1.data != (object) sym2.data);
+      return (data.plist == null ? null : data.plist.Find (key));
     }
 
-    public object get (MSymbol key)
+    public object Get (MSymbol key)
     {
-      return (data.plist == null ? null : data.plist.get (key));
+      return (data.plist == null ? null : data.plist.Get (key));
     }
 
-    public object put (MSymbol key, object val)
+    public object Put (MSymbol key, object val)
     {
       if (data.plist == null)
        data.plist = new MPlist ();
-      return data.plist.put (key, val);
+      return data.plist.Put (key, val);
     }
   }
 }