2 // System.Data.SqlTypes.SqlDouble
5 // Tim Coleman <tim@timcoleman.com>
6 // Ville Palo <vi64pa@koti.soon.fi>
8 // (C) Copyright 2002 Tim Coleman
12 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 using System.Xml.Schema;
37 using System.Globalization;
38 using System.Xml.Serialization;
40 namespace System.Data.SqlTypes
43 [SerializableAttribute]
44 [XmlSchemaProvider ("GetXsdType")]
46 public struct SqlDouble : INullable, IComparable
56 public static readonly SqlDouble MaxValue = new SqlDouble (1.7976931348623157E+308);
57 public static readonly SqlDouble MinValue = new SqlDouble (-1.7976931348623157E+308);
58 public static readonly SqlDouble Null;
59 public static readonly SqlDouble Zero = new SqlDouble (0);
65 public SqlDouble (double value)
76 get { return !notNull; }
82 throw new SqlNullValueException ();
92 public static SqlDouble Add (SqlDouble x, SqlDouble y)
97 public int CompareTo (object value)
101 if (!(value is SqlDouble))
102 throw new ArgumentException (Locale.GetText ("Value is not a System.Data.SqlTypes.SqlDouble"));
104 return CompareTo ((SqlDouble) value);
110 int CompareTo (SqlDouble value)
115 return this.value.CompareTo (value.Value);
118 public static SqlDouble Divide (SqlDouble x, SqlDouble y)
123 public override bool Equals (object value)
125 if (!(value is SqlDouble))
128 return ((SqlDouble)value).IsNull;
129 else if (((SqlDouble)value).IsNull)
132 return (bool) (this == (SqlDouble)value);
135 public static SqlBoolean Equals (SqlDouble x, SqlDouble y)
140 public override int GetHashCode ()
142 long LongValue = (long)value;
143 return (int)(LongValue ^ (LongValue >> 32));
146 public static SqlBoolean GreaterThan (SqlDouble x, SqlDouble y)
151 public static SqlBoolean GreaterThanOrEqual (SqlDouble x, SqlDouble y)
156 public static SqlBoolean LessThan (SqlDouble x, SqlDouble y)
161 public static SqlBoolean LessThanOrEqual (SqlDouble x, SqlDouble y)
166 public static SqlDouble Multiply (SqlDouble x, SqlDouble y)
171 public static SqlBoolean NotEquals (SqlDouble x, SqlDouble y)
176 public static SqlDouble Parse (string s)
178 return new SqlDouble (Double.Parse (s));
181 public static SqlDouble Subtract (SqlDouble x, SqlDouble y)
186 public SqlBoolean ToSqlBoolean ()
188 return ((SqlBoolean) this);
191 public SqlByte ToSqlByte ()
193 return ((SqlByte) this);
196 public SqlDecimal ToSqlDecimal ()
198 return ((SqlDecimal) this);
201 public SqlInt16 ToSqlInt16 ()
203 return ((SqlInt16) this);
206 public SqlInt32 ToSqlInt32 ()
208 return ((SqlInt32) this);
211 public SqlInt64 ToSqlInt64 ()
213 return ((SqlInt64) this);
216 public SqlMoney ToSqlMoney ()
218 return ((SqlMoney) this);
221 public SqlSingle ToSqlSingle ()
223 return ((SqlSingle) this);
226 public SqlString ToSqlString ()
228 return ((SqlString) this);
231 public override string ToString ()
236 return value.ToString ();
239 public static SqlDouble operator + (SqlDouble x, SqlDouble y)
242 d = x.Value + y.Value;
244 if (Double.IsInfinity (d))
245 throw new OverflowException ();
247 return new SqlDouble (d);
250 public static SqlDouble operator / (SqlDouble x, SqlDouble y)
252 double d = x.Value / y.Value;
254 if (Double.IsInfinity (d)) {
256 throw new DivideByZeroException ();
259 return new SqlDouble (d);
262 public static SqlBoolean operator == (SqlDouble x, SqlDouble y)
264 if (x.IsNull || y.IsNull)
265 return SqlBoolean.Null;
267 return new SqlBoolean (x.Value == y.Value);
270 public static SqlBoolean operator > (SqlDouble x, SqlDouble y)
272 if (x.IsNull || y.IsNull)
273 return SqlBoolean.Null;
275 return new SqlBoolean (x.Value > y.Value);
278 public static SqlBoolean operator >= (SqlDouble x, SqlDouble y)
280 if (x.IsNull || y.IsNull)
281 return SqlBoolean.Null;
283 return new SqlBoolean (x.Value >= y.Value);
286 public static SqlBoolean operator != (SqlDouble x, SqlDouble y)
288 if (x.IsNull || y.IsNull)
289 return SqlBoolean.Null;
291 return new SqlBoolean (!(x.Value == y.Value));
294 public static SqlBoolean operator < (SqlDouble x, SqlDouble y)
296 if (x.IsNull || y.IsNull)
297 return SqlBoolean.Null;
299 return new SqlBoolean (x.Value < y.Value);
302 public static SqlBoolean operator <= (SqlDouble x, SqlDouble y)
304 if (x.IsNull || y.IsNull)
305 return SqlBoolean.Null;
307 return new SqlBoolean (x.Value <= y.Value);
310 public static SqlDouble operator * (SqlDouble x, SqlDouble y)
312 double d = x.Value * y.Value;
314 if (Double.IsInfinity (d))
315 throw new OverflowException ();
317 return new SqlDouble (d);
321 public static SqlDouble operator - (SqlDouble x, SqlDouble y)
323 double d = x.Value - y.Value;
325 if (Double.IsInfinity (d))
326 throw new OverflowException ();
328 return new SqlDouble (d);
331 public static SqlDouble operator - (SqlDouble x)
333 return new SqlDouble (-(x.Value));
336 public static explicit operator SqlDouble (SqlBoolean x)
341 return new SqlDouble ((double)x.ByteValue);
344 public static explicit operator double (SqlDouble x)
349 public static explicit operator SqlDouble (SqlString x)
352 return SqlDouble.Parse (x.Value);
356 public static implicit operator SqlDouble (double x)
358 return new SqlDouble (x);
361 public static implicit operator SqlDouble (SqlByte x)
366 return new SqlDouble ((double) x.Value);
369 public static implicit operator SqlDouble (SqlDecimal x)
374 return new SqlDouble (x.ToDouble ());
377 public static implicit operator SqlDouble (SqlInt16 x)
382 return new SqlDouble ((double) x.Value);
385 public static implicit operator SqlDouble (SqlInt32 x)
390 return new SqlDouble ((double) x.Value);
393 public static implicit operator SqlDouble (SqlInt64 x)
398 return new SqlDouble ((double) x.Value);
401 public static implicit operator SqlDouble (SqlMoney x)
406 return new SqlDouble ((double) x.Value);
409 public static implicit operator SqlDouble (SqlSingle x)
414 return new SqlDouble ((double) x.Value);
418 public static XmlQualifiedName GetXsdType (XmlSchemaSet schemaSet)
420 if (schemaSet != null && schemaSet.Count == 0) {
421 XmlSchema xs = new XmlSchema ();
422 XmlSchemaComplexType ct = new XmlSchemaComplexType ();
427 return new XmlQualifiedName ("double", "http://www.w3.org/2001/XMLSchema");
430 XmlSchema IXmlSerializable.GetSchema ()
435 void IXmlSerializable.ReadXml (XmlReader reader)
440 switch (reader.ReadState) {
441 case ReadState.EndOfFile:
442 case ReadState.Error:
443 case ReadState.Closed:
447 // Skip XML declaration and prolog
448 // or do I need to validate for the <SqlInt32> tag?
449 reader.MoveToContent ();
454 if (reader.NodeType == XmlNodeType.EndElement)
457 if (reader.Value.Length > 0) {
458 if (String.Compare ("Null", reader.Value) == 0) {
459 // means a null reference/invalid value
463 // FIXME: do we need to handle the FormatException?
464 this.value = Double.Parse (reader.Value);
469 void IXmlSerializable.WriteXml (XmlWriter writer)
471 writer.WriteString (this.ToString ());