Merge pull request #656 from LogosBible/collection_lock
[mono.git] / mcs / class / corlib / System / SByte.cs
1 //
2 // System.SByte.cs
3 //
4 // Author:
5 // Miguel de Icaza (miguel@ximian.com)
6 //
7 // (C) Ximian, Inc. http://www.ximian.com
8 // Copyright (C) 2004 Novell (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 using System.Globalization;
31
32 namespace System
33 {
34         [CLSCompliant(false)]
35         [Serializable]
36         [System.Runtime.InteropServices.ComVisible (true)]
37         public struct SByte : IFormattable, IConvertible, IComparable, IComparable<SByte>, IEquatable <SByte>
38         {
39                 public const sbyte MinValue = -128;
40                 public const sbyte MaxValue = 127;
41
42                 internal sbyte m_value;
43
44                 public int CompareTo (object obj)
45                 {
46                         if (obj == null)
47                                 return 1;
48
49                         if (!(obj is System.SByte))
50                                 throw new ArgumentException (Locale.GetText ("Value is not a System.SByte."));
51
52                         return CompareTo ((sbyte) obj);
53                 }
54
55                 public override bool Equals (object obj)
56                 {
57                         if (!(obj is System.SByte))
58                                 return false;
59
60                         return ((sbyte) obj) == m_value;
61                 }
62
63                 public override int GetHashCode ()
64                 {
65                         return m_value;
66                 }
67
68                 public int CompareTo (sbyte value)
69                 {
70                         return m_value - value;
71                 }
72
73                 public bool Equals (sbyte obj)
74                 {
75                         return obj == m_value;
76                 }
77
78                 internal static bool Parse (string s, bool tryParse, out sbyte result, out Exception exc)
79                 {
80                         int ival = 0;
81                         int len;
82                         int i;
83                         bool neg = false;
84                         bool digits_seen = false;
85
86                         result = 0;
87                         exc = null;
88
89                         if (s == null) {
90                                 if (!tryParse)
91                                         exc = new ArgumentNullException ("s");
92                                 return false;
93                         }
94
95                         len = s.Length;
96
97                         char c;
98                         for (i = 0; i < len; i++) {
99                                 c = s [i];
100                                 if (!Char.IsWhiteSpace (c))
101                                         break;
102                         }
103
104                         if (i == len) {
105                                 if (!tryParse)
106                                         exc = Int32.GetFormatException ();
107                                 return false;
108                         }
109
110                         c = s [i];
111                         if (c == '+')
112                                 i++;
113                         else if (c == '-') {
114                                 neg = true;
115                                 i++;
116                         }
117
118                         for (; i < len; i++) {
119                                 c = s [i];
120
121                                 if (c >= '0' && c <= '9') {
122                                         if (tryParse){
123                                                 int intval = ival * 10 - (int) (c - '0');
124
125                                                 if (intval < MinValue)
126                                                         return false;
127                                                 ival = (sbyte) intval;
128                                         } else
129                                                 ival = checked (ival * 10 - (int) (c - '0'));
130                                         digits_seen = true;
131                                 } else {
132                                         if (Char.IsWhiteSpace (c)) {
133                                                 for (i++; i < len; i++) {
134                                                         if (!Char.IsWhiteSpace (s [i])) {
135                                                                 if (!tryParse)
136                                                                         exc = Int32.GetFormatException ();
137                                                                 return false;
138                                                         }
139                                                 }
140                                                 break;
141                                         } else {
142                                                 if (!tryParse)
143                                                         exc = Int32.GetFormatException ();
144                                                 return false;
145                                         }
146                                 }
147                         }
148                         if (!digits_seen) {
149                                 if (!tryParse)
150                                         exc = Int32.GetFormatException ();
151                                 return false;
152                         }
153
154                         ival = neg ? ival : -ival;
155                         if (ival < SByte.MinValue || ival > SByte.MaxValue) {
156                                 if (!tryParse)
157                                         exc = new OverflowException ();
158                                 return false;
159                         }
160
161                         result = (sbyte)ival;
162                         return true;
163                 }
164
165                 [CLSCompliant(false)]
166                 public static sbyte Parse (string s, IFormatProvider provider)
167                 {
168                         return Parse (s, NumberStyles.Integer, provider);
169                 }
170
171                 [CLSCompliant(false)]
172                 public static sbyte Parse (string s, NumberStyles style)
173                 {
174                         return Parse (s, style, null);
175                 }
176
177                 [CLSCompliant(false)]
178                 public static sbyte Parse (string s, NumberStyles style, IFormatProvider provider)
179                 {
180                         int tmpResult = Int32.Parse (s, style, provider);
181                         if ((style & NumberStyles.AllowHexSpecifier) != 0) {
182                                 if (tmpResult >= 0 && tmpResult <= byte.MaxValue)
183                                         return (sbyte) tmpResult;
184                         } else if (tmpResult <= MaxValue && tmpResult >= MinValue) {
185                                 return (sbyte) tmpResult;
186                         }
187                         
188                         throw new OverflowException (Locale.GetText ("Value too large or too small."));
189                 }
190
191                 [CLSCompliant(false)]
192                 public static sbyte Parse (string s) 
193                 {
194                         Exception exc;
195                         sbyte res;
196
197                         if (!Parse (s, false, out res, out exc))
198                                 throw exc;
199
200                         return res;
201                 }
202
203                 [CLSCompliant(false)]
204                 public static bool TryParse (string s, out sbyte result) 
205                 {
206                         Exception exc;
207                         if (!Parse (s, true, out result, out exc)) {
208                                 result = 0;
209                                 return false;
210                         }
211
212                         return true;
213                 }
214
215                 [CLSCompliant(false)]
216                 public static bool TryParse (string s, NumberStyles style, IFormatProvider provider, out sbyte result) 
217                 {
218                         int tmpResult;
219                         result = 0;
220
221                         if (!Int32.TryParse (s, style, provider, out tmpResult))
222                                 return false;
223                         if (tmpResult > SByte.MaxValue || tmpResult < SByte.MinValue)
224                                 return false;
225                                 
226                         result = (sbyte)tmpResult;
227                         return true;
228                 }
229
230                 public override string ToString ()
231                 {
232                         return NumberFormatter.NumberToString (m_value, null);
233                 }
234
235                 public string ToString (IFormatProvider provider)
236                 {
237                         return NumberFormatter.NumberToString (m_value, provider);
238                 }
239
240                 public string ToString (string format)
241                 {
242                         return ToString (format, null);
243                 }
244
245                 public string ToString (string format, IFormatProvider provider)
246                 {
247                         return NumberFormatter.NumberToString (format, m_value, provider);
248                 }
249
250                 // =========== ICovnertible Methods =========== //
251                 public TypeCode GetTypeCode ()
252                 {
253                         return TypeCode.SByte;
254                 }
255
256                 bool IConvertible.ToBoolean (IFormatProvider provider)
257                 {
258                         return System.Convert.ToBoolean (m_value);
259                 }
260
261                 byte IConvertible.ToByte (IFormatProvider provider)
262                 {
263                         return System.Convert.ToByte (m_value);
264                 }
265
266                 char IConvertible.ToChar (IFormatProvider provider)
267                 {
268                         return System.Convert.ToChar (m_value);
269                 }
270
271                 DateTime IConvertible.ToDateTime (IFormatProvider provider)
272                 {
273                         return System.Convert.ToDateTime (m_value);
274                 }
275
276                 decimal IConvertible.ToDecimal (IFormatProvider provider)
277                 {
278                         return System.Convert.ToDecimal (m_value);
279                 }
280
281                 double IConvertible.ToDouble (IFormatProvider provider)
282                 {
283                         return System.Convert.ToDouble (m_value);
284                 }
285
286                 short IConvertible.ToInt16 (IFormatProvider provider)
287                 {
288                         return System.Convert.ToInt16 (m_value);
289                 }
290
291                 int IConvertible.ToInt32 (IFormatProvider provider)
292                 {
293                         return System.Convert.ToInt32 (m_value);
294                 }
295
296                 long IConvertible.ToInt64 (IFormatProvider provider)
297                 {
298                         return System.Convert.ToInt64 (m_value);
299                 }
300
301                 sbyte IConvertible.ToSByte (IFormatProvider provider)
302                 {
303                         return m_value;
304                 }
305
306                 float IConvertible.ToSingle (IFormatProvider provider)
307                 {
308                         return System.Convert.ToSingle (m_value);
309                 }
310
311                 object IConvertible.ToType (Type targetType, IFormatProvider provider)
312                 {
313                         if (targetType == null)
314                                 throw new ArgumentNullException ("targetType");
315                         return System.Convert.ToType (m_value, targetType, provider, false);
316                 }
317
318                 ushort IConvertible.ToUInt16 (IFormatProvider provider)
319                 {
320                         return System.Convert.ToUInt16 (m_value);
321                 }
322
323                 uint IConvertible.ToUInt32 (IFormatProvider provider)
324                 {
325                         return System.Convert.ToUInt32 (m_value);
326                 }
327
328                 ulong IConvertible.ToUInt64 (IFormatProvider provider)
329                 {
330                         return System.Convert.ToUInt64 (m_value);
331                 }
332         }
333 }