1
2
3
4
5
6
7
8 package vector
9
10 func (p *StringVector) realloc(length, capacity int) (b []string) {
11 if capacity < initialSize {
12 capacity = initialSize
13 }
14 if capacity < length {
15 capacity = length
16 }
17 b = make(StringVector, length, capacity)
18 copy(b, *p)
19 *p = b
20 return
21 }
22
23
24 func (p *StringVector) Expand(i, n int) {
25 a := *p
26
27
28 len0 := len(a)
29 len1 := len0 + n
30 if len1 <= cap(a) {
31
32 a = a[0:len1]
33 } else {
34
35 capb := cap(a) * 2
36 if capb < len1 {
37
38 capb = len1
39 }
40
41 a = p.realloc(len1, capb)
42 }
43
44
45 for j := len0 - 1; j >= i; j-- {
46 a[j+n] = a[j]
47 }
48
49 *p = a
50 }
51
52
53 func (p *StringVector) Extend(n int) { p.Expand(len(*p), n) }
54
55
56
57
58
59
60
61 func (p *StringVector) Resize(length, capacity int) *StringVector {
62 a := *p
63
64 if length > cap(a) || capacity > cap(a) {
65
66 a = p.realloc(length, capacity)
67 } else if length < len(a) {
68
69 for i := range a[length:] {
70 var zero string
71 a[length+i] = zero
72 }
73 }
74
75 *p = a[0:length]
76 return p
77 }
78
79
80
81 func (p *StringVector) Len() int { return len(*p) }
82
83
84
85
86 func (p *StringVector) Cap() int { return cap(*p) }
87
88
89 func (p *StringVector) At(i int) string { return (*p)[i] }
90
91
92 func (p *StringVector) Set(i int, x string) { (*p)[i] = x }
93
94
95 func (p *StringVector) Last() string { return (*p)[len(*p)-1] }
96
97
98 func (p *StringVector) Copy() StringVector {
99 arr := make(StringVector, len(*p))
100 copy(arr, *p)
101 return arr
102 }
103
104
105
106 func (p *StringVector) Insert(i int, x string) {
107 p.Expand(i, 1)
108 (*p)[i] = x
109 }
110
111
112
113 func (p *StringVector) Delete(i int) {
114 a := *p
115 n := len(a)
116
117 copy(a[i:n-1], a[i+1:n])
118 var zero string
119 a[n-1] = zero
120 *p = a[0 : n-1]
121 }
122
123
124
125 func (p *StringVector) InsertVector(i int, x *StringVector) {
126 b := *x
127
128 p.Expand(i, len(b))
129 copy((*p)[i:i+len(b)], b)
130 }
131
132
133 func (p *StringVector) Cut(i, j int) {
134 a := *p
135 n := len(a)
136 m := n - (j - i)
137
138 copy(a[i:m], a[j:n])
139 for k := m; k < n; k++ {
140 var zero string
141 a[k] = zero
142 }
143
144 *p = a[0:m]
145 }
146
147
148
149 func (p *StringVector) Slice(i, j int) *StringVector {
150 var s StringVector
151 s.realloc(j-i, 0)
152 copy(s, (*p)[i:j])
153 return &s
154 }
155
156
157
158
159 func (p *StringVector) Push(x string) { p.Insert(len(*p), x) }
160
161
162 func (p *StringVector) Pop() string {
163 a := *p
164
165 i := len(a) - 1
166 x := a[i]
167 var zero string
168 a[i] = zero
169 *p = a[0:i]
170 return x
171 }
172
173
174 func (p *StringVector) AppendVector(x *StringVector) { p.InsertVector(len(*p), x) }
175
176
177 func (p *StringVector) Swap(i, j int) {
178 a := *p
179 a[i], a[j] = a[j], a[i]
180 }
181
182
183
184 func (p *StringVector) Do(f func(elem string)) {
185 for _, e := range *p {
186 f(e)
187 }
188 }