-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
type_int.go
155 lines (129 loc) · 2.82 KB
/
type_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
146
147
148
149
150
151
152
153
154
155
package parco
import (
"encoding/binary"
"math"
)
const (
is64BitsArch = (^uint(0) >> 63) == 1
)
var (
uintBitSize = If[int](is64BitsArch, 8, 4)
)
func CompileUInt(u uint, box []byte, order binary.ByteOrder) (err error) {
if is64BitsArch {
return CompileUInt64(uint64(u), box, order)
}
return CompileUInt32(uint32(u), box, order)
}
func ParseUInt(data []byte, order binary.ByteOrder) (uint, error) {
if is64BitsArch {
u64, err := ParseUInt64(data, order)
if err != nil {
return 0, err
}
return uint(u64), err
}
u32, err := ParseUInt32(data, order)
if err != nil {
return 0, err
}
return uint(u32), err
}
func UInt(order binary.ByteOrder) Type[uint] {
return NewFixedType[uint](
uintBitSize,
func(data []byte) (uint, error) {
return ParseUInt(data, order)
},
func(value uint, box []byte) (err error) {
return CompileUInt(value, box, order)
},
)
}
func UIntLE() Type[uint] {
return UInt(binary.LittleEndian)
}
func UIntBE() Type[uint] {
return UInt(binary.BigEndian)
}
func UIntHeader(order binary.ByteOrder) Type[int] {
return NewFixedType[int](
uintBitSize,
func(data []byte) (int, error) {
n, err := ParseUInt(data, order)
m := int(n)
return m, err
},
func(value int, box []byte) (err error) {
if value < 0 {
return ErrOverflow
}
return CompileUInt(uint(value), box, order)
},
)
}
func UIntLEHeader() Type[int] {
return UIntHeader(binary.LittleEndian)
}
func UIntBEHeader() Type[int] {
return UIntHeader(binary.BigEndian)
}
func CompileInt(i int, box []byte, order binary.ByteOrder) (err error) {
if is64BitsArch {
return CompileInt64(int64(i), box, order)
}
return CompileInt32(int32(i), box, order)
}
func ParseInt(data []byte, order binary.ByteOrder) (int, error) {
if is64BitsArch {
i64, err := ParseInt64(data, order)
if err != nil {
return 0, err
}
return int(i64), err
}
i32, err := ParseInt32(data, order)
if err != nil {
return 0, err
}
return int(i32), err
}
func Int(order binary.ByteOrder) Type[int] {
return NewFixedType[int](
uintBitSize,
func(data []byte) (int, error) {
return ParseInt(data, order)
},
func(value int, box []byte) (err error) {
return CompileInt(value, box, order)
},
)
}
func IntLE() Type[int] {
return Int(binary.LittleEndian)
}
func IntBE() Type[int] {
return Int(binary.BigEndian)
}
func IntHeader(order binary.ByteOrder) Type[int] {
return NewFixedType[int](
uintBitSize,
func(data []byte) (int, error) {
n, err := ParseInt(data, order)
m := int(n)
return m, err
},
func(value int, box []byte) (err error) {
if value > math.MaxInt || value < math.MinInt {
return ErrOverflow
}
return CompileInt(value, box, order)
},
)
}
func IntLEHeader() Type[int] {
return IntHeader(binary.LittleEndian)
}
func IntBEHeader() Type[int] {
return IntHeader(binary.BigEndian)
}