/
sum.go
106 lines (77 loc) · 1.78 KB
/
sum.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package goe
import (
"github.com/EscanBE/go-ienumerable/goe/reflection"
"math"
"math/big"
)
func (src *enumerable[T]) SumInt32() int32 {
src.assertSrcNonNil()
if len(src.data) < 1 {
return 0
}
var sum int64 = 0
for _, d := range src.data {
i32 := reflection.UnboxAnyAsInt32(d)
sum = add64p(sum, int64(i32))
}
if math.MinInt32 > sum || sum > math.MaxInt32 {
panic("overflow")
}
return int32(sum)
}
func (src *enumerable[T]) SumInt() int {
src.assertSrcNonNil()
if len(src.data) < 1 {
return 0
}
sum := new(big.Int)
for _, d := range src.data {
i64 := int64(reflection.UnboxAnyAsInt(d))
sum = sum.Add(sum, big.NewInt(i64))
}
if !sum.IsInt64() {
panic("overflow")
}
vSum := sum.Int64()
//if math.MinInt > vSum || vSum > math.MaxInt {
// panic("overflow")
//}
return int(vSum)
}
func (src *enumerable[T]) SumInt64() int64 {
src.assertSrcNonNil()
if len(src.data) < 1 {
return 0
}
sum := new(big.Int)
for _, d := range src.data {
i64 := reflection.UnboxAnyAsInt64(d)
sum = sum.Add(sum, big.NewInt(i64))
}
if !sum.IsInt64() {
panic("overflow")
}
return sum.Int64()
}
func (src *enumerable[T]) SumFloat64() float64 {
src.assertSrcNonNil()
if len(src.data) < 1 {
return 0.0
}
sumBiElements := new(big.Int)
sumBfElements := new(big.Float)
for _, d := range src.data {
ri, rf, dt := reflection.UnboxAnyAsInt64OrFloat64(d)
if dt == reflection.UF64_TYPE_INT64 {
sumBiElements = sumBiElements.Add(sumBiElements, big.NewInt(ri))
} else if dt == reflection.UF64_TYPE_FLOAT64 {
sumBfElements = sumBfElements.Add(sumBfElements, big.NewFloat(rf))
}
}
sumBf := sumBfElements.Add(sumBfElements, new(big.Float).SetInt(sumBiElements))
sum, _ := sumBf.Float64()
if math.IsInf(sum, sumBf.Sign()) {
panic("overflow")
}
return sum
}