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  }