-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuint8Slices.go
158 lines (140 loc) · 3.84 KB
/
uint8Slices.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
156
157
158
// Code generated by yasupGen; DO NOT EDIT.
package yasup
import (
crypto "crypto/rand"
"math/big"
"math/rand"
)
var zeroValueUint8 uint8
//Uint8Insert will append elem at the position i. Might return ErrIndexOutOfBounds.
func Uint8Insert(sl *[]uint8, elem uint8, i int) error {
if i < 0 || i > len(*sl) {
return ErrIndexOutOfBounds
}
*sl = append(*sl, elem)
copy((*sl)[i+1:], (*sl)[i:])
(*sl)[i] = elem
return nil
}
//Uint8Delete delete the element at the position i. Might return ErrIndexOutOfBounds.
func Uint8Delete(sl *[]uint8, i int) error {
if i < 0 || i >= len(*sl) {
return ErrIndexOutOfBounds
}
*sl = append((*sl)[:i], (*sl)[i+1:]...)
return nil
}
//Uint8Contains will return true if elem is present in the slice and false otherwise.
func Uint8Contains(sl []uint8, elem uint8) bool {
for i := range sl {
if sl[i] == elem {
return true
}
}
return false
}
//Uint8Index returns the index of the first instance of elem, or -1 if elem is not present.
func Uint8Index(sl []uint8, elem uint8) int {
for i := range sl {
if sl[i] == elem {
return i
}
}
return -1
}
//Uint8LastIndex returns the index of the last instance of elem in the slice, or -1 if elem is not present.
func Uint8LastIndex(sl []uint8, elem uint8) int {
for i := len(sl) - 1; i >= 0; i-- {
if sl[i] == elem {
return i
}
}
return -1
}
//Uint8Count will return an int representing the amount of times that elem is present in the slice.
func Uint8Count(sl []uint8, elem uint8) int {
var n int
for i := range sl {
if sl[i] == elem {
n++
}
}
return n
}
//Uint8Push is equivalent to Uint8Insert with index len(*sl).
func Uint8Push(sl *[]uint8, elem uint8) {
Uint8Insert(sl, elem, len(*sl))
}
//Uint8FrontPush is equivalent to Uint8Insert with index 0.
func Uint8FrontPush(sl *[]uint8, elem uint8) {
Uint8Insert(sl, elem, 0)
}
//Uint8Pop is equivalent to getting and removing the last element of the slice. Might return ErrEmptySlice.
func Uint8Pop(sl *[]uint8) (uint8, error) {
if len(*sl) == 0 {
return zeroValueUint8, ErrEmptySlice
}
last := len(*sl) - 1
ret := (*sl)[last]
Uint8Delete(sl, last)
return ret, nil
}
//Uint8Pop is equivalent to getting and removing the first element of the slice. Might return ErrEmptySlice.
func Uint8FrontPop(sl *[]uint8) (uint8, error) {
if len(*sl) == 0 {
return zeroValueUint8, ErrEmptySlice
}
ret := (*sl)[0]
Uint8Delete(sl, 0)
return ret, nil
}
//Uint8Replace modifies the slice with the first n non-overlapping instances of old replaced by new. If n equals -1, there is no limit on the number of replacements.
func Uint8Replace(sl []uint8, old, new uint8, n int) (replacements int) {
left := n
for i := range sl {
if left == 0 {
break // no replacements left
}
if sl[i] == old {
sl[i] = new
left--
}
}
return n - left
}
//Uint8ReplaceAll is equivalent to Uint8Replace with n = -1.
func Uint8ReplaceAll(sl []uint8, old, new uint8) (replacements int) {
return Uint8Replace(sl, old, new, -1)
}
//Uint8Equals compares two uint8 slices. Returns true if their elements are equal.
func Uint8Equals(a, b []uint8) bool {
if len(a) != len(b) {
return false
}
for i := range a {
if a[i] != b[i] {
return false
}
}
return true
}
//Uint8FastShuffle will randomly swap the uint8 elements of a slice using math/rand (fast but not cryptographycally secure).
func Uint8FastShuffle(sp []uint8) {
rand.Shuffle(len(sp), func(i, j int) {
sp[i], sp[j] = sp[j], sp[i]
})
}
//Uint8SecureShuffle will randomly swap the uint8 elements of a slice using crypto/rand (resource intensive but cryptographically secure).
func Uint8SecureShuffle(sp []uint8) error {
var i int64
size := int64(len(sp)) - 1
for i = 0; i < size+1; i++ {
bigRandI, err := crypto.Int(crypto.Reader, big.NewInt(size))
if err != nil {
return err
}
randI := bigRandI.Int64()
sp[size-i], sp[randI] = sp[randI], sp[size-i]
}
return nil
}