*** empty log message ***
[m17n/m17n-lib-cs.git] / MSymbol.cs
1 using System;
2 using System.Collections;
3 using M17N.Core;
4
5 namespace M17N.Core
6 {
7   public class MSymbol
8   {
9     static private Hashtable pool = new Hashtable ();
10
11     internal class MSymbolData
12     {
13       public string name;
14       public Object value;
15       public MPlist plist;
16
17       public MSymbolData (string name)
18       {
19         this.name = name;
20       }
21     }
22
23     static public MSymbol nil = new MSymbol ("nil");
24     static public MSymbol t = new MSymbol ("t");
25
26     private MSymbolData data;
27
28     public MSymbol (string name)
29     {
30       if (! pool.ContainsKey (name))
31         {
32           data = new MSymbolData (name);
33           pool.Add (name, data);
34         }
35       else
36         data = (MSymbolData) pool[name];
37     }
38
39     public override string ToString () { return data.name; }
40
41     public override bool Equals (Object sym)
42     {
43       return (this.data == ((MSymbol) sym).data);
44     }
45
46     public override int GetHashCode ()
47     {
48       return (data.name.GetHashCode ());
49     }
50
51     public static bool operator== (MSymbol sym1, MSymbol sym2)
52     {
53       return ((object) sym1.data == (object) sym2.data);
54     }
55
56     public static bool operator!= (MSymbol sym1, MSymbol sym2)
57     {
58       return ((object) sym1.data != (object) sym2.data);
59     }
60
61     public object get (MSymbol key)
62     {
63       return (data.plist == null ? null : data.plist.get (key));
64     }
65
66     public object put (MSymbol key, object val)
67     {
68       if (data.plist == null)
69         data.plist = new MPlist ();
70       return data.plist.put (key, val);
71     }
72   }
73 }