github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/stl/containers/stdvec.go (about) 1 // Copyright 2022 Matrix Origin 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package containers 16 17 import ( 18 "fmt" 19 "io" 20 "reflect" 21 "unsafe" 22 23 "github.com/matrixorigin/matrixone/pkg/common/mpool" 24 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common" 25 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/stl" 26 ) 27 28 func NewStdVector[T any](opts ...Options) *StdVector[T] { 29 // vec := &StdVector[T]{ 30 // buf: make([]byte, 0), 31 // slice: make([]T, 0), 32 // } 33 vec := new(StdVector[T]) 34 var capacity int 35 var buf []byte 36 if len(opts) > 0 { 37 opt := opts[0] 38 capacity = opt.Capacity 39 vec.alloc = opt.Allocator 40 if opt.HasData() { 41 buf = opt.Data.StorageBuf() 42 capacity = len(buf) / stl.Sizeof[T]() 43 } 44 } 45 if vec.alloc == nil { 46 vec.alloc = common.DefaultAllocator 47 } 48 // if capacity == 0 { 49 // capacity = 4 50 // } 51 if buf != nil { 52 vec.buf = buf 53 vec.slice = unsafe.Slice((*T)(unsafe.Pointer(&vec.buf[0])), capacity) 54 vec.capacity = capacity 55 } else { 56 vec.tryExpand(capacity) 57 } 58 return vec 59 } 60 61 func (vec *StdVector[T]) tryExpand(capacity int) { 62 if vec.capacity >= capacity { 63 return 64 } 65 newSize := stl.SizeOfMany[T](capacity) 66 vec.capacity = capacity 67 oldn := vec.node 68 if oldn != nil && newSize <= len(oldn) { 69 return 70 } else if oldn == nil { 71 if newSize <= cap(vec.buf) { 72 return 73 } 74 } 75 newn, err := vec.alloc.Alloc(capacity * stl.Sizeof[T]()) 76 if err != nil { 77 panic(err) 78 } 79 buf := newn[:0:len(newn)] 80 buf = append(buf, vec.buf...) 81 vec.buf = buf 82 vec.node = newn 83 if oldn != nil { 84 vec.alloc.Free(oldn) 85 } 86 } 87 88 func (vec *StdVector[T]) Close() { 89 if vec.node != nil { 90 vec.alloc.Free(vec.node) 91 } 92 vec.node = nil 93 vec.slice = nil 94 vec.buf = nil 95 vec.alloc = nil 96 } 97 98 func (vec *StdVector[T]) GetAllocator() *mpool.MPool { return vec.alloc } 99 100 func (vec *StdVector[T]) IsView() bool { return false } 101 func (vec *StdVector[T]) Length() int { return len(vec.slice) } 102 func (vec *StdVector[T]) Capacity() int { return vec.capacity } 103 func (vec *StdVector[T]) Allocated() int { 104 if vec.node != nil { 105 return len(vec.node) 106 } 107 return 0 108 } 109 func (vec *StdVector[T]) Data() []byte { return vec.buf } 110 func (vec *StdVector[T]) Slice() []T { return vec.slice } 111 func (vec *StdVector[T]) SliceWindow(offset, length int) []T { 112 return vec.slice[offset : offset+length] 113 } 114 115 func (vec *StdVector[T]) SlicePtr() (ptr unsafe.Pointer) { 116 return unsafe.Pointer(&vec.buf[0]) 117 } 118 119 func (vec *StdVector[T]) DataWindow(offset, length int) []byte { 120 start := offset * stl.Sizeof[T]() 121 end := start + length*stl.Sizeof[T]() 122 return vec.buf[start:end] 123 } 124 func (vec *StdVector[T]) Desc() string { 125 var v T 126 s := fmt.Sprintf("StdVector<%s>:Len=%d[Rows];Cap=%d[Rows];Allocted:%d[Bytes]", 127 reflect.TypeOf(v).Name(), 128 vec.Length(), 129 vec.Capacity(), 130 vec.Allocated()) 131 return s 132 } 133 func (vec *StdVector[T]) String() string { 134 s := vec.Desc() 135 end := 100 136 if vec.Length() < end { 137 end = vec.Length() 138 } 139 if end == 0 { 140 return s 141 } 142 data := ";Vals=[" 143 for i := 0; i < end; i++ { 144 data = fmt.Sprintf("%s %v", data, vec.Get(i)) 145 } 146 if vec.Length() > end { 147 s = fmt.Sprintf("%s %s...]", s, data) 148 } else { 149 s = fmt.Sprintf("%s %s]", s, data) 150 } 151 return s 152 } 153 154 func (vec *StdVector[T]) Append(v T) { 155 if len(vec.slice) == vec.capacity { 156 var newCap int 157 if vec.capacity < 2 { 158 newCap = 4 159 } else { 160 newCap = vec.capacity * 2 161 } 162 vec.tryExpand(newCap) 163 } 164 vec.buf = append(vec.buf, unsafe.Slice((*byte)(unsafe.Pointer(&v)), int(unsafe.Sizeof(v)))...) 165 size := len(vec.slice) 166 vec.slice = unsafe.Slice((*T)(unsafe.Pointer(&vec.buf[0])), size+1) 167 } 168 169 func (vec *StdVector[T]) Get(i int) (v T) { 170 v = vec.slice[i] 171 return 172 } 173 174 func (vec *StdVector[T]) Update(i int, v T) { 175 vec.slice[i] = v 176 } 177 178 func (vec *StdVector[T]) Delete(i int) (deleted T) { 179 deleted = vec.slice[i] 180 vec.slice = append(vec.slice[:i], vec.slice[i+1:]...) 181 size := len(vec.buf) - stl.Sizeof[T]() 182 vec.buf = vec.buf[:size] 183 return 184 } 185 186 func (vec *StdVector[T]) BatchDelete(rowGen common.RowGen, cnt int) { 187 common.InplaceDeleteRows(vec.slice, rowGen) 188 size := len(vec.buf) - stl.SizeOfMany[T](cnt) 189 vec.slice = unsafe.Slice((*T)(unsafe.Pointer(&vec.buf[0])), len(vec.slice)-cnt) 190 vec.buf = vec.buf[:size] 191 } 192 193 func (vec *StdVector[T]) BatchDeleteUint32s(sels ...uint32) { 194 gen := common.NewRowGenWrapper(sels...) 195 vec.BatchDelete(gen, len(sels)) 196 } 197 198 func (vec *StdVector[T]) BatchDeleteInts(sels ...int) { 199 gen := common.NewRowGenWrapper(sels...) 200 vec.BatchDelete(gen, len(sels)) 201 } 202 203 func (vec *StdVector[T]) AppendMany(vals ...T) { 204 if len(vals) == 0 { 205 return 206 } 207 predictSize := len(vals) + len(vec.slice) 208 if predictSize > vec.capacity { 209 var newCap int 210 if vec.capacity < 2 { 211 newCap = 4 212 } else { 213 newCap = vec.capacity * 2 214 } 215 if newCap < predictSize { 216 newCap = predictSize 217 } 218 vec.tryExpand(newCap) 219 } 220 221 // vec.buf is the pre-allocted memory buffer. Here copy vals into the vec.buf 222 vec.buf = append(vec.buf, unsafe.Slice( 223 (*byte)(unsafe.Pointer(&vals[0])), 224 int(stl.SizeOfMany[T](len(vals))))...) 225 // vec.slice shares the buffer with vec.buf. Here change the slice length 226 vec.slice = unsafe.Slice((*T)(unsafe.Pointer(&vec.buf[0])), predictSize) 227 } 228 229 func (vec *StdVector[T]) Clone(offset, length int, allocator ...*mpool.MPool) stl.Vector[T] { 230 opts := Options{ 231 Capacity: length, 232 } 233 234 if len(allocator) == 0 { 235 opts.Allocator = vec.GetAllocator() 236 } else { 237 opts.Allocator = allocator[0] 238 } 239 cloned := NewStdVector[T](opts) 240 cloned.AppendMany(vec.slice[offset : offset+length]...) 241 return cloned 242 } 243 244 func (vec *StdVector[T]) Reset() { 245 if vec.Length() == 0 { 246 return 247 } 248 vec.slice = vec.slice[:0] 249 vec.buf = vec.buf[:0] 250 } 251 252 func (vec *StdVector[T]) WindowAsBytes(offset, length int) *stl.Bytes { 253 bs := stl.NewFixedTypeBytes[T]() 254 start := offset * stl.Sizeof[T]() 255 end := start + length*stl.Sizeof[T]() 256 bs.Storage = vec.buf[start:end] 257 return bs 258 } 259 260 func (vec *StdVector[T]) Bytes() *stl.Bytes { 261 bs := stl.NewFixedTypeBytes[T]() 262 bs.Storage = vec.buf 263 return bs 264 } 265 266 func (vec *StdVector[T]) ReadBytes(data *stl.Bytes, share bool) { 267 if data == nil { 268 return 269 } 270 if share { 271 vec.readBytesShared(data.StorageBuf()) 272 return 273 } 274 vec.readBytesNotShared(data.StorageBuf()) 275 } 276 277 func (vec *StdVector[T]) readBytesNotShared(bs []byte) { 278 vec.Reset() 279 newSize := len(bs) 280 if newSize == 0 { 281 return 282 } 283 capacity := newSize / stl.Sizeof[T]() 284 vec.tryExpand(capacity) 285 vec.buf = vec.node[:newSize] 286 copy(vec.buf[0:], bs) 287 vec.slice = unsafe.Slice((*T)(unsafe.Pointer(&vec.buf[0])), vec.capacity) 288 } 289 290 func (vec *StdVector[T]) readBytesShared(bs []byte) { 291 if vec.node != nil { 292 vec.alloc.Free(vec.node) 293 vec.node = nil 294 } 295 vec.capacity = 0 296 if len(bs) == 0 { 297 vec.buf = vec.buf[:0] 298 vec.slice = vec.slice[:0] 299 return 300 } 301 vec.buf = bs 302 vec.capacity = len(vec.buf) / stl.Sizeof[T]() 303 vec.slice = unsafe.Slice((*T)(unsafe.Pointer(&vec.buf[0])), vec.capacity) 304 } 305 306 func (vec *StdVector[T]) InitFromSharedBuf(buf []byte) (n int64, err error) { 307 sizeBuf := buf[:stl.Sizeof[uint32]()] 308 size := *(*uint32)(unsafe.Pointer(&sizeBuf[0])) 309 n = int64(stl.Sizeof[uint32]()) 310 if size == 0 { 311 vec.Reset() 312 return 313 } 314 buf = buf[stl.Sizeof[uint32]():] 315 bs := stl.NewFixedTypeBytes[T]() 316 bs.Storage = buf[:size] 317 vec.ReadBytes(bs, true) 318 n += int64(size) 319 return 320 } 321 322 func (vec *StdVector[T]) ReadFrom(r io.Reader) (n int64, err error) { 323 var nr int 324 sizeBuf := make([]byte, stl.Sizeof[uint32]()) 325 if nr, err = r.Read(sizeBuf); err != nil { 326 return 327 } 328 n += int64(nr) 329 size := *(*uint32)(unsafe.Pointer(&sizeBuf[0])) 330 if size == 0 { 331 return 332 } 333 capacity := (int(size) + stl.Sizeof[T]() - 1) / stl.Sizeof[T]() 334 vec.tryExpand(capacity) 335 vec.buf = vec.node[:size] 336 if nr, err = r.Read(vec.buf); err != nil { 337 return 338 } 339 n += int64(nr) 340 vec.slice = unsafe.Slice((*T)(unsafe.Pointer(&vec.buf[0])), capacity) 341 return 342 } 343 344 func (vec *StdVector[T]) WriteTo(w io.Writer) (n int64, err error) { 345 var nr int 346 dataSize := uint32(len(vec.buf)) 347 if nr, err = w.Write(unsafe.Slice((*byte)(unsafe.Pointer(&dataSize)), int(unsafe.Sizeof(dataSize)))); err != nil { 348 return 349 } 350 n += int64(nr) 351 if nr, err = w.Write(vec.buf); err != nil { 352 return 353 } 354 n += int64(nr) 355 return 356 }