5 // Miguel de Icaza (miguel@ximian.com)
7 // (C) Ximian, Inc. http://www.ximian.com
8 // Copyright (C) 2004 Novell (http://www.novell.com)
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:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
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.
30 using System.Globalization;
35 [System.Runtime.InteropServices.ComVisible (true)]
36 public struct Int16 : IFormattable, IConvertible, IComparable, IComparable<Int16>, IEquatable <Int16>
39 public const short MaxValue = 32767;
40 public const short MinValue = -32768;
42 internal short m_value;
44 public int CompareTo (object value)
49 if (!(value is System.Int16))
50 throw new ArgumentException (Locale.GetText ("Value is not a System.Int16"));
52 short xv = (short) value;
61 public override bool Equals (object obj)
63 if (!(obj is System.Int16))
66 return ((short) obj) == m_value;
69 public override int GetHashCode ()
74 public int CompareTo (short value)
84 public bool Equals (short obj)
86 return obj == m_value;
89 internal static bool Parse (string s, bool tryParse, out short result, out Exception exc)
94 bool digits_seen = false;
101 exc = new ArgumentNullException ("s");
108 for (i = 0; i < len; i++){
110 if (!Char.IsWhiteSpace (c))
116 exc = Int32.GetFormatException ();
128 for (; i < len; i++){
130 if (c >= '0' && c <= '9'){
131 byte d = (byte) (c - '0');
133 if (val > (MaxValue/10))
136 if (val == (MaxValue/10)){
137 if ((d > (MaxValue % 10)) && (sign == 1 || (d > ((MaxValue % 10) + 1))))
140 val = (short) ((val * sign * 10) - d);
142 val = (short) ((val * 10) + d);
144 if (Int32.ProcessTrailingWhitespace (tryParse, s, i + 1, ref exc)){
150 val = (short) (val * 10 + d);
154 } else if (!Int32.ProcessTrailingWhitespace (tryParse, s, i, ref exc))
160 exc = Int32.GetFormatException ();
165 result = (short) (val * sign);
173 exc = new OverflowException ("Value is too large");
177 public static short Parse (string s, IFormatProvider provider)
179 return Parse (s, NumberStyles.Integer, provider);
182 public static short Parse (string s, NumberStyles style)
184 return Parse (s, style, null);
187 public static short Parse (string s, NumberStyles style, IFormatProvider provider)
189 int tmpResult = Int32.Parse (s, style, provider);
190 if (tmpResult > Int16.MaxValue || tmpResult < Int16.MinValue)
191 throw new OverflowException ("Value too large or too small.");
193 return (short) tmpResult;
196 public static short Parse (string s)
201 if (!Parse (s, false, out res, out exc))
207 public static bool TryParse (string s, out short result)
210 if (!Parse (s, true, out result, out exc)) {
218 public static bool TryParse (string s, NumberStyles style, IFormatProvider provider, out short result)
223 if (!Int32.TryParse (s, style, provider, out tmpResult))
226 if (tmpResult > Int16.MaxValue || tmpResult < Int16.MinValue)
229 result = (short)tmpResult;
233 public override string ToString ()
235 return NumberFormatter.NumberToString (m_value, null);
238 public string ToString (IFormatProvider provider)
240 return NumberFormatter.NumberToString (m_value, provider);
243 public string ToString (string format)
245 return ToString (format, null);
248 public string ToString (string format, IFormatProvider provider)
250 return NumberFormatter.NumberToString(format, m_value, provider);
253 // =========== IConvertible Methods =========== //
255 public TypeCode GetTypeCode ()
257 return TypeCode.Int16;
260 bool IConvertible.ToBoolean (IFormatProvider provider)
262 return System.Convert.ToBoolean (m_value);
265 byte IConvertible.ToByte (IFormatProvider provider)
267 return System.Convert.ToByte (m_value);
270 char IConvertible.ToChar (IFormatProvider provider)
272 return System.Convert.ToChar (m_value);
275 DateTime IConvertible.ToDateTime (IFormatProvider provider)
277 return System.Convert.ToDateTime (m_value);
280 decimal IConvertible.ToDecimal (IFormatProvider provider)
282 return System.Convert.ToDecimal (m_value);
285 double IConvertible.ToDouble (IFormatProvider provider)
287 return System.Convert.ToDouble (m_value);
290 short IConvertible.ToInt16 (IFormatProvider provider)
292 return System.Convert.ToInt16 (m_value);
295 int IConvertible.ToInt32 (IFormatProvider provider)
297 return System.Convert.ToInt32 (m_value);
300 long IConvertible.ToInt64 (IFormatProvider provider)
302 return System.Convert.ToInt64 (m_value);
305 sbyte IConvertible.ToSByte (IFormatProvider provider)
307 return System.Convert.ToSByte (m_value);
310 float IConvertible.ToSingle (IFormatProvider provider)
312 return System.Convert.ToSingle (m_value);
315 object IConvertible.ToType (Type targetType, IFormatProvider provider)
317 if (targetType == null)
318 throw new ArgumentNullException ("targetType");
319 return System.Convert.ToType (m_value, targetType, provider, false);
322 ushort IConvertible.ToUInt16 (IFormatProvider provider)
324 return System.Convert.ToUInt16 (m_value);
327 uint IConvertible.ToUInt32 (IFormatProvider provider)
329 return System.Convert.ToUInt32 (m_value);
332 ulong IConvertible.ToUInt64 (IFormatProvider provider)
334 return System.Convert.ToUInt64 (m_value);