/
int.go
145 lines (124 loc) · 3 KB
/
int.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// Copyright 2019 Alexey Krivonogov. All rights reserved.
// Use of this source code is governed by a MIT license
// that can be found in the LICENSE file.
package vm
import (
"fmt"
"strconv"
)
// AbsºInt the absolute value of x.
func AbsºInt(x int64) int64 {
if x < 0 {
return -x
}
return x
}
// AssignAddºIntInt adds one integer to another
func AssignAddºIntInt(ptr *int64, value int64) (int64, error) {
*ptr += value
return *ptr, nil
}
// AssignBitAndºIntInt equals int &= int
func AssignBitAndºIntInt(ptr *int64, value int64) (int64, error) {
*ptr &= value
return *ptr, nil
}
// AssignBitOrºIntInt equals int |= int
func AssignBitOrºIntInt(ptr *int64, value int64) (int64, error) {
*ptr |= value
return *ptr, nil
}
// AssignBitXorºIntInt equals int ^= int
func AssignBitXorºIntInt(ptr *int64, value int64) (int64, error) {
*ptr ^= value
return *ptr, nil
}
// AssignDivºIntInt does int /= int
func AssignDivºIntInt(ptr *int64, value int64) (int64, error) {
if value == 0 {
return 0, fmt.Errorf(ErrorText(ErrDivZero))
}
*ptr /= value
return *ptr, nil
}
// AssignModºIntInt equals int %= int
func AssignModºIntInt(ptr *int64, value int64) (int64, error) {
if value == 0 {
return 0, fmt.Errorf(ErrorText(ErrDivZero))
}
*ptr %= value
return *ptr, nil
}
// AssignLShiftºIntInt does int <<= int
func AssignLShiftºIntInt(ptr *int64, value int64) (int64, error) {
if value < 0 {
return 0, fmt.Errorf(ErrorText(ErrShift))
}
*ptr <<= uint64(value)
return *ptr, nil
}
// AssignMulºIntInt equals int *= int
func AssignMulºIntInt(ptr *int64, value int64) (int64, error) {
*ptr *= value
return *ptr, nil
}
// AssignRShiftºIntInt does int >>= int
func AssignRShiftºIntInt(ptr *int64, value int64) (int64, error) {
if value < 0 {
return 0, fmt.Errorf(ErrorText(ErrShift))
}
*ptr >>= uint64(value)
return *ptr, nil
}
// AssignSubºIntInt equals int *= int
func AssignSubºIntInt(ptr *int64, value int64) (int64, error) {
*ptr -= value
return *ptr, nil
}
// boolºInt converts integer value to boolean 0->false, not 0 -> true
func boolºInt(val int64) int64 {
if val != 0 {
return 1
}
return 0
}
// ExpStrºInt adds string and integer in string expression
func ExpStrºInt(left string, right int64) string {
return left + strºInt(right)
}
// floatºInt converts integer value to float
func floatºInt(val int64) float64 {
return float64(val)
}
// IncDecºInt incriment and decriment
func IncDecºInt(ptr *int64, shift int64) (int64, error) {
var post bool
val := *ptr
if (shift & 0x1) == 0 {
post = true
shift /= 2
}
*ptr += shift
if !post {
val += shift
}
return val, nil
}
// MaxºIntInt returns the maximum of two integers
func MaxºIntInt(left, right int64) int64 {
if left < right {
return right
}
return left
}
// MinºIntInt returns the minimum of two integers
func MinºIntInt(left, right int64) int64 {
if left > right {
return right
}
return left
}
// strºInt converts integer value to string
func strºInt(val int64) string {
return strconv.FormatInt(val, 10)
}