More tests.
[mono.git] / mcs / class / System.Data / System.Data.SqlTypes / SqlDouble.cs
1 //
2 // System.Data.SqlTypes.SqlDouble
3 //
4 // Author:
5 //   Tim Coleman <tim@timcoleman.com>
6 //   Ville Palo <vi64pa@koti.soon.fi>
7 //
8 // (C) Copyright 2002 Tim Coleman
9 //
10
11 //
12 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
13 //
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:
21 // 
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
24 // 
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.
32 //
33
34 using System;
35 using System.Xml;
36 using System.Xml.Schema;
37 using System.Globalization;
38 using System.Xml.Serialization;
39
40 namespace System.Data.SqlTypes
41 {
42 #if NET_2_0
43         [SerializableAttribute]
44         [XmlSchemaProvider ("GetXsdType")]
45 #endif
46         public struct SqlDouble : INullable, IComparable
47 #if NET_2_0
48                                 , IXmlSerializable
49 #endif
50         {
51                 #region Fields
52
53                 private double value;
54                 private bool notNull;
55
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);
60
61                 #endregion
62
63                 #region Constructors
64
65                 public SqlDouble (double value)
66                 {
67                         this.value = value;
68                         notNull = true;
69                 }
70
71                 #endregion
72
73                 #region Properties
74
75                 public bool IsNull {
76                         get { return !notNull; }
77                 }
78
79                 public double Value {
80                         get {
81                                 if (this.IsNull)
82                                         throw new SqlNullValueException ();
83                                 else 
84                                         return value;
85                         }
86                 }
87
88                 #endregion
89
90                 #region Methods
91
92                 public static SqlDouble Add (SqlDouble x, SqlDouble y)
93                 {
94                         return (x + y);
95                 }
96                 
97                 public int CompareTo (object value)
98                 {
99                         if (value == null)
100                                 return 1;
101                         if (!(value is SqlDouble))
102                                 throw new ArgumentException (Locale.GetText ("Value is not a System.Data.SqlTypes.SqlDouble"));
103
104                         return CompareTo ((SqlDouble) value);
105                 }
106
107 #if NET_2_0
108                 public
109 #endif
110                 int CompareTo (SqlDouble value)
111                 {
112                         if (value.IsNull)
113                                 return 1;
114                         else
115                                 return this.value.CompareTo (value.Value);
116                 }
117
118                 public static SqlDouble Divide (SqlDouble x, SqlDouble y)
119                 {
120                         return (x / y);
121                 }
122
123                 public override bool Equals (object value)
124                 {
125                         if (!(value is SqlDouble))
126                                 return false;
127                         if (this.IsNull)
128                                 return ((SqlDouble)value).IsNull;
129                         else if (((SqlDouble)value).IsNull)
130                                 return false;
131                         else
132                                 return (bool) (this == (SqlDouble)value);
133                 }
134
135                 public static SqlBoolean Equals (SqlDouble x, SqlDouble y)
136                 {
137                         return (x == y);
138                 }
139
140                 public override int GetHashCode ()
141                 {
142                         long LongValue = (long)value;
143                         return (int)(LongValue ^ (LongValue >> 32));
144                 }
145
146                 public static SqlBoolean GreaterThan (SqlDouble x, SqlDouble y)
147                 {
148                         return (x > y);
149                 }
150
151                 public static SqlBoolean GreaterThanOrEqual (SqlDouble x, SqlDouble y)
152                 {
153                         return (x >= y);
154                 }
155
156                 public static SqlBoolean LessThan (SqlDouble x, SqlDouble y)
157                 {
158                         return (x < y);
159                 }
160
161                 public static SqlBoolean LessThanOrEqual (SqlDouble x, SqlDouble y)
162                 {
163                         return (x <= y);
164                 }
165
166                 public static SqlDouble Multiply (SqlDouble x, SqlDouble y)
167                 {
168                         return (x * y);
169                 }
170
171                 public static SqlBoolean NotEquals (SqlDouble x, SqlDouble y)
172                 {
173                         return (x != y);
174                 }
175
176                 public static SqlDouble Parse (string s)
177                 {
178                         return new SqlDouble (Double.Parse (s));
179                 }
180
181                 public static SqlDouble Subtract (SqlDouble x, SqlDouble y)
182                 {
183                         return (x - y);
184                 }
185
186                 public SqlBoolean ToSqlBoolean ()
187                 {
188                         return ((SqlBoolean) this);
189                 }
190                 
191                 public SqlByte ToSqlByte ()
192                 {
193                         return ((SqlByte) this);
194                 }
195
196                 public SqlDecimal ToSqlDecimal ()
197                 {
198                         return ((SqlDecimal) this);
199                 }
200
201                 public SqlInt16 ToSqlInt16 ()
202                 {
203                         return ((SqlInt16) this);
204                 }
205
206                 public SqlInt32 ToSqlInt32 ()
207                 {
208                         return ((SqlInt32) this);
209                 }
210
211                 public SqlInt64 ToSqlInt64 ()
212                 {
213                         return ((SqlInt64) this);
214                 }
215
216                 public SqlMoney ToSqlMoney ()
217                 {
218                         return ((SqlMoney) this);
219                 }
220
221                 public SqlSingle ToSqlSingle ()
222                 {
223                         return ((SqlSingle) this);
224                 }
225
226                 public SqlString ToSqlString ()
227                 {
228                         return ((SqlString) this);
229                 }
230
231                 public override string ToString ()
232                 {
233                         if (!notNull)
234                                 return "Null";
235                         else
236                                 return value.ToString ();
237                 }
238
239                 public static SqlDouble operator + (SqlDouble x, SqlDouble y)
240                 {
241                         double d = 0;
242                         d = x.Value + y.Value;
243                         
244                         if (Double.IsInfinity (d))
245                                 throw new OverflowException ();
246
247                         return new SqlDouble (d);
248                 }
249
250                 public static SqlDouble operator / (SqlDouble x, SqlDouble y)
251                 {
252                         double d = x.Value / y.Value;
253
254                         if (Double.IsInfinity (d)) {
255                                 if (y.Value == 0)
256                                         throw new DivideByZeroException ();
257                         }
258                                 
259                         return new SqlDouble (d);
260                 }
261
262                 public static SqlBoolean operator == (SqlDouble x, SqlDouble y)
263                 {
264                         if (x.IsNull || y.IsNull)
265                                 return SqlBoolean.Null;
266                         else
267                                 return new SqlBoolean (x.Value == y.Value);
268                 }
269
270                 public static SqlBoolean operator > (SqlDouble x, SqlDouble y)
271                 {
272                         if (x.IsNull || y.IsNull)
273                                 return SqlBoolean.Null;
274                         else
275                                 return new SqlBoolean (x.Value > y.Value);
276                 }
277
278                 public static SqlBoolean operator >= (SqlDouble x, SqlDouble y)
279                 {
280                         if (x.IsNull || y.IsNull)
281                                 return SqlBoolean.Null;
282                         else
283                                 return new SqlBoolean (x.Value >= y.Value);
284                 }
285
286                 public static SqlBoolean operator != (SqlDouble x, SqlDouble y)
287                 {
288                         if (x.IsNull || y.IsNull)
289                                 return SqlBoolean.Null;
290                         else
291                                 return new SqlBoolean (!(x.Value == y.Value));
292                 }
293
294                 public static SqlBoolean operator < (SqlDouble x, SqlDouble y)
295                 {
296                         if (x.IsNull || y.IsNull)
297                                 return SqlBoolean.Null;
298                         else
299                                 return new SqlBoolean (x.Value < y.Value);
300                 }
301
302                 public static SqlBoolean operator <= (SqlDouble x, SqlDouble y)
303                 {
304                         if (x.IsNull || y.IsNull)
305                                 return SqlBoolean.Null;
306                         else
307                                 return new SqlBoolean (x.Value <= y.Value);
308                 }
309
310                 public static SqlDouble operator * (SqlDouble x, SqlDouble y)
311                 {
312                         double d = x.Value * y.Value;
313                         
314                         if (Double.IsInfinity (d))
315                                 throw new OverflowException ();
316
317                         return new SqlDouble (d);
318
319                 }
320
321                 public static SqlDouble operator - (SqlDouble x, SqlDouble y)
322                 {
323                         double d = x.Value - y.Value;
324                         
325                         if (Double.IsInfinity (d))
326                                 throw new OverflowException ();
327
328                         return new SqlDouble (d);
329                 }
330
331                 public static SqlDouble operator - (SqlDouble x)
332                 {
333                         return new SqlDouble (-(x.Value));
334                 }
335
336                 public static explicit operator SqlDouble (SqlBoolean x)
337                 {
338                         if (x.IsNull)
339                                 return Null;
340                         else
341                                 return new SqlDouble ((double)x.ByteValue);
342                 }
343
344                 public static explicit operator double (SqlDouble x)
345                 {
346                         return x.Value;
347                 }
348
349                 public static explicit operator SqlDouble (SqlString x)
350                 {
351                         checked {
352                                 return SqlDouble.Parse (x.Value);
353                         }
354                 }
355
356                 public static implicit operator SqlDouble (double x)
357                 {
358                         return new SqlDouble (x);
359                 }
360
361                 public static implicit operator SqlDouble (SqlByte x)
362                 {
363                         if (x.IsNull)
364                                 return Null;
365                         else
366                                 return new SqlDouble ((double) x.Value);
367                 }
368
369                 public static implicit operator SqlDouble (SqlDecimal x)
370                 {
371                         if (x.IsNull)
372                                 return Null;
373                         else
374                                 return new SqlDouble (x.ToDouble ());
375                 }
376
377                 public static implicit operator SqlDouble (SqlInt16 x)
378                 {
379                         if (x.IsNull)
380                                 return Null;
381                         else
382                                 return new SqlDouble ((double) x.Value);
383                 }
384
385                 public static implicit operator SqlDouble (SqlInt32 x)
386                 {
387                         if (x.IsNull)
388                                 return Null;
389                         else
390                                 return new SqlDouble ((double) x.Value);
391                 }
392
393                 public static implicit operator SqlDouble (SqlInt64 x)
394                 {
395                         if (x.IsNull)
396                                 return Null;
397                         else
398                                 return new SqlDouble ((double) x.Value);
399                 }
400
401                 public static implicit operator SqlDouble (SqlMoney x)
402                 {
403                         if (x.IsNull)
404                                 return Null;
405                         else
406                                 return new SqlDouble ((double) x.Value);
407                 }
408
409                 public static implicit operator SqlDouble (SqlSingle x)
410                 {
411                         if (x.IsNull)
412                                 return Null;
413                         else
414                                 return new SqlDouble ((double) x.Value);
415                 }
416
417 #if NET_2_0
418                 public static XmlQualifiedName GetXsdType (XmlSchemaSet schemaSet)
419                 {
420                         if (schemaSet != null && schemaSet.Count == 0) {
421                                 XmlSchema xs = new XmlSchema ();
422                                 XmlSchemaComplexType ct = new XmlSchemaComplexType ();
423                                 ct.Name = "double";
424                                 xs.Items.Add (ct);
425                                 schemaSet.Add (xs);
426                         }
427                         return new XmlQualifiedName ("double", "http://www.w3.org/2001/XMLSchema");
428                 }
429
430                 XmlSchema IXmlSerializable.GetSchema ()
431                 {
432                         return null;
433                 }
434                 
435                 void IXmlSerializable.ReadXml (XmlReader reader)
436                 {
437                         if (reader == null)
438                                 return;
439
440                         switch (reader.ReadState) {
441                         case ReadState.EndOfFile:
442                         case ReadState.Error:
443                         case ReadState.Closed:
444                                 return;
445                         }
446
447                         // Skip XML declaration and prolog
448                         // or do I need to validate for the <SqlInt32> tag?
449                         reader.MoveToContent ();
450                         if (reader.EOF)
451                                 return;
452
453                         reader.Read ();
454                         if (reader.NodeType == XmlNodeType.EndElement)
455                                 return;
456
457                         if (reader.Value.Length > 0) {
458                                 if (String.Compare ("Null", reader.Value) == 0) {
459                                         // means a null reference/invalid value
460                                         notNull = false;
461                                         return; 
462                                 }
463                                 // FIXME: do we need to handle the FormatException?
464                                 this.value = Double.Parse (reader.Value);
465                                 this.notNull = true;
466                         }
467                 }
468                 
469                 void IXmlSerializable.WriteXml (XmlWriter writer)
470                 {
471                         writer.WriteString (this.ToString ());
472                 }
473 #endif
474
475                 #endregion
476         }
477 }