Ups, there was a litle bug
[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 using System;
12 using System.Globalization;
13
14 namespace System.Data.SqlTypes
15 {
16         public struct SqlDouble : INullable, IComparable
17         {
18                 #region Fields
19                 double value;
20
21                 private bool notNull;
22
23                 public static readonly SqlDouble MaxValue = new SqlDouble (1.7976931348623157E+308);
24                 public static readonly SqlDouble MinValue = new SqlDouble (-1.7976931348623157E+308);
25                 public static readonly SqlDouble Null;
26                 public static readonly SqlDouble Zero = new SqlDouble (0);
27
28                 #endregion
29
30                 #region Constructors
31
32                 public SqlDouble (double value) 
33                 {
34                         this.value = value;
35                         notNull = true;
36                 }
37
38                 #endregion
39
40                 #region Properties
41
42                 public bool IsNull { 
43                         get { return !notNull; }
44                 }
45
46                 public double Value { 
47                         get { 
48                                 if (this.IsNull) 
49                                         throw new SqlNullValueException ();
50                                 else 
51                                         return value; 
52                         }
53                 }
54
55                 #endregion
56
57                 #region Methods
58
59                 public static SqlDouble Add (SqlDouble x, SqlDouble y)
60                 {
61                         return (x + y);
62                 }
63
64                 public int CompareTo (object value)
65                 {
66                         if (value == null)
67                                 return 1;
68                         else if (!(value is SqlDouble))
69                                 throw new ArgumentException (Locale.GetText ("Value is not a System.Data.SqlTypes.SqlDouble"));
70                         else if (((SqlDouble)value).IsNull)
71                                 return 1;
72                         else
73                                 return this.value.CompareTo (((SqlDouble)value).Value);
74                 }
75
76                 public static SqlDouble Divide (SqlDouble x, SqlDouble y)
77                 {
78                         return (x / y);
79                 }
80
81                 public override bool Equals (object value)
82                 {
83                         if (!(value is SqlDouble))
84                                 return false;
85                         if (this.IsNull && ((SqlDouble)value).IsNull)
86                                 return true;
87                         else if (((SqlDouble)value).IsNull)
88                                 return false;
89                         else
90                                 return (bool) (this == (SqlDouble)value);
91                 }
92
93                 public static SqlBoolean Equals (SqlDouble x, SqlDouble y)
94                 {
95                         return (x == y);
96                 }
97                 public override int GetHashCode ()
98                 {
99                         long LongValue = (long)value;
100                         return (int)(LongValue ^ (LongValue >> 32));
101                         
102                 }
103
104                 public static SqlBoolean GreaterThan (SqlDouble x, SqlDouble y)
105                 {
106                         return (x > y);
107                 }
108
109                 public static SqlBoolean GreaterThanOrEqual (SqlDouble x, SqlDouble y)
110                 {
111                         return (x >= y);
112                 }
113
114                 public static SqlBoolean LessThan (SqlDouble x, SqlDouble y)
115                 {
116                         return (x < y);
117                 }
118
119                 public static SqlBoolean LessThanOrEqual (SqlDouble x, SqlDouble y)
120                 {
121                         return (x <= y);
122                 }
123
124                 public static SqlDouble Multiply (SqlDouble x, SqlDouble y)
125                 {
126                         return (x * y);
127                 }
128
129                 public static SqlBoolean NotEquals (SqlDouble x, SqlDouble y)
130                 {
131                         return (x != y);
132                 }
133
134                 public static SqlDouble Parse (string s)
135                 {
136                         return new SqlDouble (Double.Parse (s));
137                 }
138
139                 public static SqlDouble Subtract (SqlDouble x, SqlDouble y)
140                 {
141                         return (x - y);
142                 }
143
144                 public SqlBoolean ToSqlBoolean ()
145                 {
146                         return ((SqlBoolean)this);      
147                 }
148                 
149                 public SqlByte ToSqlByte ()
150                 {
151                         return ((SqlByte)this); 
152                 }
153
154                 public SqlDecimal ToSqlDecimal ()
155                 {
156                         return ((SqlDecimal)this);      
157                 }
158
159                 public SqlInt16 ToSqlInt16 ()
160                 {
161                         return ((SqlInt16)this);
162                 }
163
164                 public SqlInt32 ToSqlInt32 ()
165                 {
166                         return ((SqlInt32)this);
167                 }
168
169                 public SqlInt64 ToSqlInt64 ()
170                 {
171                         return ((SqlInt64)this);
172                 }
173
174                 public SqlMoney ToSqlMoney ()
175                 {
176                         return ((SqlMoney)this);
177                 }
178
179                 public SqlSingle ToSqlSingle ()
180                 {
181                         return ((SqlSingle)this);
182                 }
183
184                 public SqlString ToSqlString ()
185                 {
186                         return ((SqlString)this);
187                 }
188
189                 public override string ToString ()
190                 {
191                         if (this.IsNull)
192                                 return String.Empty;
193                         else
194                                 return value.ToString ();
195                 }
196
197                 public static SqlDouble operator + (SqlDouble x, SqlDouble y)
198                 {
199                         checked {
200                                 return new SqlDouble (x.Value + y.Value);
201                         }
202                 }
203
204                 public static SqlDouble operator / (SqlDouble x, SqlDouble y)
205                 {
206                         checked {
207                                 return new SqlDouble (x.Value / y.Value);
208                         }
209                 }
210
211                 public static SqlBoolean operator == (SqlDouble x, SqlDouble y)
212                 {
213                         if (x.IsNull || y.IsNull)       
214                                 return SqlBoolean.Null;
215                         else
216                                 return new SqlBoolean (x.Value == y.Value);
217                 }
218
219                 public static SqlBoolean operator > (SqlDouble x, SqlDouble y)
220                 {
221                         if (x.IsNull || y.IsNull) 
222                                 return SqlBoolean.Null;
223                         else
224                                 return new SqlBoolean (x.Value > y.Value);
225                 }
226
227                 public static SqlBoolean operator >= (SqlDouble x, SqlDouble y)
228                 {
229                         if (x.IsNull || y.IsNull) 
230                                 return SqlBoolean.Null;
231                         else
232                                 return new SqlBoolean (x.Value >= y.Value);
233                 }
234
235                 public static SqlBoolean operator != (SqlDouble x, SqlDouble y)
236                 {
237                         if (x.IsNull || y.IsNull) 
238                                 return SqlBoolean.Null;
239                         else
240                                 return new SqlBoolean (!(x.Value == y.Value));
241                 }
242
243                 public static SqlBoolean operator < (SqlDouble x, SqlDouble y)
244                 {
245                         if (x.IsNull || y.IsNull) 
246                                 return SqlBoolean.Null;
247                         else
248                                 return new SqlBoolean (x.Value < y.Value);
249                 }
250
251                 public static SqlBoolean operator <= (SqlDouble x, SqlDouble y)
252                 {
253                         if (x.IsNull || y.IsNull) 
254                                 return SqlBoolean.Null;
255                         else
256                                 return new SqlBoolean (x.Value <= y.Value);
257                 }
258
259                 public static SqlDouble operator * (SqlDouble x, SqlDouble y)
260                 {
261                         checked {
262                                 return new SqlDouble (x.Value * y.Value);
263                         }
264                 }
265
266                 public static SqlDouble operator - (SqlDouble x, SqlDouble y)
267                 {
268                         checked {
269                                 return new SqlDouble (x.Value - y.Value);
270                         }
271                 }
272
273                 public static SqlDouble operator - (SqlDouble n)
274                 {                       
275                         return new SqlDouble (-(n.Value));
276                 }
277
278                 public static explicit operator SqlDouble (SqlBoolean x)
279                 {
280                         if (x.IsNull) 
281                                 return Null;
282                         else
283                                 return new SqlDouble ((double)x.ByteValue);
284                 }
285
286                 public static explicit operator double (SqlDouble x)
287                 {
288                         return x.Value;
289                 }
290
291                 public static explicit operator SqlDouble (SqlString x)
292                 {
293                         checked {
294                                 return SqlDouble.Parse (x.Value);
295                         }
296                 }
297
298                 public static implicit operator SqlDouble (double x)
299                 {
300                         return new SqlDouble (x);
301                 }
302
303                 public static implicit operator SqlDouble (SqlByte x)
304                 {
305                         if (x.IsNull) 
306                                 return Null;
307                         else
308                                 return new SqlDouble ((double)x.Value);
309                 }
310
311                 public static implicit operator SqlDouble (SqlDecimal x)
312                 {
313                         if (x.IsNull) 
314                                 return Null;
315                         else
316                                 return new SqlDouble (x.ToDouble ());
317                 }
318
319                 public static implicit operator SqlDouble (SqlInt16 x)
320                 {
321                         if (x.IsNull) 
322                                 return Null;
323                         else
324                                 return new SqlDouble ((double)x.Value);
325                 }
326
327                 public static implicit operator SqlDouble (SqlInt32 x)
328                 {
329                         if (x.IsNull) 
330                                 return Null;
331                         else
332                                 return new SqlDouble ((double)x.Value);
333                 }
334
335                 public static implicit operator SqlDouble (SqlInt64 x)
336                 {
337                         if (x.IsNull) 
338                                 return Null;
339                         else
340                                 return new SqlDouble ((double)x.Value);
341                 }
342
343                 public static implicit operator SqlDouble (SqlMoney x)
344                 {
345                         if (x.IsNull) 
346                                 return Null;
347                         else
348                                 return new SqlDouble ((double)x.Value);
349                 }
350
351                 public static implicit operator SqlDouble (SqlSingle x)
352                 {
353                         if (x.IsNull) 
354                                 return Null;
355                         else
356                                 return new SqlDouble ((double)x.Value);
357                 }
358
359                 #endregion
360         }
361 }
362