2006-02-21 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml.Serialization / CodeIdentifiers.cs
1 // \r
2 // System.Xml.Serialization.CodeIdentifiers \r
3 //\r
4 // Author:\r
5 //   Tim Coleman (tim@timcoleman.com)\r
6 //\r
7 // Copyright (C) Tim Coleman, 2002\r
8 //\r
9 \r
10 //\r
11 // Permission is hereby granted, free of charge, to any person obtaining\r
12 // a copy of this software and associated documentation files (the\r
13 // "Software"), to deal in the Software without restriction, including\r
14 // without limitation the rights to use, copy, modify, merge, publish,\r
15 // distribute, sublicense, and/or sell copies of the Software, and to\r
16 // permit persons to whom the Software is furnished to do so, subject to\r
17 // the following conditions:\r
18 // \r
19 // The above copyright notice and this permission notice shall be\r
20 // included in all copies or substantial portions of the Software.\r
21 // \r
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
29 //\r
30 \r
31 using System;\r
32 using System.Collections;\r
33 using System.Globalization;\r
34 \r
35 namespace System.Xml.Serialization {\r
36         public class CodeIdentifiers {\r
37 \r
38                 #region Fields\r
39 \r
40                 bool useCamelCasing;\r
41                 Hashtable table = new Hashtable ();\r
42                 Hashtable reserved = new Hashtable ();\r
43 \r
44                 #endregion\r
45 \r
46                 #region Constructors\r
47 \r
48                 public CodeIdentifiers ()\r
49                 {\r
50                 }\r
51 \r
52                 #endregion // Constructors\r
53 \r
54                 #region Properties\r
55 \r
56                 public bool UseCamelCasing {\r
57                         get { return useCamelCasing; }\r
58                         set { useCamelCasing = value; }\r
59                 }\r
60 \r
61                 #endregion // Properties\r
62 \r
63                 #region Methods\r
64 \r
65                 public void Add (string identifier, object value)\r
66                 {\r
67                         table.Add (identifier, value);\r
68                 }\r
69 \r
70                 public void AddReserved (string identifier)\r
71                 {\r
72                         reserved.Add (identifier, identifier);\r
73                 }\r
74 \r
75                 public string AddUnique (string identifier, object value)\r
76                 {\r
77                         string unique = MakeUnique (identifier);\r
78                         Add (unique, value);\r
79                         return unique;\r
80                 }\r
81 \r
82                 public void Clear ()\r
83                 {\r
84                         table.Clear ();\r
85                 }\r
86 \r
87                 public bool IsInUse (string identifier)\r
88                 {\r
89                         return (table.ContainsKey (identifier) || reserved.ContainsKey (identifier));\r
90                 }\r
91 \r
92                 public string MakeRightCase (string identifier)\r
93                 {\r
94                         if (UseCamelCasing)\r
95                                 return CodeIdentifier.MakeCamel (identifier);\r
96                         else\r
97                                 return CodeIdentifier.MakePascal (identifier);\r
98                 }\r
99 \r
100                 public string MakeUnique (string identifier)\r
101                 {\r
102                         string uniqueIdentifier = identifier;\r
103                         int i = 1;\r
104 \r
105                         while (IsInUse (uniqueIdentifier)) {\r
106                                 uniqueIdentifier = String.Format (CultureInfo.InvariantCulture, "{0}{1}", identifier, i);\r
107                                 i += 1;\r
108                         }\r
109 \r
110                         return uniqueIdentifier;\r
111                 }\r
112 \r
113                 public void Remove (string identifier)\r
114                 {\r
115                         table.Remove (identifier);\r
116                 }\r
117 \r
118                 public void RemoveReserved (string identifier)\r
119                 {\r
120                         reserved.Remove (identifier);\r
121                 }\r
122 \r
123                 public object ToArray (Type type)\r
124                 {\r
125                         Array list = Array.CreateInstance (type, table.Count);\r
126                         table.CopyTo (list, 0);\r
127                         return list;\r
128                 }\r
129 \r
130                 #endregion // Methods\r
131         }\r
132 }\r