source: trunk/ab5.0/ablib/src/com/decimal.ab

Last change on this file was 709, checked in by イグトランス (egtra), 15 years ago

最新のコンパイラに通るように修正。参照クラスのセマンティクスに合うように修正(Setter系プロパティの削除など)。

File size: 8.5 KB
RevLine 
[211]1' com/decimal.ab
2
3#require <com/variant.ab>
[231]4#require <com/currency.ab>
[211]5
[267]6Namespace ActiveBasic
7Namespace COM
8
[211]9Class Decimal
[709]10 Implements System.ICloneable, System.IEquatable<Decimal>', System.IComparable<Decimal>
[211]11Public
[709]12
[231]13 Sub Decimal()
14 End Sub
15
16 Sub Decimal(d As Decimal)
[478]17 dec = d.dec
[355]18 End Sub
19
20 Sub Decimal(ByRef d As DECIMAL)
[478]21 dec = d
[211]22 End Sub
23
[231]24 Sub Decimal(lo As Long, mid As Long, hi As Long, isNegative As Boolean, scale As Byte)
25 If scale > 28 Then
[709]26 Throw New System.ArgumentOutOfRangeException("scale - Decimal constructor")
[231]27 End If
28 Dim sign As Byte
29 If isNegative Then
30 sign = DECIMAL_NEG
31 Else
32 sign = 0
33 End If
34 dec.signscale = MAKEWORD(sign, scale) 'ToDo:どっちが上位だか検証すること
35 dec.Hi32 = hi
36 dec.Lo64 = MAKEQWORD(mid, lo)
37 End Sub
38
39 Sub Decimal(x As Long)
[709]40 Windows.ThrowIfFailed(VarDecFromI4(x, dec))
[231]41 End Sub
42
43 Sub Decimal(x As DWord)
[709]44 Windows.ThrowIfFailed(VarDecFromUI4(x, dec))
[231]45 End Sub
46
47 Sub Decimal(x As Int64)
[709]48 Windows.ThrowIfFailed(VarDecFromI8(x, dec))
[231]49 End Sub
50
51 Sub Decimal(x As QWord)
[709]52 Windows.ThrowIfFailed(VarDecFromUI8(x, dec))
[231]53 End Sub
54
55 Sub Decimal(x As Single)
[709]56 Windows.ThrowIfFailed(VarDecFromR4(x, dec))
[231]57 End Sub
58
59 Sub Decimal(x As Double)
[709]60 Windows.ThrowIfFailed(VarDecFromR8(x, dec))
[231]61 End Sub
[709]62
[231]63 Const Function Operator() As Variant
64 Return New Variant(This)
65 End Function
66/*
67 Static Function Operator(x As SByte) As Decimal
68 Dim d = New Decimal
69 VarDecFromI1(x, d.dec)
70 Return d
71 End Function
72
73 Static Function Operator(x As Byte) As Decimal
74 Dim d = New Decimal
75 VarDecFromUI1(x, d.dec)
76 Return d
77 End Function
78
79 Static Function Operator(x As Integer) As Decimal
80 Dim d = New Decimal
81 VarDecFromI2(x, d.dec)
82 Return d
83 End Function
84
85 Static Function Operator(x As Word) As Decimal
86 Dim d = New Decimal
87 VarDecFromUI2(x, d.dec)
88 Return d
89 End Function
90
91 Static Function Operator(x As Long) As Decimal
92 Dim d = New Decimal
93 VarDecFromI4(x, d.dec)
94 Return d
95 End Function
96
97 Static Function Operator(x As DWord) As Decimal
98 Dim d = New Decimal
99 VarDecFromUI4(x, d.dec)
100 Return d
101 End Function
102
103 Static Function Operator(x As Int64) As Decimal
104 Dim d = New Decimal
105 VarDecFromI8(x, d.dec)
106 Return d
107 End Function
108
109 Static Function Operator(x As QWord) As Decimal
110 Dim d = New Decimal
111 VarDecFromUI8(x, d.dec)
112 Return d
113 End Function
114
115 Static Function Operator(x As DECIMAL) As Decimal
116 Return New Decimal(X)
117 End Function
118
119 Const Function Operator As() As SByte
120 Dim x As SByte
121 VarI1FromDec(dec, x)
122 Return x
123 End Function
124
125 Const Function Operator As() As Byte
126 Dim x As Byte
127 VarUI1FromDec(dec, x)
128 Return x
129 End Function
130
131 Const Function Operator As() As Integer
132 Dim x As Integer
133 VarI2FromDec(dec, x)
134 Return x
135 End Function
136
137 Const Function Operator As() As Word
138 Dim x As Word
139 VarUI2FromDec(dec, x)
140 Return x
141 End Function
142
143 Const Function Operator As() As Long
144 Dim x As Long
145 VarI4FromDec(dec, x)
146 Return x
147 End Function
148
149 Const Function Operator As() As DWord
150 Dim x As DWord
151 VarUI4FromDec(dec, x)
152 Return x
153 End Function
154
155 Const Function Operator As() As Int64
156 Dim x As Int64
157 VarI8FromDec(dec, x)
158 Return x
159 End Function
160
161 Const Function Operator As() As QWord
162 Dim x As QWord
163 VarUI8FromDec(dec, x)
164 Return x
165 End Function
166
167 Const Function Operator As() As Single
168 Dim x As Single
169 VarR4FromDec(dec, x)
170 Return x
171 End Function
172
173 Const Function Operator As() As Double
174 Dim x As Double
175 VarR8FromDec(dec, x)
176 Return x
177 End Function
178
179 Const Function Operator As() As Currency
180 Dim x As Currency
181 VarCyFromDec(dec, x)
182 Return x
183 End Function
184
185 Const Function Operator As() As DECIMAL
186 Return dec
187 End Function
188
189 Static Function Operator As(x As Single) As Decimal
190 Dim d = New Decimal
191 VarDecFromR4(x, d.dec)
192 Return d
193 End Function
194
195 Static Function Operator As(x As Double) As Decimal
196 Dim d = New Decimal
197 VarDecFromR8(x, d.dec)
198 Return d
199 End Function
200*/
[709]201
[211]202 Const Function Operator +() As Decimal
203 Return New Decimal(dec)
204 End Function
[709]205
[211]206 Const Function Operator -() As Decimal
207 Dim ret = New Decimal
[709]208 Windows.ThrowIfFailed(VarDecNeg(This.dec, ret.dec))
[211]209 Return ret
210 End Function
211
212 Const Function Operator *(y As Decimal) As Decimal
213 Dim ret = New Decimal
[709]214 Windows.ThrowIfFailed(VarDecMul(This.dec, y.dec, ret.dec))
[211]215 Return ret
216 End Function
217
218 Const Function Operator /(y As Decimal) As Decimal
219 Dim ret = New Decimal
[709]220 Windows.ThrowIfFailed(VarDecDiv(This.dec, y.dec, ret.dec))
[211]221 Return ret
222 End Function
223
224 Const Function Operator +(y As Decimal) As Decimal
225 Dim ret = New Decimal
[709]226 Windows.ThrowIfFailed(VarDecAdd(This.dec, y.dec, ret.dec))
[211]227 Return ret
228 End Function
229
230 Const Function Operator -(y As Decimal) As Decimal
231 Dim ret = New Decimal
[709]232 Windows.ThrowIfFailed(VarDecSub(This.dec, y.dec, ret.dec))
[211]233 Return ret
234 End Function
235
[709]236 ' ThrowIfFailedしていないことに注意
[211]237 Static Function Compare(x As Decimal, y As Decimal) As HRESULT
[709]238 Compare = VarDecCmp(x.dec, y.dec)
[211]239 End Function
240
[709]241 ' ThrowIfFailedしていないことに注意
[211]242 Static Function Compare(x As Decimal, y As Double) As HRESULT
[335]243 Return VarDecCmpR8(x.dec, y)
[211]244 End Function
245
246 Static Function Compare(x As Double, y As Decimal) As HRESULT
[335]247 Dim ret = VarDecCmpR8(y.dec, x)
[211]248 Select Case ret
249 Case VARCMP_LT
250 Return VARCMP_GT
251 Case VARCMP_GT
252 Return VARCMP_LT
253 Case Else
254 Return ret
255 End Select
256 End Function
257
258 Const Function Operator ==(y As Decimal) As Boolean
259 Dim c = Compare(This, y)
260 Return c = VARCMP_EQ
261 End Function
262
263 Const Function Operator ==(y As Double) As Boolean
264 Dim c = Compare(This, y)
265 Return c = VARCMP_EQ
266 End Function
267
268 Const Function Operator <>(y As Decimal) As Boolean
269 Dim c = Compare(This, y)
270 Return c <> VARCMP_EQ
271 End Function
272
273 Const Function Operator <>(y As Double) As Boolean
274 Dim c = Compare(This, y)
275 Return c <> VARCMP_EQ
276 End Function
277
278 Const Function Operator <(y As Decimal) As Boolean
279 Dim c = Compare(This, y)
280 Return c = VARCMP_LT
281 End Function
282
283 Const Function Operator <(y As Double) As Boolean
284 Dim c = Compare(This, y)
285 Return c = VARCMP_LT
286 End Function
[478]287
[211]288 Const Function Operator >(y As Decimal) As Boolean
289 Dim c = Compare(This, y)
290 Return c = VARCMP_GT
291 End Function
292
293 Const Function Operator >(y As Double) As Boolean
294 Dim c = Compare(This, y)
295 Return c = VARCMP_GT
296 End Function
[478]297
[211]298 Const Function Operator <=(y As Decimal) As Boolean
299 Dim c = Compare(This, y)
[335]300 Return c = VARCMP_LT Or c = VARCMP_EQ
[211]301 End Function
302
303 Const Function Operator <=(y As Double) As Boolean
304 Dim c = Compare(This, y)
[335]305 Return c = VARCMP_LT Or c = VARCMP_EQ
[211]306 End Function
307
308 Const Function Operator >=(y As Decimal) As Boolean
309 Dim c = Compare(This, y)
[335]310 Return c = VARCMP_GT Or c = VARCMP_EQ
[211]311 End Function
312
313 Const Function Operator >=(y As Double) As Boolean
314 Dim c = Compare(This, y)
[335]315 Return c = VARCMP_GT Or c = VARCMP_EQ
[211]316 End Function
317
318 Const Function Abs() As Decimal
319 Abs = New Decimal
[709]320 Windows.ThrowIfFailed(VarDecAbs(This.dec, Abs.dec))
[211]321 End Function
322
323 Const Function Fix() As Decimal
324 Fix = New Decimal
[709]325 Windows.ThrowIfFailed(VarDecFix(This.dec, Fix.dec))
[211]326 End Function
327
328 Const Function Int() As Decimal
329 Int = New Decimal
[709]330 Windows.ThrowIfFailed(VarDecInt(This.dec, Int.dec))
[211]331 End Function
332
333 Const Function Round(c = 0 As Long) As Decimal
334 Round = New Decimal
[709]335 Windows.ThrowIfFailed(VarDecRound(This.dec, c, Round.dec))
[211]336 End Function
337
338 Const Function Dec() As DECIMAL
339 Return dec
340 End Function
341
342 Const Function ToVariant() As Variant
[355]343 Return New Variant(This)
[211]344 End Function
345
[709]346 Function ToBString() As BString
347 ToBString = New BString
348 Dim bs As BSTR
349 VarBstrFromDec(dec, LOCALE_USER_DEFAULT, LOCALE_USE_NLS, bs)
350 ToBString.Attach(bs)
351 End Function
352
[211]353 Override Function ToString() As String
[709]354 Using bstr = ToBString()
[478]355 ToString = bstr.ToString
[709]356 End Using
[211]357 End Function
358
359 Override Function GetHashCode() As Long
360 Dim p = VarPtr(dec) As *DWord
361 Return (p[0] Xor p[1] Xor p[2] Xor p[3]) As Long
362 End Function
363
364 Function Equals(y As Decimal) As Boolean
365 Dim c = Compare(This, y)
366 Return c = VARCMP_EQ
367 End Function
[709]368
369 Override Function Equals(y As Object) As Boolean
370 If This.GetType().Equals(y.GetType()) Then
371 Equals = Equals(y As Decimal)
372 End If
373 End Function
374
375 Function Clone() As Decimal
376 Clone = New Decimal(This)
377 End Function
378
[211]379Private
380 dec As DECIMAL
[231]381End Class
[267]382
383End Namespace 'COM
384End Namespace 'ActiveBasic
Note: See TracBrowser for help on using the repository browser.