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 ((style & NumberStyles.AllowHexSpecifier) != 0) {
191 if (tmpResult >= 0 && tmpResult <= ushort.MaxValue)
192 return (short) tmpResult;
193 } else if (tmpResult <= MaxValue && tmpResult >= MinValue) {
194 return (short) tmpResult;
197 throw new OverflowException ("Value too large or too small.");
200 public static short Parse (string s)
205 if (!Parse (s, false, out res, out exc))
211 public static bool TryParse (string s, out short result)
214 if (!Parse (s, true, out result, out exc)) {
222 public static bool TryParse (string s, NumberStyles style, IFormatProvider provider, out short result)
227 if (!Int32.TryParse (s, style, provider, out tmpResult))
230 if (tmpResult > Int16.MaxValue || tmpResult < Int16.MinValue)
233 result = (short)tmpResult;
237 public override string ToString ()
239 return NumberFormatter.NumberToString (m_value, null);
242 public string ToString (IFormatProvider provider)
244 return NumberFormatter.NumberToString (m_value, provider);
247 public string ToString (string format)
249 return ToString (format, null);
252 public string ToString (string format, IFormatProvider provider)
254 return NumberFormatter.NumberToString(format, m_value, provider);
257 // =========== IConvertible Methods =========== //
259 public TypeCode GetTypeCode ()
261 return TypeCode.Int16;
264 bool IConvertible.ToBoolean (IFormatProvider provider)
266 return System.Convert.ToBoolean (m_value);
269 byte IConvertible.ToByte (IFormatProvider provider)
271 return System.Convert.ToByte (m_value);
274 char IConvertible.ToChar (IFormatProvider provider)
276 return System.Convert.ToChar (m_value);
279 DateTime IConvertible.ToDateTime (IFormatProvider provider)
281 return System.Convert.ToDateTime (m_value);
284 decimal IConvertible.ToDecimal (IFormatProvider provider)
286 return System.Convert.ToDecimal (m_value);
289 double IConvertible.ToDouble (IFormatProvider provider)
291 return System.Convert.ToDouble (m_value);
294 short IConvertible.ToInt16 (IFormatProvider provider)
296 return System.Convert.ToInt16 (m_value);
299 int IConvertible.ToInt32 (IFormatProvider provider)
301 return System.Convert.ToInt32 (m_value);
304 long IConvertible.ToInt64 (IFormatProvider provider)
306 return System.Convert.ToInt64 (m_value);
309 sbyte IConvertible.ToSByte (IFormatProvider provider)
311 return System.Convert.ToSByte (m_value);
314 float IConvertible.ToSingle (IFormatProvider provider)
316 return System.Convert.ToSingle (m_value);
319 object IConvertible.ToType (Type targetType, IFormatProvider provider)
321 if (targetType == null)
322 throw new ArgumentNullException ("targetType");
323 return System.Convert.ToType (m_value, targetType, provider, false);
326 ushort IConvertible.ToUInt16 (IFormatProvider provider)
328 return System.Convert.ToUInt16 (m_value);
331 uint IConvertible.ToUInt32 (IFormatProvider provider)
333 return System.Convert.ToUInt32 (m_value);
336 ulong IConvertible.ToUInt64 (IFormatProvider provider)
338 return System.Convert.ToUInt64 (m_value);