github.com/moontrade/nogc@v0.1.7/bytes.go (about) 1 package nogc 2 3 import ( 4 "github.com/moontrade/nogc/hash" 5 "strconv" 6 "unsafe" 7 ) 8 9 // Bytes is a compact single dynamic allocation to be used as an unsafe replacement for string. 10 type Bytes struct { 11 Pointer // Use for unchecked unsafe access 12 } 13 14 func BytesRef(ptr Pointer) *Bytes { 15 return &Bytes{Pointer: ptr} 16 } 17 18 func AllocBytes(size uintptr) Bytes { 19 return newBytesZeroed(size) 20 } 21 22 func BytesOfString(s string) Bytes { 23 str := newBytesZeroed(uintptr(len(s))) 24 str.Pointer.SetString(0, s) 25 str.setLen(len(s)) 26 return str 27 } 28 29 func BytesOf(b []byte) Bytes { 30 str := newBytesZeroed(uintptr(len(b))) 31 str.Pointer.SetBytes(0, b) 32 str.setLen(len(b)) 33 return str 34 } 35 36 func newBytesZeroed(size uintptr) Bytes { 37 p, c := AllocZeroedCap(size + 8) 38 if p == 0 { 39 return Bytes{0} 40 } 41 // Put cap 42 *(*uint32)(unsafe.Pointer(p)) = uint32(c) 43 *(*uint32)(unsafe.Pointer(p + 4)) = 0 44 return Bytes{p + 8} 45 } 46 47 func newBytes(size uintptr) Bytes { 48 p, c := AllocCap(size + 8) 49 if p == 0 { 50 return Bytes{0} 51 } 52 // Put cap 53 *(*uint32)(unsafe.Pointer(p)) = uint32(c) 54 *(*uint32)(unsafe.Pointer(p + 4)) = 0 55 return Bytes{p + 8} 56 } 57 58 //func newBytesZeroed(size uintptr) Bytes { 59 // switch { 60 // case size <= _Max8Size: 61 // p, c := AllocCap(size) 62 // b := Bytes{p + _8HeaderSize} 63 // b.setFlags(_Type8) 64 // b.setCap(int(c)) 65 // return b 66 // case size <= _Max16Size: 67 // p, c := AllocCap(size) 68 // b := Bytes{p + _16HeaderSize} 69 // b.setFlags(_Type16) 70 // b.setCap(int(c)) 71 // return b 72 // default: 73 // p, c := AllocCap(size) 74 // b := Bytes{p + _32HeaderSize} 75 // b.setFlags(_Type32) 76 // b.setCap(int(c)) 77 // return b 78 // } 79 //} 80 //func (b Bytes) setFlags(flags uint8) { 81 // *(*uint8)(unsafe.Pointer(b.Pointer - 1)) = flags 82 //} 83 // Go doesn't support packed structs so below are templates of the packed memory layout. 84 /* 85 type sdsHeader5 struct { 86 len byte 87 cap byte 88 flags byte 89 data struct{} 90 } 91 92 type sdsHeader8 struct { 93 len uint8 94 cap uint8 95 flags byte 96 data struct{} 97 } 98 99 type sdsHeader16 struct { 100 len uint16 101 cap uint16 102 flags byte 103 data struct{} 104 } 105 106 type sdsHeader32 struct { 107 len uint32 108 cap uint32 109 flags byte 110 data struct{} 111 } 112 113 type sdsHeader64 struct { 114 len uint64 115 cap uint64 116 flags byte 117 data struct{} 118 } 119 */ 120 //func (s Bytes) Len() int { 121 // flags := *(*uint8)(unsafe.Pointer(s.Pointer - 1)) 122 // switch flags & _TypeMask { 123 // case _Type8: 124 // return int(*(*uint8)(unsafe.Pointer(s.Pointer - _8HeaderSize))) 125 // case _Type16: 126 // return int(*(*uint16)(unsafe.Pointer(s.Pointer - _16HeaderSize))) 127 // case _Type32: 128 // return int(*(*uint32)(unsafe.Pointer(s.Pointer - _32HeaderSize))) 129 // } 130 // return 0 131 //} 132 //func (s Bytes) setLen(l int) { 133 // flags := *(*uint8)(unsafe.Pointer(s.Pointer - 1)) 134 // switch flags & _TypeMask { 135 // case _Type8: 136 // *(*uint8)(unsafe.Pointer(s.Pointer - _8HeaderSize)) = uint8(l) 137 // case _Type16: 138 // *(*uint16)(unsafe.Pointer(s.Pointer - _16HeaderSize)) = uint16(l) 139 // case _Type32: 140 // *(*uint32)(unsafe.Pointer(s.Pointer - _32HeaderSize)) = uint32(l) 141 // } 142 //} 143 //func (s Bytes) Cap() int { 144 // flags := *(*uint8)(unsafe.Pointer(s.Pointer - 1)) 145 // switch flags & _TypeMask { 146 // case _Type8: 147 // return int(*(*uint8)(unsafe.Pointer(s.Pointer - _8HeaderSize + 1))) 148 // case _Type16: 149 // return int(*(*uint16)(unsafe.Pointer(s.Pointer - _16HeaderSize + 2))) 150 // case _Type32: 151 // return int(*(*uint32)(unsafe.Pointer(s.Pointer - _32HeaderSize + 4))) 152 // } 153 // return 0 154 //} 155 //func (s Bytes) setCap(l int) { 156 // flags := *(*uint8)(unsafe.Pointer(s.Pointer - 1)) 157 // switch flags & _TypeMask { 158 // case _Type8: 159 // *(*uint8)(unsafe.Pointer(s.Pointer - _8HeaderSize + 1)) = uint8(l) 160 // case _Type16: 161 // *(*uint16)(unsafe.Pointer(s.Pointer - _16HeaderSize + 2)) = uint16(l) 162 // case _Type32: 163 // *(*uint32)(unsafe.Pointer(s.Pointer - _32HeaderSize + 4)) = uint32(l) 164 // } 165 //} 166 //func (s Bytes) allocationPointer() Pointer { 167 // flags := *(*uint8)(unsafe.Pointer(s.Pointer - 1)) 168 // switch flags & _TypeMask { 169 // case _Type8: 170 // return s.Pointer - _8HeaderSize 171 // case _Type16: 172 // return s.Pointer - _16HeaderSize 173 // case _Type32: 174 // return s.Pointer - _32HeaderSize 175 // } 176 // return 0 177 //} 178 179 func (b Bytes) Len() int { 180 if b.Pointer == 0 { 181 return 0 182 } 183 return int(*(*uint32)(unsafe.Pointer(b.Pointer - 4))) 184 } 185 func (b Bytes) setLen(l int) { 186 *(*uint32)(unsafe.Pointer(b.Pointer - 4)) = uint32(l) 187 } 188 func (b Bytes) Cap() int { 189 return int(*(*uint32)(unsafe.Pointer(b.Pointer - 8))) 190 } 191 func (b Bytes) setCap(l int) { 192 *(*uint32)(unsafe.Pointer(b.Pointer - 8)) = uint32(l) 193 } 194 func (s Bytes) allocationPointer() Pointer { 195 return s.Pointer - 8 196 } 197 198 func (s *Bytes) Free() { 199 if s == nil || s.Pointer == 0 { 200 return 201 } 202 Free(s.allocationPointer()) 203 s.Pointer = 0 204 } 205 206 func (s *Bytes) CString() unsafe.Pointer { 207 l := s.Len() 208 if l == 0 { 209 return nil 210 } 211 s.EnsureCap(l + 1) 212 // Ensure it's NULL terminated 213 *(*byte)(s.Pointer.Add(l).Unsafe()) = 0 214 return s.Unsafe() 215 } 216 217 func (s Bytes) flags() uint8 { 218 return *(*uint8)(unsafe.Pointer(s.Pointer - 1)) 219 } 220 221 // Reset zeroes out the entire allocation and sets the length back to 0 222 func (s *Bytes) Reset() { 223 Zero(s.Unsafe(), uintptr(s.Cap())) 224 s.setLen(0) 225 } 226 227 // Zero zeroes out the entire allocation. 228 func (s Bytes) Zero() { 229 Zero(s.Unsafe(), uintptr(s.Cap())) 230 } 231 232 //goland:noinspection GoVetUnsafePointer 233 func (s *Bytes) Equals(o Bytes) bool { 234 l := s.Len() 235 return l == o.Len() && (*s == o || Equals( 236 s.Unsafe(), 237 o.Unsafe(), uintptr(l))) 238 } 239 240 func (s *Bytes) IsNil() bool { 241 return s == nil || s.Pointer == 0 242 } 243 244 func (s Bytes) IsEmpty() bool { 245 return s.Pointer == 0 || s.Len() == 0 246 } 247 248 func (s *Bytes) CheckBounds(offset int) bool { 249 return uintptr(s.Pointer) == 0 || s.Len() < offset 250 } 251 252 func (s *Bytes) String() string { 253 l := s.Len() 254 if l == 0 { 255 return "" 256 } 257 return s.Pointer.String(0, l) 258 } 259 260 func (s *Bytes) Bytes() []byte { 261 l := s.Len() 262 if l == 0 { 263 return nil 264 } 265 return s.Pointer.Bytes(0, l, l) 266 } 267 268 func (s *Bytes) ensureAppend(extra int) int { 269 offset := s.Len() 270 s.EnsureCap(offset + extra) 271 s.setLen(offset + extra) 272 return offset 273 } 274 275 // EnsureLen ensures the length is at least neededLen in size 276 // If not, EnsureCap(neededLen) is called and the length set to neededLen. 277 func (s *Bytes) EnsureLen(neededLen int) { 278 l := s.Len() 279 if l > neededLen { 280 return 281 } 282 s.EnsureCap(neededLen) 283 s.setLen(neededLen) 284 } 285 286 // EnsureCap ensures the capacity is at least neededCap in size 287 //goland:noinspection GoVetUnsafePointer 288 func (s *Bytes) EnsureCap(neededCap int) { 289 cp := s.Cap() 290 if cp >= neededCap { 291 return 292 } 293 newCap := neededCap - cp 294 addr := Realloc(s.allocationPointer(), uintptr(newCap)) 295 if addr == 0 { 296 panic(ErrOutOfMemory) 297 } 298 *s = Bytes{addr} 299 } 300 301 // Clone creates a copy of this instance of Bytes 302 func (s *Bytes) Clone() Bytes { 303 l := s.Len() 304 c := AllocBytes(uintptr(l)) 305 Copy(c.Unsafe(), s.Pointer.Unsafe(), uintptr(l)) 306 c.setLen(l) 307 return c 308 } 309 310 //goland:noinspection GoVetUnsafePointer 311 func (s *Bytes) Append(value Bytes) { 312 if value.Pointer == 0 { 313 return 314 } 315 l := s.Len() 316 vl := value.Len() 317 s.EnsureCap(l + vl) 318 Move(unsafe.Pointer(uintptr(int(s.Pointer)+l)), value.Unsafe(), uintptr(vl)) 319 s.setLen(l + vl) 320 } 321 322 //goland:noinspection GoVetUnsafePointer 323 func (s *Bytes) AppendBytes(value []byte) { 324 if len(value) == 0 { 325 return 326 } 327 l := s.Len() 328 s.EnsureCap(l + len(value)) 329 Move(unsafe.Pointer(uintptr(int(s.Pointer)+l)), unsafe.Pointer(&value[0]), uintptr(len(value))) 330 s.setLen(l + len(value)) 331 } 332 333 //goland:noinspection GoVetUnsafePointer 334 func (s *Bytes) AppendString(value string) { 335 if len(value) == 0 { 336 return 337 } 338 l := s.Len() 339 s.EnsureCap(l + len(value)) 340 Move( 341 unsafe.Pointer(uintptr(int(s.Pointer)+l)), 342 unsafe.Pointer(*(*uintptr)(unsafe.Pointer(&value))), 343 uintptr(len(value)), 344 ) 345 s.setLen(l + len(value)) 346 } 347 348 func (s *Bytes) SetLength(length int) { 349 s.EnsureCap(length) 350 s.setLen(length) 351 } 352 353 /////////////////////////////////////////////////////////////////////////////////////////// 354 // Int 355 /////////////////////////////////////////////////////////////////////////////////////////// 356 357 func (s *Bytes) Int(offset int) int { 358 s.EnsureLen(offset + int(unsafe.Sizeof(int(0)))) 359 return s.Pointer.Int(offset) 360 } 361 362 func (s *Bytes) SetInt(offset int, value int) { 363 s.EnsureLen(offset + int(unsafe.Sizeof(int(0)))) 364 s.Pointer.SetInt(offset, value) 365 } 366 367 //goland:noinspection GoVetUnsafePointer 368 func (s *Bytes) AppendInt(value int) { 369 s.Pointer.SetInt(s.ensureAppend(int(unsafe.Sizeof(int(0)))), value) 370 } 371 372 func (s *Bytes) AppendIntString(value int) { 373 s.appendInt(21, int64(value), 10) 374 } 375 376 func (s *Bytes) appendInt(maxLength int, value int64, base int) { 377 l := s.Len() 378 s.EnsureCap(l + maxLength) 379 s.setLen(l + len(strconv.AppendInt(s.Pointer.Bytes(l, maxLength, maxLength), value, base))) 380 } 381 382 /////////////////////////////////////////////////////////////////////////////////////////// 383 // Uint 384 /////////////////////////////////////////////////////////////////////////////////////////// 385 386 func (s *Bytes) Uint(offset int) int { 387 s.EnsureLen(offset + int(unsafe.Sizeof(uint(0)))) 388 return s.Pointer.Int(offset) 389 } 390 391 func (s *Bytes) SetUint(offset int, value uint) { 392 s.EnsureLen(offset + int(unsafe.Sizeof(uint(0)))) 393 s.Pointer.SetUint(offset, value) 394 } 395 396 //goland:noinspection GoVetUnsafePointer 397 func (s *Bytes) AppendUint(value uint) { 398 s.Pointer.SetUint(s.ensureAppend(int(unsafe.Sizeof(uint(0)))), value) 399 } 400 401 func (s *Bytes) AppendUintString(value uint) { 402 s.appendUint(20, uint64(value), 10) 403 } 404 405 func (s *Bytes) appendUint(maxLength int, value uint64, base int) { 406 l := s.Len() 407 s.EnsureCap(l + maxLength) 408 s.setLen(l + len(strconv.AppendUint(s.Pointer.Bytes(l, maxLength, maxLength), value, base))) 409 } 410 411 /////////////////////////////////////////////////////////////////////////////////////////// 412 // Pointer 413 /////////////////////////////////////////////////////////////////////////////////////////// 414 415 func (s *Bytes) PointerAt(offset int) Pointer { 416 s.EnsureLen(offset + 8) 417 return s.Pointer.Pointer(offset) 418 } 419 420 func (s *Bytes) SetPointer(offset int, value Pointer) { 421 s.EnsureLen(offset + int(unsafe.Sizeof(uintptr(0)))) 422 s.Pointer.SetPointer(offset, value) 423 } 424 425 func (s *Bytes) AppendPointer(value Pointer) { 426 s.Pointer.SetPointer(s.ensureAppend(int(unsafe.Sizeof(Pointer(0)))), value) 427 } 428 429 /////////////////////////////////////////////////////////////////////////////////////////// 430 // uintptr 431 /////////////////////////////////////////////////////////////////////////////////////////// 432 433 func (s *Bytes) Uintptr(offset int) uintptr { 434 s.EnsureLen(offset + int(unsafe.Sizeof(uintptr(0)))) 435 return s.Pointer.Uintptr(offset) 436 } 437 438 func (s *Bytes) SetUintptr(offset int, value uintptr) { 439 s.EnsureLen(offset + int(unsafe.Sizeof(uintptr(0)))) 440 s.Pointer.SetUintptr(offset, value) 441 } 442 443 func (s *Bytes) AppendUintptr(value uintptr) { 444 s.Pointer.SetUintptr(s.ensureAppend(int(unsafe.Sizeof(uintptr(0)))), value) 445 } 446 447 /////////////////////////////////////////////////////////////////////////////////////////// 448 // Int8 449 /////////////////////////////////////////////////////////////////////////////////////////// 450 451 func (s *Bytes) Int8(offset int) int8 { 452 s.EnsureLen(offset + 1) 453 return s.Pointer.Int8(offset) 454 } 455 456 func (s *Bytes) SetInt8(offset int, value int8) { 457 s.EnsureLen(offset + 1) 458 s.Pointer.SetInt8(offset, value) 459 } 460 461 func (s *Bytes) AppendInt8(value int8) { 462 s.Pointer.SetInt8(s.ensureAppend(1), value) 463 } 464 465 func (s *Bytes) AppendInt8String(value int8) { 466 s.appendInt(4, int64(value), 10) 467 } 468 469 /////////////////////////////////////////////////////////////////////////////////////////// 470 // Uint8 471 /////////////////////////////////////////////////////////////////////////////////////////// 472 473 func (s *Bytes) Uint8(offset int) uint8 { 474 s.EnsureLen(offset + 1) 475 return s.Pointer.Uint8(offset) 476 } 477 478 // SetUint8 is safe version. Will grow allocation if needed. 479 func (s *Bytes) SetUint8(offset int, value uint8) { 480 s.EnsureLen(offset + 1) 481 s.Pointer.SetUint8(offset, value) 482 } 483 484 func (s *Bytes) AppendUint8(value uint8) { 485 s.Pointer.SetUint8(s.ensureAppend(1), value) 486 } 487 488 func (s *Bytes) AppendUint8String(value uint8) { 489 s.appendUint(3, uint64(value), 10) 490 } 491 492 /////////////////////////////////////////////////////////////////////////////////////////// 493 // Byte 494 /////////////////////////////////////////////////////////////////////////////////////////// 495 496 func (s *Bytes) Byte(offset int) byte { 497 s.EnsureLen(offset + 1) 498 return s.Pointer.Byte(offset) 499 } 500 501 func (s *Bytes) SetByte(offset int, value byte) { 502 s.EnsureLen(offset + 1) 503 s.Pointer.SetByte(offset, value) 504 } 505 506 func (s *Bytes) AppendByte(value byte) { 507 s.Pointer.SetByte(s.ensureAppend(1), value) 508 } 509 510 func (s *Bytes) AppendByteString(value byte) { 511 s.appendInt(3, int64(value), 10) 512 } 513 514 /////////////////////////////////////////////////////////////////////////////////////////// 515 // Int16 Native Endian 516 /////////////////////////////////////////////////////////////////////////////////////////// 517 518 func (s *Bytes) Int16(offset int) int16 { 519 s.EnsureLen(offset + 2) 520 return s.Pointer.Int16(offset) 521 } 522 523 func (s *Bytes) SetInt16(offset int, value int16) { 524 s.EnsureLen(offset + 2) 525 s.Pointer.SetInt16(offset, value) 526 } 527 528 func (s *Bytes) AppendInt16(value int16) { 529 s.Pointer.SetInt16(s.ensureAppend(2), value) 530 } 531 532 func (s *Bytes) AppendInt16String(value int16) { 533 s.appendInt(6, int64(value), 10) 534 } 535 536 /////////////////////////////////////////////////////////////////////////////////////////// 537 // Int16 Little Endian 538 /////////////////////////////////////////////////////////////////////////////////////////// 539 540 func (s *Bytes) Int16LE(offset int) int16 { 541 s.EnsureLen(offset + 2) 542 return s.Pointer.Int16LE(offset) 543 } 544 545 func (s *Bytes) SetInt16LE(offset int, value int16) { 546 s.EnsureLen(offset + 2) 547 s.Pointer.SetInt16LE(offset, value) 548 } 549 550 func (s *Bytes) AppendInt16LE(value int16) { 551 s.Pointer.SetInt16LE(s.ensureAppend(2), value) 552 } 553 554 /////////////////////////////////////////////////////////////////////////////////////////// 555 // Int16 Little Endian 556 /////////////////////////////////////////////////////////////////////////////////////////// 557 558 func (s *Bytes) Int16BE(offset int) int16 { 559 s.EnsureLen(offset + 2) 560 return s.Pointer.Int16BE(offset) 561 } 562 563 func (s *Bytes) SetInt16BE(offset int, value int16) { 564 s.EnsureLen(offset + 2) 565 s.Pointer.SetInt16BE(offset, value) 566 } 567 568 func (s *Bytes) AppendInt16BE(value int16) { 569 s.Pointer.SetInt16BE(s.ensureAppend(2), value) 570 } 571 572 /////////////////////////////////////////////////////////////////////////////////////////// 573 // Uint16 Native Endian 574 /////////////////////////////////////////////////////////////////////////////////////////// 575 576 func (s *Bytes) Uint16(offset int) uint16 { 577 s.EnsureLen(offset + 2) 578 return s.Pointer.Uint16(offset) 579 } 580 581 func (s *Bytes) SetUint16(offset int, value uint16) { 582 s.EnsureLen(offset + 2) 583 s.Pointer.SetUint16(offset, value) 584 } 585 586 func (s *Bytes) AppendUint16(value uint16) { 587 s.Pointer.SetUint16(s.ensureAppend(2), value) 588 } 589 590 func (s *Bytes) AppendUint16String(value uint16) { 591 s.appendUint(5, uint64(value), 10) 592 } 593 594 /////////////////////////////////////////////////////////////////////////////////////////// 595 // Uint16 Little Endian 596 /////////////////////////////////////////////////////////////////////////////////////////// 597 598 func (s *Bytes) Uint16LE(offset int) uint16 { 599 s.EnsureLen(offset + 2) 600 return s.Pointer.Uint16LE(offset) 601 } 602 603 func (s *Bytes) SetUint16LE(offset int, value uint16) { 604 s.EnsureLen(offset + 2) 605 s.Pointer.SetUint16LE(offset, value) 606 } 607 608 func (s *Bytes) AppendUint16LE(value uint16) { 609 s.Pointer.SetUint16LE(s.ensureAppend(2), value) 610 } 611 612 /////////////////////////////////////////////////////////////////////////////////////////// 613 // Uint16 Big Endian 614 /////////////////////////////////////////////////////////////////////////////////////////// 615 616 func (s *Bytes) Uint16BE(offset int) uint16 { 617 s.EnsureLen(offset + 2) 618 return s.Pointer.Uint16BE(offset) 619 } 620 621 func (s *Bytes) SetUint16BE(offset int, value uint16) { 622 s.EnsureLen(offset + 2) 623 s.Pointer.SetUint16BE(offset, value) 624 } 625 626 func (s *Bytes) AppendUint16BE(value uint16) { 627 s.Pointer.SetUint16BE(s.ensureAppend(2), value) 628 } 629 630 /////////////////////////////////////////////////////////////////////////////////////////// 631 // Int32 Native Endian 632 /////////////////////////////////////////////////////////////////////////////////////////// 633 634 func (s *Bytes) Int32(offset int) int32 { 635 s.EnsureLen(offset + 4) 636 return s.Pointer.Int32(offset) 637 } 638 639 func (s *Bytes) SetInt32(offset int, value int32) { 640 s.EnsureLen(offset + 4) 641 s.Pointer.SetInt32(offset, value) 642 } 643 644 func (s *Bytes) AppendInt32(value int32) { 645 s.Pointer.SetInt32(s.ensureAppend(4), value) 646 } 647 648 func (s *Bytes) AppendInt32String(value int32) { 649 s.appendInt(11, int64(value), 10) 650 } 651 652 /////////////////////////////////////////////////////////////////////////////////////////// 653 // Int32 Little Endian 654 /////////////////////////////////////////////////////////////////////////////////////////// 655 656 func (s *Bytes) Int32LE(offset int) int32 { 657 s.EnsureLen(offset + 4) 658 return s.Pointer.Int32LE(offset) 659 } 660 661 func (s *Bytes) SetInt32LE(offset int, value int32) { 662 s.EnsureLen(offset + 4) 663 s.Pointer.SetInt32LE(offset, value) 664 } 665 666 func (s *Bytes) AppendInt32LE(value int32) { 667 s.Pointer.SetInt32LE(s.ensureAppend(4), value) 668 } 669 670 /////////////////////////////////////////////////////////////////////////////////////////// 671 // Int32 Little Endian 672 /////////////////////////////////////////////////////////////////////////////////////////// 673 674 func (s *Bytes) Int32BE(offset int) int32 { 675 s.EnsureLen(offset + 4) 676 return s.Pointer.Int32BE(offset) 677 } 678 679 func (s *Bytes) SetInt32BE(offset int, value int32) { 680 s.EnsureLen(offset + 4) 681 s.Pointer.SetInt32BE(offset, value) 682 } 683 684 func (s *Bytes) AppendInt32BE(value int32) { 685 s.Pointer.SetInt32BE(s.ensureAppend(4), value) 686 } 687 688 /////////////////////////////////////////////////////////////////////////////////////////// 689 // Uint32 Native Endian 690 /////////////////////////////////////////////////////////////////////////////////////////// 691 692 func (s *Bytes) Uint32(offset int) uint32 { 693 s.EnsureLen(offset + 4) 694 return s.Pointer.Uint32(offset) 695 } 696 697 func (s *Bytes) SetUint32(offset int, value uint32) { 698 s.EnsureLen(offset + 4) 699 s.Pointer.SetUint32(offset, value) 700 } 701 702 func (s *Bytes) AppendUint32(value uint32) { 703 s.Pointer.SetUint32(s.ensureAppend(4), value) 704 } 705 706 func (s *Bytes) AppendUint32String(value uint32) { 707 s.appendUint(10, uint64(value), 10) 708 } 709 710 /////////////////////////////////////////////////////////////////////////////////////////// 711 // Uint32 Little Endian 712 /////////////////////////////////////////////////////////////////////////////////////////// 713 714 func (s *Bytes) Uint32LE(offset int) uint32 { 715 s.EnsureLen(offset + 4) 716 return s.Pointer.Uint32LE(offset) 717 } 718 719 func (s *Bytes) SetUint32LE(offset int, value uint32) { 720 s.EnsureLen(offset + 4) 721 s.Pointer.SetUint32LE(offset, value) 722 } 723 724 func (s *Bytes) AppendUint32LE(value uint32) { 725 s.Pointer.SetUint32LE(s.ensureAppend(4), value) 726 } 727 728 /////////////////////////////////////////////////////////////////////////////////////////// 729 // Uint32 Big Endian 730 /////////////////////////////////////////////////////////////////////////////////////////// 731 732 func (s *Bytes) Uint32BE(offset int) uint32 { 733 s.EnsureLen(offset + 4) 734 return s.Pointer.Uint32BE(offset) 735 } 736 737 func (s *Bytes) SetUint32BE(offset int, value uint32) { 738 s.EnsureLen(offset + 4) 739 s.Pointer.SetUint32BE(offset, value) 740 } 741 742 func (s *Bytes) AppendUint32BE(value uint32) { 743 s.Pointer.SetUint32BE(s.ensureAppend(4), value) 744 } 745 746 /////////////////////////////////////////////////////////////////////////////////////////// 747 // Int64 Native Endian 748 /////////////////////////////////////////////////////////////////////////////////////////// 749 750 func (s *Bytes) Int64(offset int) int64 { 751 s.EnsureLen(offset + 8) 752 return s.Pointer.Int64(offset) 753 } 754 755 func (s *Bytes) SetInt64(offset int, value int64) { 756 s.EnsureLen(offset + 8) 757 s.Pointer.SetInt64(offset, value) 758 } 759 760 func (s *Bytes) AppendInt64(value int64) { 761 s.Pointer.SetInt64(s.ensureAppend(8), value) 762 } 763 764 func (s *Bytes) AppendInt64String(value int64) { 765 s.appendInt(21, value, 10) 766 } 767 768 /////////////////////////////////////////////////////////////////////////////////////////// 769 // Int64 Little Endian 770 /////////////////////////////////////////////////////////////////////////////////////////// 771 772 func (s *Bytes) Int64LE(offset int) int64 { 773 s.EnsureLen(offset + 8) 774 return s.Pointer.Int64LE(offset) 775 } 776 777 func (s *Bytes) SetInt64LE(offset int, value int64) { 778 s.EnsureLen(offset + 8) 779 s.Pointer.SetInt64LE(offset, value) 780 } 781 782 func (s *Bytes) AppendInt64LE(value int64) { 783 s.Pointer.SetInt64LE(s.ensureAppend(8), value) 784 } 785 786 /////////////////////////////////////////////////////////////////////////////////////////// 787 // Int64 Big Endian 788 /////////////////////////////////////////////////////////////////////////////////////////// 789 790 func (s *Bytes) Int64BE(offset int) int64 { 791 s.EnsureLen(offset + 8) 792 return s.Pointer.Int64BE(offset) 793 } 794 795 func (s *Bytes) SetInt64BE(offset int, value int64) { 796 s.EnsureLen(offset + 8) 797 s.Pointer.SetInt64BE(offset, value) 798 } 799 800 func (s *Bytes) AppendInt64BE(value int64) { 801 s.Pointer.SetInt64BE(s.ensureAppend(8), value) 802 } 803 804 /////////////////////////////////////////////////////////////////////////////////////////// 805 // Uint64 Native Endian 806 /////////////////////////////////////////////////////////////////////////////////////////// 807 808 func (s *Bytes) Uint64(offset int) uint64 { 809 s.EnsureLen(offset + 8) 810 return s.Pointer.Uint64(offset) 811 } 812 813 func (s *Bytes) SetUint64(offset int, value uint64) { 814 s.EnsureLen(offset + 8) 815 s.Pointer.SetUint64(offset, value) 816 } 817 818 func (s *Bytes) AppendUint64(value uint64) { 819 s.Pointer.SetUint64(s.ensureAppend(8), value) 820 } 821 822 func (s *Bytes) AppendUint64String(value uint64) { 823 s.appendUint(20, value, 10) 824 } 825 826 /////////////////////////////////////////////////////////////////////////////////////////// 827 // Uint64 Little Endian 828 /////////////////////////////////////////////////////////////////////////////////////////// 829 830 func (s *Bytes) Uint64LE(offset int) uint64 { 831 s.EnsureLen(offset + 8) 832 return s.Pointer.Uint64LE(offset) 833 } 834 835 func (s *Bytes) SetUint64LE(offset int, value uint64) { 836 s.EnsureLen(offset + 8) 837 s.Pointer.SetUint64LE(offset, value) 838 } 839 840 func (s *Bytes) AppendUint64LE(value uint64) { 841 s.Pointer.SetUint64LE(s.ensureAppend(8), value) 842 } 843 844 /////////////////////////////////////////////////////////////////////////////////////////// 845 // Uint64 Big Endian 846 /////////////////////////////////////////////////////////////////////////////////////////// 847 848 func (s *Bytes) Uint64BE(offset int) uint64 { 849 s.EnsureLen(offset + 8) 850 return s.Pointer.Uint64BE(offset) 851 } 852 853 func (s *Bytes) SetUint64BE(offset int, value uint64) { 854 s.EnsureLen(offset + 8) 855 s.Pointer.SetUint64BE(offset, value) 856 } 857 858 func (s *Bytes) AppendUint64BE(value uint64) { 859 s.Pointer.SetUint64BE(s.ensureAppend(8), value) 860 } 861 862 /////////////////////////////////////////////////////////////////////////////////////////// 863 // Float32 Native Endian 864 /////////////////////////////////////////////////////////////////////////////////////////// 865 866 func (s *Bytes) Float32(offset int) float32 { 867 s.EnsureLen(offset + 4) 868 return s.Pointer.Float32(offset) 869 } 870 871 func (s *Bytes) SetFloat32(offset int, value float32) { 872 s.EnsureLen(offset + 4) 873 s.Pointer.SetFloat32(offset, value) 874 } 875 876 func (s *Bytes) AppendFloat32(value float32) { 877 s.Pointer.SetFloat32(s.ensureAppend(4), value) 878 } 879 880 func (s *Bytes) AppendFloat32String(value float32) { 881 l := s.Len() 882 s.EnsureCap(20) 883 s.setLen(l + len(strconv.AppendFloat(s.Pointer.Bytes(l, 20, 20), float64(value), 'g', -1, 32))) 884 } 885 886 /////////////////////////////////////////////////////////////////////////////////////////// 887 // Float32 Little Endian 888 /////////////////////////////////////////////////////////////////////////////////////////// 889 890 func (s *Bytes) Float32LE(offset int) float32 { 891 s.EnsureLen(offset + 4) 892 return s.Pointer.Float32LE(offset) 893 } 894 895 func (s *Bytes) SetFloat32LE(offset int, value float32) { 896 s.EnsureLen(offset + 4) 897 s.Pointer.SetFloat32LE(offset, value) 898 } 899 900 func (s *Bytes) AppendFloat32LE(value float32) { 901 s.Pointer.SetFloat32LE(s.ensureAppend(4), value) 902 } 903 904 /////////////////////////////////////////////////////////////////////////////////////////// 905 // Float32 Big Endian 906 /////////////////////////////////////////////////////////////////////////////////////////// 907 908 func (s *Bytes) Float32BE(offset int) float32 { 909 s.EnsureLen(offset + 4) 910 return s.Pointer.Float32BE(offset) 911 } 912 913 func (s *Bytes) SetFloat32BE(offset int, value float32) { 914 s.EnsureLen(offset + 4) 915 s.Pointer.SetFloat32BE(offset, value) 916 } 917 918 func (s *Bytes) AppendFloat32BE(value float32) { 919 s.Pointer.SetFloat32BE(s.ensureAppend(4), value) 920 } 921 922 /////////////////////////////////////////////////////////////////////////////////////////// 923 // Float64 Native Endian 924 /////////////////////////////////////////////////////////////////////////////////////////// 925 926 func (s *Bytes) Float64(offset int) float64 { 927 s.EnsureLen(offset + 8) 928 return s.Pointer.Float64(offset) 929 } 930 931 func (s *Bytes) SetFloat64(offset int, value float64) { 932 s.EnsureLen(offset + 8) 933 s.Pointer.SetFloat64(offset, value) 934 } 935 936 func (s *Bytes) AppendFloat64(value float64) { 937 s.Pointer.SetFloat64(s.ensureAppend(8), value) 938 } 939 940 func (s *Bytes) AppendFloat64String(value float64) { 941 l := s.Len() 942 s.EnsureCap(20) 943 s.setLen(l + len(strconv.AppendFloat(s.Pointer.Bytes(l, 20, 20), value, 'g', -1, 64))) 944 } 945 946 /////////////////////////////////////////////////////////////////////////////////////////// 947 // Float64 Little Endian 948 /////////////////////////////////////////////////////////////////////////////////////////// 949 950 func (s *Bytes) Float64LE(offset int) float64 { 951 s.EnsureLen(offset + 8) 952 return s.Pointer.Float64LE(offset) 953 } 954 955 func (s *Bytes) SetFloat64LE(offset int, value float64) { 956 s.EnsureLen(offset + 8) 957 s.Pointer.SetFloat64(offset, value) 958 } 959 960 func (s *Bytes) AppendFloat64LE(value float64) { 961 s.Pointer.SetFloat64LE(s.ensureAppend(8), value) 962 } 963 964 /////////////////////////////////////////////////////////////////////////////////////////// 965 // Float64 Big Endian 966 /////////////////////////////////////////////////////////////////////////////////////////// 967 968 func (s *Bytes) Float64BE(offset int) float64 { 969 s.EnsureLen(offset + 8) 970 return s.Pointer.Float64BE(offset) 971 } 972 973 func (s *Bytes) SetFloat64BE(offset int, value float64) { 974 s.EnsureLen(offset + 8) 975 s.Pointer.SetFloat64(offset, value) 976 } 977 978 func (s *Bytes) AppendFloat64BE(value float64) { 979 s.Pointer.SetFloat64BE(s.ensureAppend(8), value) 980 } 981 982 /////////////////////////////////////////////////////////////////////////////////////////// 983 // String 984 /////////////////////////////////////////////////////////////////////////////////////////// 985 986 func (s *Bytes) SetString(offset int, value string) { 987 s.EnsureCap(offset + len(value)) 988 length := offset + len(value) 989 if s.Len() < length { 990 s.setLen(length) 991 } 992 s.Pointer.SetString(offset, value) 993 } 994 995 /////////////////////////////////////////////////////////////////////////////////////////// 996 // Bytes 997 /////////////////////////////////////////////////////////////////////////////////////////// 998 999 func (s *Bytes) Set(offset int, value Bytes) { 1000 l := value.Len() 1001 if value.IsNil() || l == 0 { 1002 return 1003 } 1004 length := offset + int(l) 1005 s.EnsureCap(offset + length) 1006 if s.Len() < length { 1007 s.setLen(length) 1008 } 1009 Copy(s.Unsafe(), value.Unsafe(), uintptr(l)) 1010 } 1011 1012 func (s *Bytes) SetBytes(offset int, value []byte) { 1013 s.EnsureCap(offset + len(value)) 1014 length := offset + len(value) 1015 if s.Len() < length { 1016 s.setLen(length) 1017 } 1018 s.Pointer.SetBytes(offset, value) 1019 } 1020 1021 /////////////////////////////////////////////////////////////////////////////////////////// 1022 // Int24 Native Endian 1023 /////////////////////////////////////////////////////////////////////////////////////////// 1024 1025 func (s *Bytes) Int24(offset int) int32 { 1026 s.EnsureLen(offset + 3) 1027 return s.Pointer.Int24(offset) 1028 } 1029 1030 func (s *Bytes) SetInt24(offset int, value int32) { 1031 s.EnsureLen(offset + 3) 1032 s.Pointer.SetInt24(offset, value) 1033 } 1034 1035 func (s *Bytes) AppendInt24(value int32) { 1036 s.Pointer.SetInt24(s.ensureAppend(3), value) 1037 } 1038 1039 /////////////////////////////////////////////////////////////////////////////////////////// 1040 // Int24 Little Endian 1041 /////////////////////////////////////////////////////////////////////////////////////////// 1042 1043 func (s *Bytes) Int24LE(offset int) int32 { 1044 s.EnsureLen(offset + 3) 1045 return s.Pointer.Int24LE(offset) 1046 } 1047 1048 func (s *Bytes) SetInt24LE(offset int, value int32) { 1049 s.EnsureLen(offset + 3) 1050 s.Pointer.SetInt24LE(offset, value) 1051 } 1052 1053 func (s *Bytes) AppendInt24LE(value int32) { 1054 s.Pointer.SetInt24LE(s.ensureAppend(3), value) 1055 } 1056 1057 /////////////////////////////////////////////////////////////////////////////////////////// 1058 // Int24 Big Endian 1059 /////////////////////////////////////////////////////////////////////////////////////////// 1060 1061 func (s *Bytes) Int24BE(offset int) int32 { 1062 s.EnsureLen(offset + 3) 1063 return s.Pointer.Int24BE(offset) 1064 } 1065 1066 func (s *Bytes) SetInt24BE(offset int, value int32) { 1067 s.EnsureLen(offset + 3) 1068 s.Pointer.SetInt24BE(offset, value) 1069 } 1070 1071 func (s *Bytes) AppendInt24BE(value int32) { 1072 s.Pointer.SetInt24BE(s.ensureAppend(3), value) 1073 } 1074 1075 /////////////////////////////////////////////////////////////////////////////////////////// 1076 // Uint24 Native Endian 1077 /////////////////////////////////////////////////////////////////////////////////////////// 1078 1079 func (s *Bytes) Uint24(offset int) uint32 { 1080 s.EnsureLen(offset + 3) 1081 return s.Pointer.Uint24(offset) 1082 } 1083 1084 func (s *Bytes) SetUint24(offset int, value uint32) { 1085 s.EnsureLen(offset + 3) 1086 s.Pointer.SetUint24(offset, value) 1087 } 1088 1089 func (s *Bytes) AppendUint24(value uint32) { 1090 s.Pointer.SetUint24(s.ensureAppend(3), value) 1091 } 1092 1093 /////////////////////////////////////////////////////////////////////////////////////////// 1094 // Uint24 Little Endian 1095 /////////////////////////////////////////////////////////////////////////////////////////// 1096 1097 func (s *Bytes) Uint24LE(offset int) uint32 { 1098 s.EnsureLen(offset + 3) 1099 return s.Pointer.Uint24LE(offset) 1100 } 1101 1102 func (s *Bytes) SetUint24LE(offset int, value uint32) { 1103 s.EnsureLen(offset + 3) 1104 s.Pointer.SetUint24LE(offset, value) 1105 } 1106 1107 func (s *Bytes) AppendUint24LE(value uint32) { 1108 s.Pointer.SetUint24LE(s.ensureAppend(3), value) 1109 } 1110 1111 /////////////////////////////////////////////////////////////////////////////////////////// 1112 // Uint24 Big Endian 1113 /////////////////////////////////////////////////////////////////////////////////////////// 1114 1115 func (s *Bytes) Uint24BE(offset int) uint32 { 1116 s.EnsureLen(offset + 3) 1117 return s.Pointer.Uint24BE(offset) 1118 } 1119 1120 func (s *Bytes) SetUint24BE(offset int, value uint32) { 1121 s.EnsureLen(offset + 3) 1122 s.Pointer.SetUint24BE(offset, value) 1123 } 1124 1125 func (s *Bytes) AppendUint24BE(value uint32) { 1126 s.Pointer.SetUint24BE(s.ensureAppend(3), value) 1127 } 1128 1129 /////////////////////////////////////////////////////////////////////////////////////////// 1130 // Int40 Native Endian 1131 /////////////////////////////////////////////////////////////////////////////////////////// 1132 1133 func (s *Bytes) Int40(offset int) int64 { 1134 s.EnsureLen(offset + 5) 1135 return s.Pointer.Int40(offset) 1136 } 1137 1138 func (s *Bytes) SetInt40(offset int, value int64) { 1139 s.EnsureLen(offset + 5) 1140 s.Pointer.SetInt40(offset, value) 1141 } 1142 1143 func (s *Bytes) AppendInt40(value int64) { 1144 s.Pointer.SetInt40(s.ensureAppend(5), value) 1145 } 1146 1147 /////////////////////////////////////////////////////////////////////////////////////////// 1148 // Int40 Little Endian 1149 /////////////////////////////////////////////////////////////////////////////////////////// 1150 1151 func (s *Bytes) Int40LE(offset int) int64 { 1152 s.EnsureLen(offset + 5) 1153 return s.Pointer.Int40LE(offset) 1154 } 1155 1156 func (s *Bytes) SetInt40LE(offset int, value int64) { 1157 s.EnsureLen(offset + 5) 1158 s.Pointer.SetInt40LE(offset, value) 1159 } 1160 1161 func (s *Bytes) AppendInt40LE(value int64) { 1162 s.Pointer.SetInt40LE(s.ensureAppend(5), value) 1163 } 1164 1165 /////////////////////////////////////////////////////////////////////////////////////////// 1166 // Int40 Big Endian 1167 /////////////////////////////////////////////////////////////////////////////////////////// 1168 1169 func (s *Bytes) Int40BE(offset int) int64 { 1170 s.EnsureLen(offset + 5) 1171 return s.Pointer.Int40BE(offset) 1172 } 1173 1174 func (s *Bytes) SetInt40BE(offset int, value int64) { 1175 s.EnsureLen(offset + 5) 1176 s.Pointer.SetInt40BE(offset, value) 1177 } 1178 1179 func (s *Bytes) AppendInt40BE(value int64) { 1180 s.Pointer.SetInt40BE(s.ensureAppend(5), value) 1181 } 1182 1183 /////////////////////////////////////////////////////////////////////////////////////////// 1184 // Uint40 Native Endian 1185 /////////////////////////////////////////////////////////////////////////////////////////// 1186 1187 func (s *Bytes) Uint40(offset int) uint64 { 1188 s.EnsureLen(offset + 5) 1189 return s.Pointer.Uint40(offset) 1190 } 1191 1192 func (s *Bytes) SetUint40(offset int, value uint64) { 1193 s.EnsureLen(offset + 5) 1194 s.Pointer.SetUint40(offset, value) 1195 } 1196 1197 func (s *Bytes) AppendUint40(value uint64) { 1198 s.Pointer.SetUint40(s.ensureAppend(5), value) 1199 } 1200 1201 /////////////////////////////////////////////////////////////////////////////////////////// 1202 // Uint40 Little Endian 1203 /////////////////////////////////////////////////////////////////////////////////////////// 1204 1205 func (s *Bytes) Uint40LE(offset int) uint64 { 1206 s.EnsureLen(offset + 5) 1207 return s.Pointer.Uint40LE(offset) 1208 } 1209 1210 func (s *Bytes) SetUint40LE(offset int, value uint64) { 1211 s.EnsureLen(offset + 5) 1212 s.Pointer.SetUint40LE(offset, value) 1213 } 1214 1215 func (s *Bytes) AppendUint40LE(value uint64) { 1216 s.Pointer.SetUint40LE(s.ensureAppend(5), value) 1217 } 1218 1219 /////////////////////////////////////////////////////////////////////////////////////////// 1220 // Uint40 Big Endian 1221 /////////////////////////////////////////////////////////////////////////////////////////// 1222 1223 func (s *Bytes) Uint40BE(offset int) uint64 { 1224 s.EnsureLen(offset + 5) 1225 return s.Pointer.Uint40BE(offset) 1226 } 1227 1228 func (s *Bytes) SetUint40BE(offset int, value uint64) { 1229 s.EnsureLen(offset + 5) 1230 s.Pointer.SetUint40BE(offset, value) 1231 } 1232 1233 func (s *Bytes) AppendUint40BE(value uint64) { 1234 s.Pointer.SetUint40BE(s.ensureAppend(5), value) 1235 } 1236 1237 /////////////////////////////////////////////////////////////////////////////////////////// 1238 // Int48 Native Endian 1239 /////////////////////////////////////////////////////////////////////////////////////////// 1240 1241 func (s *Bytes) Int48(offset int) int64 { 1242 s.EnsureLen(offset + 6) 1243 return s.Pointer.Int48(offset) 1244 } 1245 1246 func (s *Bytes) SetInt48(offset int, value int64) { 1247 s.EnsureLen(offset + 6) 1248 s.Pointer.SetInt48(offset, value) 1249 } 1250 1251 func (s *Bytes) AppendInt48(value int64) { 1252 s.Pointer.SetInt48(s.ensureAppend(6), value) 1253 } 1254 1255 /////////////////////////////////////////////////////////////////////////////////////////// 1256 // Int48 Little Endian 1257 /////////////////////////////////////////////////////////////////////////////////////////// 1258 1259 func (s *Bytes) Int48LE(offset int) int64 { 1260 s.EnsureLen(offset + 6) 1261 return s.Pointer.Int48LE(offset) 1262 } 1263 1264 func (s *Bytes) SetInt48LE(offset int, value int64) { 1265 s.EnsureLen(offset + 6) 1266 s.Pointer.SetInt48LE(offset, value) 1267 } 1268 1269 func (s *Bytes) AppendInt48LE(value int64) { 1270 s.Pointer.SetInt48LE(s.ensureAppend(6), value) 1271 } 1272 1273 /////////////////////////////////////////////////////////////////////////////////////////// 1274 // Int48 Big Endian 1275 /////////////////////////////////////////////////////////////////////////////////////////// 1276 1277 func (s *Bytes) Int48BE(offset int) int64 { 1278 s.EnsureLen(offset + 6) 1279 return s.Pointer.Int48BE(offset) 1280 } 1281 1282 func (s *Bytes) SetInt48BE(offset int, value int64) { 1283 s.EnsureLen(offset + 6) 1284 s.Pointer.SetInt48BE(offset, value) 1285 } 1286 1287 func (s *Bytes) AppendInt48BE(value int64) { 1288 s.Pointer.SetInt48BE(s.ensureAppend(6), value) 1289 } 1290 1291 /////////////////////////////////////////////////////////////////////////////////////////// 1292 // Uint48 Native Endian 1293 /////////////////////////////////////////////////////////////////////////////////////////// 1294 1295 func (s *Bytes) Uint48(offset int) uint64 { 1296 s.EnsureLen(offset + 6) 1297 return s.Pointer.Uint48(offset) 1298 } 1299 1300 func (s *Bytes) SetUint48(offset int, value uint64) { 1301 s.EnsureLen(offset + 6) 1302 s.Pointer.SetUint48(offset, value) 1303 } 1304 1305 func (s *Bytes) AppendUint48(value uint64) { 1306 s.Pointer.SetUint48(s.ensureAppend(6), value) 1307 } 1308 1309 /////////////////////////////////////////////////////////////////////////////////////////// 1310 // Uint48 Little Endian 1311 /////////////////////////////////////////////////////////////////////////////////////////// 1312 1313 func (s *Bytes) Uint48LE(offset int) uint64 { 1314 s.EnsureLen(offset + 6) 1315 return s.Pointer.Uint48LE(offset) 1316 } 1317 1318 func (s *Bytes) SetUint48LE(offset int, value uint64) { 1319 s.EnsureLen(offset + 6) 1320 s.Pointer.SetUint48LE(offset, value) 1321 } 1322 1323 func (s *Bytes) AppendUint48LE(value uint64) { 1324 s.Pointer.SetUint48LE(s.ensureAppend(6), value) 1325 } 1326 1327 /////////////////////////////////////////////////////////////////////////////////////////// 1328 // Uint48 Big Endian 1329 /////////////////////////////////////////////////////////////////////////////////////////// 1330 1331 func (s *Bytes) Uint48BE(offset int) uint64 { 1332 s.EnsureLen(offset + 6) 1333 return s.Pointer.Uint48BE(offset) 1334 } 1335 1336 func (s *Bytes) SetUint48BE(offset int, value uint64) { 1337 s.EnsureLen(offset + 6) 1338 s.Pointer.SetUint48BE(offset, value) 1339 } 1340 1341 func (s *Bytes) AppendUint48BE(value uint64) { 1342 s.Pointer.SetUint48BE(s.ensureAppend(6), value) 1343 } 1344 1345 /////////////////////////////////////////////////////////////////////////////////////////// 1346 // Int56 Native Endian 1347 /////////////////////////////////////////////////////////////////////////////////////////// 1348 1349 func (s *Bytes) Int56(offset int) int64 { 1350 s.EnsureLen(offset + 7) 1351 return s.Pointer.Int56(offset) 1352 } 1353 1354 func (s *Bytes) SetInt56(offset int, value int64) { 1355 s.EnsureLen(offset + 7) 1356 s.Pointer.SetInt56(offset, value) 1357 } 1358 1359 func (s *Bytes) AppendInt56(value int64) { 1360 s.Pointer.SetInt56(s.ensureAppend(7), value) 1361 } 1362 1363 /////////////////////////////////////////////////////////////////////////////////////////// 1364 // Int56 Little Endian 1365 /////////////////////////////////////////////////////////////////////////////////////////// 1366 1367 func (s *Bytes) Int56LE(offset int) int64 { 1368 s.EnsureLen(offset + 7) 1369 return s.Pointer.Int56LE(offset) 1370 } 1371 1372 func (s *Bytes) SetInt56LE(offset int, value int64) { 1373 s.EnsureLen(offset + 7) 1374 s.Pointer.SetInt56LE(offset, value) 1375 } 1376 1377 func (s *Bytes) AppendInt56LE(value int64) { 1378 s.Pointer.SetInt56LE(s.ensureAppend(7), value) 1379 } 1380 1381 /////////////////////////////////////////////////////////////////////////////////////////// 1382 // Int56 Big Endian 1383 /////////////////////////////////////////////////////////////////////////////////////////// 1384 1385 func (s *Bytes) Int56BE(offset int) int64 { 1386 s.EnsureLen(offset + 7) 1387 return s.Pointer.Int56BE(offset) 1388 } 1389 1390 func (s *Bytes) SetInt56BE(offset int, value int64) { 1391 s.EnsureLen(offset + 7) 1392 s.Pointer.SetInt56BE(offset, value) 1393 } 1394 1395 func (s *Bytes) AppendInt56BE(value int64) { 1396 s.Pointer.SetInt56BE(s.ensureAppend(7), value) 1397 } 1398 1399 /////////////////////////////////////////////////////////////////////////////////////////// 1400 // Uint56 Native Endian 1401 /////////////////////////////////////////////////////////////////////////////////////////// 1402 1403 func (s *Bytes) Uint56(offset int) uint64 { 1404 s.EnsureLen(offset + 7) 1405 return s.Pointer.Uint56(offset) 1406 } 1407 1408 func (s *Bytes) SetUint56(offset int, value uint64) { 1409 s.EnsureLen(offset + 7) 1410 s.Pointer.SetUint56(offset, value) 1411 } 1412 1413 func (s *Bytes) AppendUint56(value uint64) { 1414 s.Pointer.SetUint56(s.ensureAppend(7), value) 1415 } 1416 1417 /////////////////////////////////////////////////////////////////////////////////////////// 1418 // Uint56 Little Endian 1419 /////////////////////////////////////////////////////////////////////////////////////////// 1420 1421 func (s *Bytes) Uint56LE(offset int) uint64 { 1422 s.EnsureLen(offset + 7) 1423 return s.Pointer.Uint56LE(offset) 1424 } 1425 1426 func (s *Bytes) SetUint56LE(offset int, value uint64) { 1427 s.EnsureLen(offset + 7) 1428 s.Pointer.SetUint56LE(offset, value) 1429 } 1430 1431 func (s *Bytes) AppendUint56LE(value uint64) { 1432 s.Pointer.SetUint56LE(s.ensureAppend(7), value) 1433 } 1434 1435 /////////////////////////////////////////////////////////////////////////////////////////// 1436 // Uint56 Big Endian 1437 /////////////////////////////////////////////////////////////////////////////////////////// 1438 1439 func (s *Bytes) Uint56BE(offset int) uint64 { 1440 s.EnsureLen(offset + 7) 1441 return s.Pointer.Uint56BE(offset) 1442 } 1443 1444 func (s *Bytes) SetUint56BE(offset int, value uint64) { 1445 s.EnsureLen(offset + 7) 1446 s.Pointer.SetUint56BE(offset, value) 1447 } 1448 1449 func (s *Bytes) AppendUint56BE(value uint64) { 1450 s.Pointer.SetUint56BE(s.ensureAppend(7), value) 1451 } 1452 1453 func (s *Bytes) Hash32() uint32 { 1454 const ( 1455 offset32 = uint32(2166136261) 1456 prime32 = uint32(16777619) 1457 ) 1458 hash := offset32 1459 end := s.Pointer + Pointer(s.Len()) 1460 for i := s.Pointer; i < end; i++ { 1461 hash ^= uint32(*(*byte)(unsafe.Pointer(i))) 1462 hash *= prime32 1463 } 1464 return hash 1465 } 1466 1467 func (s *Bytes) Hash64() uint64 { 1468 const ( 1469 offset64 = uint64(14695981039346656037) 1470 prime64 = uint64(1099511628211) 1471 ) 1472 hash := offset64 1473 end := s.Pointer + Pointer(s.Len()) 1474 for i := s.Pointer; i < end; i++ { 1475 hash ^= uint64(*(*byte)(unsafe.Pointer(i))) 1476 hash *= prime64 1477 } 1478 return hash 1479 } 1480 1481 func (s *Bytes) WyHash64(seed uint64, offset, length int) uint64 { 1482 return hash.WyHash(s.Bytes()[offset:length], seed) 1483 } 1484 1485 func (s *Bytes) Metro64(seed uint64, offset, length int) uint64 { 1486 return hash.Metro(s.Bytes()[offset:length], seed) 1487 }