github.com/pidato/unsafe@v0.1.4/memory/pointer.go (about)

     1  package memory
     2  
     3  import (
     4  	"github.com/pidato/unsafe/memory/hash"
     5  	"unsafe"
     6  )
     7  
     8  // PtrSize is the size of a pointer in bytes - unsafe.Sizeof(uintptr(0)) but as an ideal constant.
     9  // It is also the size of the machine's native word size (that is, 4 on 32-bit systems, 8 on 64-bit).
    10  const PtrSize = 4 << (^uintptr(0) >> 63)
    11  
    12  type Bytes struct {
    13  	Pointer
    14  	Size uintptr
    15  }
    16  
    17  // Pointer is a wrapper around a raw pointer that is not unsafe.Pointer
    18  // so Go won't confuse it for a potential GC managed pointer.
    19  type Pointer uintptr
    20  
    21  func (p Pointer) Size() int {
    22  	return int(Sizeof(p))
    23  }
    24  
    25  func PointerOfString(s string) Pointer {
    26  	h := *(*_string)(unsafe.Pointer(&s))
    27  	return Pointer(h.ptr)
    28  }
    29  
    30  //goland:noinspection ALL
    31  func (p Pointer) Unsafe() unsafe.Pointer {
    32  	return unsafe.Pointer(p)
    33  }
    34  
    35  // Add is Pointer arithmetic.
    36  func (p Pointer) Add(offset int) Pointer {
    37  	return Pointer(uintptr(int(p) + offset))
    38  }
    39  
    40  // Free deallocates memory pointed by Pointer
    41  func (p *Pointer) Free() {
    42  	if p == nil || *p == 0 {
    43  		return
    44  	}
    45  	Free(*p)
    46  	*p = 0
    47  }
    48  
    49  // Sizeof returns the size of the allocation provided by the platform allocator.
    50  func (p Pointer) SizeOf() uintptr {
    51  	return Sizeof(p)
    52  }
    53  
    54  // Clone the memory starting at offset for size number of bytes and return the new Pointer.
    55  func (p Pointer) Clone(offset, size int) Pointer {
    56  	clone := Alloc(uintptr(size))
    57  	p.Copy(offset, size, clone)
    58  	return clone
    59  }
    60  
    61  // Zero zeroes out the entire allocation.
    62  func (p Pointer) Zero(size uintptr) {
    63  	Zero(p.Unsafe(), size)
    64  }
    65  
    66  // Move does a memmove
    67  
    68  func (p Pointer) Move(offset, size int, to Pointer) {
    69  	Move(to.Unsafe(), unsafe.Add(p.Unsafe(), offset), uintptr(size))
    70  }
    71  
    72  // Copy does a memcpy
    73  
    74  func (p Pointer) Copy(offset, size int, to Pointer) {
    75  	Copy(to.Unsafe(), unsafe.Add(p.Unsafe(), offset), uintptr(size))
    76  }
    77  
    78  // Equals does a memequal
    79  
    80  func (p Pointer) Equals(offset, size int, to Pointer) bool {
    81  	return Equals(to.Unsafe(), unsafe.Add(p.Unsafe(), offset), uintptr(size))
    82  }
    83  
    84  // Compare does a memcmp
    85  
    86  func (p Pointer) Compare(offset, size int, to Pointer) int {
    87  	return Compare(to.Unsafe(), unsafe.Add(p.Unsafe(), offset), uintptr(size))
    88  }
    89  
    90  ///////////////////////////////////////////////////////////////////////////////////////////////
    91  // Byte
    92  ///////////////////////////////////////////////////////////////////////////////////////////////
    93  
    94  func (p Pointer) Int8(offset int) int8 {
    95  	return *(*int8)(unsafe.Add(p.Unsafe(), offset))
    96  }
    97  
    98  func (p Pointer) Uint8(offset int) uint8 {
    99  	return *(*uint8)(unsafe.Add(p.Unsafe(), offset))
   100  }
   101  
   102  func (p Pointer) Byte(offset int) byte {
   103  	return *(*byte)(unsafe.Add(p.Unsafe(), offset))
   104  }
   105  
   106  ///////////////////////////////////////////////////////////////////////////////////////////////
   107  // Put Byte
   108  ///////////////////////////////////////////////////////////////////////////////////////////////
   109  
   110  func (p Pointer) SetInt8(offset int, v int8) {
   111  	*(*int8)(unsafe.Add(p.Unsafe(), offset)) = v
   112  }
   113  
   114  func (p Pointer) SetUint8(offset int, v uint8) {
   115  	*(*uint8)(unsafe.Add(p.Unsafe(), offset)) = v
   116  }
   117  
   118  func (p Pointer) SetByte(offset int, v byte) {
   119  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = v
   120  }
   121  
   122  ///////////////////////////////////////////////////////////////////////////////////////////////
   123  // Int16 Native Endian
   124  ///////////////////////////////////////////////////////////////////////////////////////////////
   125  
   126  func (p Pointer) Int16(offset int) int16 {
   127  	return *(*int16)(unsafe.Add(p.Unsafe(), offset))
   128  }
   129  
   130  func (p Pointer) SetInt16(offset int, v int16) {
   131  	*(*int16)(unsafe.Add(p.Unsafe(), offset)) = v
   132  }
   133  
   134  ///////////////////////////////////////////////////////////////////////////////////////////////
   135  // Uint16 Native Endian
   136  ///////////////////////////////////////////////////////////////////////////////////////////////
   137  
   138  func (p Pointer) Uint16(offset int) uint16 {
   139  	return *(*uint16)(unsafe.Add(p.Unsafe(), offset))
   140  }
   141  
   142  func (p Pointer) SetUint16(offset int, v uint16) {
   143  	*(*uint16)(unsafe.Add(p.Unsafe(), offset)) = v
   144  }
   145  
   146  ///////////////////////////////////////////////////////////////////////////////////////////////
   147  // Int32 Native Endian
   148  ///////////////////////////////////////////////////////////////////////////////////////////////
   149  
   150  func (p Pointer) Int32(offset int) int32 {
   151  	return *(*int32)(unsafe.Add(p.Unsafe(), offset))
   152  }
   153  func (p Pointer) Int32Alt(offset uintptr) int32 {
   154  	return *(*int32)(unsafe.Add(p.Unsafe(), offset))
   155  }
   156  
   157  func (p Pointer) SetInt32(offset int, v int32) {
   158  	*(*int32)(unsafe.Add(p.Unsafe(), offset)) = v
   159  }
   160  
   161  ///////////////////////////////////////////////////////////////////////////////////////////////
   162  // Uint32 Native Endian
   163  ///////////////////////////////////////////////////////////////////////////////////////////////
   164  
   165  func (p Pointer) Uint32(offset int) uint32 {
   166  	return *(*uint32)(unsafe.Add(p.Unsafe(), offset))
   167  }
   168  
   169  func (p Pointer) SetUint32(offset int, v uint32) {
   170  	*(*uint32)(unsafe.Add(p.Unsafe(), offset)) = v
   171  }
   172  
   173  ///////////////////////////////////////////////////////////////////////////////////////////////
   174  // Int64 Native Endian
   175  ///////////////////////////////////////////////////////////////////////////////////////////////
   176  
   177  func (p Pointer) Int64(offset int) int64 {
   178  	return *(*int64)(unsafe.Add(p.Unsafe(), offset))
   179  }
   180  
   181  func (p Pointer) SetInt64(offset int, v int64) {
   182  	*(*int64)(unsafe.Add(p.Unsafe(), offset)) = v
   183  }
   184  
   185  ///////////////////////////////////////////////////////////////////////////////////////////////
   186  // Uint64 Native Endian
   187  ///////////////////////////////////////////////////////////////////////////////////////////////
   188  
   189  func (p Pointer) Uint64(offset int) uint64 {
   190  	return *(*uint64)(unsafe.Add(p.Unsafe(), offset))
   191  }
   192  
   193  func (p Pointer) SetUint64(offset int, v uint64) {
   194  	*(*uint64)(unsafe.Add(p.Unsafe(), offset)) = v
   195  }
   196  
   197  ///////////////////////////////////////////////////////////////////////////////////////////////
   198  // Float32 Native Endian
   199  ///////////////////////////////////////////////////////////////////////////////////////////////
   200  
   201  func (p Pointer) Float32(offset int) float32 {
   202  	return *(*float32)(unsafe.Add(p.Unsafe(), offset))
   203  }
   204  
   205  func (p Pointer) SetFloat32(offset int, v float32) {
   206  	*(*float32)(unsafe.Add(p.Unsafe(), offset)) = v
   207  }
   208  
   209  ///////////////////////////////////////////////////////////////////////////////////////////////
   210  // Float64 Native Endian
   211  ///////////////////////////////////////////////////////////////////////////////////////////////
   212  
   213  func (p Pointer) Float64(offset int) float64 {
   214  	return *(*float64)(unsafe.Add(p.Unsafe(), offset))
   215  }
   216  
   217  func (p Pointer) SetFloat64(offset int, v float64) {
   218  	*(*float64)(unsafe.Add(p.Unsafe(), offset)) = v
   219  }
   220  
   221  ///////////////////////////////////////////////////////////////////////////////////////////////
   222  // int
   223  ///////////////////////////////////////////////////////////////////////////////////////////////
   224  
   225  func (p Pointer) Int(offset int) int {
   226  	return *(*int)(unsafe.Add(p.Unsafe(), offset))
   227  }
   228  
   229  func (p Pointer) SetInt(offset int, v int) {
   230  	*(*int)(unsafe.Add(p.Unsafe(), offset)) = v
   231  }
   232  
   233  ///////////////////////////////////////////////////////////////////////////////////////////////
   234  // uint
   235  ///////////////////////////////////////////////////////////////////////////////////////////////
   236  
   237  func (p Pointer) Uint(offset int) uint {
   238  	return *(*uint)(unsafe.Add(p.Unsafe(), offset))
   239  }
   240  
   241  func (p Pointer) SetUint(offset int, v uint) {
   242  	*(*uint)(unsafe.Add(p.Unsafe(), offset)) = v
   243  }
   244  
   245  ///////////////////////////////////////////////////////////////////////////////////////////////
   246  // uintptr
   247  ///////////////////////////////////////////////////////////////////////////////////////////////
   248  
   249  func (p Pointer) Uintptr(offset int) uintptr {
   250  	return *(*uintptr)(unsafe.Add(p.Unsafe(), offset))
   251  }
   252  
   253  func (p Pointer) SetUintptr(offset int, v uintptr) {
   254  	*(*uintptr)(unsafe.Add(p.Unsafe(), offset)) = v
   255  }
   256  
   257  ///////////////////////////////////////////////////////////////////////////////////////////////
   258  // Pointer
   259  ///////////////////////////////////////////////////////////////////////////////////////////////
   260  
   261  func (p Pointer) Pointer(offset int) Pointer {
   262  	return *(*Pointer)(unsafe.Add(p.Unsafe(), offset))
   263  }
   264  
   265  func (p Pointer) SetPointer(offset int, v Pointer) {
   266  	*(*Pointer)(unsafe.Add(p.Unsafe(), offset)) = v
   267  }
   268  
   269  ///////////////////////////////////////////////////////////////////////////////////////////////
   270  // String
   271  ///////////////////////////////////////////////////////////////////////////////////////////////
   272  
   273  type _string struct {
   274  	ptr uintptr
   275  	len int
   276  }
   277  
   278  func (p Pointer) String(offset, size int) string {
   279  	return *(*string)(unsafe.Pointer(&_string{
   280  		ptr: uintptr(int(p) + offset),
   281  		len: size,
   282  	}))
   283  }
   284  
   285  func (p Pointer) SetString(offset int, value string) {
   286  	dst := *(*[]byte)(unsafe.Pointer(&_bytes{
   287  		Data: uintptr(int(p) + offset),
   288  		Len:  len(value),
   289  		Cap:  len(value),
   290  	}))
   291  	copy(dst, value)
   292  }
   293  
   294  func (p Pointer) SetBytes(offset int, value []byte) {
   295  	dst := *(*[]byte)(unsafe.Pointer(&_bytes{
   296  		Data: uintptr(int(p) + offset),
   297  		Len:  len(value),
   298  		Cap:  len(value),
   299  	}))
   300  	copy(dst, value)
   301  }
   302  
   303  ///////////////////////////////////////////////////////////////////////////////////////////////
   304  // Byte Slice
   305  ///////////////////////////////////////////////////////////////////////////////////////////////
   306  
   307  type _bytes struct {
   308  	Data uintptr
   309  	Len  int
   310  	Cap  int
   311  }
   312  
   313  func (p Pointer) Bytes(offset, length, capacity int) []byte {
   314  	return *(*[]byte)(unsafe.Pointer(&_bytes{
   315  		Data: uintptr(int(p) + offset),
   316  		Len:  length,
   317  		Cap:  capacity,
   318  	}))
   319  }
   320  
   321  ///////////////////////////////////////////////////////////////////////////////////////////////
   322  // Int24 Little Endian
   323  ///////////////////////////////////////////////////////////////////////////////////////////////
   324  
   325  func (p Pointer) Int24LE(offset int) int32 {
   326  	return int32(*(*byte)(unsafe.Add(p.Unsafe(), offset))) |
   327  		int32(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<8 |
   328  		int32(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<16
   329  }
   330  
   331  func (p Pointer) SetInt24LE(offset int, v int32) {
   332  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v)
   333  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 8)
   334  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 16)
   335  }
   336  
   337  ///////////////////////////////////////////////////////////////////////////////////////////////
   338  // Int24 Big Endian
   339  ///////////////////////////////////////////////////////////////////////////////////////////////
   340  
   341  func (p Pointer) Int24BE(offset int) int32 {
   342  	return int32(*(*byte)(unsafe.Add(p.Unsafe(), offset+2))) |
   343  		int32(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<8 |
   344  		int32(*(*byte)(unsafe.Add(p.Unsafe(), offset)))<<16
   345  }
   346  
   347  func (p Pointer) SetInt24BE(offset int, v int32) {
   348  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v >> 16)
   349  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 8)
   350  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v)
   351  }
   352  
   353  ///////////////////////////////////////////////////////////////////////////////////////////////
   354  // Uint24 Little Endian
   355  ///////////////////////////////////////////////////////////////////////////////////////////////
   356  
   357  func (p Pointer) Uint24LE(offset int) uint32 {
   358  	return uint32(*(*byte)(unsafe.Add(p.Unsafe(), offset))) |
   359  		uint32(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<8 |
   360  		uint32(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<16
   361  }
   362  
   363  func (p Pointer) SetUint24LE(offset int, v uint32) {
   364  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v)
   365  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 8)
   366  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 16)
   367  }
   368  
   369  ///////////////////////////////////////////////////////////////////////////////////////////////
   370  // Uint24 Big Endian
   371  ///////////////////////////////////////////////////////////////////////////////////////////////
   372  
   373  func (p Pointer) Uint24BE(offset int) uint32 {
   374  	return uint32(*(*byte)(unsafe.Add(p.Unsafe(), offset+2))) |
   375  		uint32(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<8 |
   376  		uint32(*(*byte)(unsafe.Add(p.Unsafe(), offset)))<<16
   377  }
   378  
   379  func (p Pointer) SetUint24BE(offset int, v uint32) {
   380  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v >> 16)
   381  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 8)
   382  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v)
   383  }
   384  
   385  ///////////////////////////////////////////////////////////////////////////////////////////////
   386  // Int40 Little Endian
   387  ///////////////////////////////////////////////////////////////////////////////////////////////
   388  
   389  func (p Pointer) Int40LE(offset int) int64 {
   390  	return int64(*(*byte)(unsafe.Add(p.Unsafe(), offset))) |
   391  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<8 |
   392  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<16 |
   393  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+3)))<<24 |
   394  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+4)))<<32
   395  }
   396  
   397  func (p Pointer) SetInt40LE(offset int, v int64) {
   398  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v)
   399  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 8)
   400  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 16)
   401  	*(*byte)(unsafe.Add(p.Unsafe(), offset+3)) = byte(v >> 24)
   402  	*(*byte)(unsafe.Add(p.Unsafe(), offset+4)) = byte(v >> 32)
   403  }
   404  
   405  ///////////////////////////////////////////////////////////////////////////////////////////////
   406  // Int40 Big Endian
   407  ///////////////////////////////////////////////////////////////////////////////////////////////
   408  
   409  func (p Pointer) Int40BE(offset int) int64 {
   410  	return int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+4))) |
   411  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+3)))<<8 |
   412  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<16 |
   413  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<24 |
   414  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset)))<<32
   415  }
   416  
   417  func (p Pointer) SetInt40BE(offset int, v int64) {
   418  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v >> 32)
   419  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 24)
   420  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 16)
   421  	*(*byte)(unsafe.Add(p.Unsafe(), offset+3)) = byte(v >> 8)
   422  	*(*byte)(unsafe.Add(p.Unsafe(), offset+4)) = byte(v)
   423  }
   424  
   425  ///////////////////////////////////////////////////////////////////////////////////////////////
   426  // Uint40 Little Endian
   427  ///////////////////////////////////////////////////////////////////////////////////////////////
   428  
   429  func (p Pointer) Uint40LE(offset int) uint64 {
   430  	return uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset))) |
   431  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<8 |
   432  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<16 |
   433  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+3)))<<24 |
   434  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+4)))<<32
   435  }
   436  
   437  func (p Pointer) SetUint40LE(offset int, v uint64) {
   438  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v)
   439  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 8)
   440  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 16)
   441  	*(*byte)(unsafe.Add(p.Unsafe(), offset+3)) = byte(v >> 24)
   442  	*(*byte)(unsafe.Add(p.Unsafe(), offset+4)) = byte(v >> 32)
   443  }
   444  
   445  ///////////////////////////////////////////////////////////////////////////////////////////////
   446  // Uint40 Big Endian
   447  ///////////////////////////////////////////////////////////////////////////////////////////////
   448  
   449  func (p Pointer) Uint40BE(offset int) uint64 {
   450  	return uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+4))) |
   451  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+3)))<<8 |
   452  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<16 |
   453  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<24 |
   454  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset)))<<32
   455  }
   456  
   457  func (p Pointer) SetUint40BE(offset int, v uint64) {
   458  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v >> 32)
   459  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 24)
   460  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 16)
   461  	*(*byte)(unsafe.Add(p.Unsafe(), offset+3)) = byte(v >> 8)
   462  	*(*byte)(unsafe.Add(p.Unsafe(), offset+4)) = byte(v)
   463  }
   464  
   465  ///////////////////////////////////////////////////////////////////////////////////////////////
   466  // Int48 Little Endian
   467  ///////////////////////////////////////////////////////////////////////////////////////////////
   468  
   469  func (p Pointer) Int48LE(offset int) int64 {
   470  	return int64(*(*byte)(unsafe.Add(p.Unsafe(), offset))) |
   471  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<8 |
   472  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<16 |
   473  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+3)))<<24 |
   474  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+4)))<<32 |
   475  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+5)))<<40
   476  }
   477  
   478  func (p Pointer) SetInt48LE(offset int, v int64) {
   479  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v)
   480  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 8)
   481  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 16)
   482  	*(*byte)(unsafe.Add(p.Unsafe(), offset+3)) = byte(v >> 24)
   483  	*(*byte)(unsafe.Add(p.Unsafe(), offset+4)) = byte(v >> 32)
   484  	*(*byte)(unsafe.Add(p.Unsafe(), offset+5)) = byte(v >> 40)
   485  }
   486  
   487  ///////////////////////////////////////////////////////////////////////////////////////////////
   488  // Int48 Big Endian
   489  ///////////////////////////////////////////////////////////////////////////////////////////////
   490  
   491  func (p Pointer) Int48BE(offset int) int64 {
   492  	return int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+5))) |
   493  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+4)))<<8 |
   494  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+3)))<<16 |
   495  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<24 |
   496  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<32 |
   497  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset)))<<40
   498  }
   499  
   500  func (p Pointer) SetInt48BE(offset int, v int64) {
   501  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v >> 40)
   502  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 32)
   503  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 24)
   504  	*(*byte)(unsafe.Add(p.Unsafe(), offset+3)) = byte(v >> 16)
   505  	*(*byte)(unsafe.Add(p.Unsafe(), offset+4)) = byte(v >> 8)
   506  	*(*byte)(unsafe.Add(p.Unsafe(), offset+5)) = byte(v)
   507  }
   508  
   509  ///////////////////////////////////////////////////////////////////////////////////////////////
   510  // Uint48 Little Endian
   511  ///////////////////////////////////////////////////////////////////////////////////////////////
   512  
   513  func (p Pointer) Uint48LE(offset int) uint64 {
   514  	return uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset))) |
   515  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<8 |
   516  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<16 |
   517  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+3)))<<24 |
   518  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+4)))<<32 |
   519  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+5)))<<40
   520  }
   521  
   522  func (p Pointer) SetUint48LE(offset int, v uint64) {
   523  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v)
   524  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 8)
   525  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 16)
   526  	*(*byte)(unsafe.Add(p.Unsafe(), offset+3)) = byte(v >> 24)
   527  	*(*byte)(unsafe.Add(p.Unsafe(), offset+4)) = byte(v >> 32)
   528  	*(*byte)(unsafe.Add(p.Unsafe(), offset+5)) = byte(v >> 40)
   529  }
   530  
   531  ///////////////////////////////////////////////////////////////////////////////////////////////
   532  // Uint48 Big Endian
   533  ///////////////////////////////////////////////////////////////////////////////////////////////
   534  
   535  func (p Pointer) Uint48BE(offset int) uint64 {
   536  	return uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+5))) |
   537  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+4)))<<8 |
   538  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+3)))<<16 |
   539  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<24 |
   540  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<32 |
   541  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset)))<<40
   542  }
   543  
   544  func (p Pointer) SetUint48BE(offset int, v uint64) {
   545  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v >> 40)
   546  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 32)
   547  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 24)
   548  	*(*byte)(unsafe.Add(p.Unsafe(), offset+3)) = byte(v >> 16)
   549  	*(*byte)(unsafe.Add(p.Unsafe(), offset+4)) = byte(v >> 8)
   550  	*(*byte)(unsafe.Add(p.Unsafe(), offset+5)) = byte(v)
   551  }
   552  
   553  ///////////////////////////////////////////////////////////////////////////////////////////////
   554  // Int56 Little Endian
   555  ///////////////////////////////////////////////////////////////////////////////////////////////
   556  
   557  func (p Pointer) Int56LE(offset int) int64 {
   558  	return int64(*(*byte)(unsafe.Add(p.Unsafe(), offset))) |
   559  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<8 |
   560  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<16 |
   561  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+3)))<<24 |
   562  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+4)))<<32 |
   563  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+5)))<<40 |
   564  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+6)))<<48
   565  }
   566  
   567  func (p Pointer) SetInt56LE(offset int, v int64) {
   568  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v)
   569  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 8)
   570  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 16)
   571  	*(*byte)(unsafe.Add(p.Unsafe(), offset+3)) = byte(v >> 24)
   572  	*(*byte)(unsafe.Add(p.Unsafe(), offset+4)) = byte(v >> 32)
   573  	*(*byte)(unsafe.Add(p.Unsafe(), offset+5)) = byte(v >> 40)
   574  	*(*byte)(unsafe.Add(p.Unsafe(), offset+6)) = byte(v >> 48)
   575  }
   576  
   577  ///////////////////////////////////////////////////////////////////////////////////////////////
   578  // Int56 Big Endian
   579  ///////////////////////////////////////////////////////////////////////////////////////////////
   580  
   581  func (p Pointer) Int56BE(offset int) int64 {
   582  	return int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+6))) |
   583  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+5)))<<8 |
   584  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+4)))<<16 |
   585  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+3)))<<24 |
   586  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<32 |
   587  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<40 |
   588  		int64(*(*byte)(unsafe.Add(p.Unsafe(), offset)))<<48
   589  }
   590  
   591  func (p Pointer) SetInt56BE(offset int, v int64) {
   592  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v >> 48)
   593  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 40)
   594  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 32)
   595  	*(*byte)(unsafe.Add(p.Unsafe(), offset+3)) = byte(v >> 24)
   596  	*(*byte)(unsafe.Add(p.Unsafe(), offset+4)) = byte(v >> 16)
   597  	*(*byte)(unsafe.Add(p.Unsafe(), offset+5)) = byte(v >> 8)
   598  	*(*byte)(unsafe.Add(p.Unsafe(), offset+6)) = byte(v)
   599  }
   600  
   601  ///////////////////////////////////////////////////////////////////////////////////////////////
   602  // Uint56 Little Endian
   603  ///////////////////////////////////////////////////////////////////////////////////////////////
   604  
   605  func (p Pointer) Uint56LE(offset int) uint64 {
   606  	return uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset))) |
   607  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<8 |
   608  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<16 |
   609  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+3)))<<24 |
   610  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+4)))<<32 |
   611  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+5)))<<40 |
   612  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+6)))<<48
   613  }
   614  
   615  func (p Pointer) SetUint56LE(offset int, v uint64) {
   616  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v)
   617  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 8)
   618  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 16)
   619  	*(*byte)(unsafe.Add(p.Unsafe(), offset+3)) = byte(v >> 24)
   620  	*(*byte)(unsafe.Add(p.Unsafe(), offset+4)) = byte(v >> 32)
   621  	*(*byte)(unsafe.Add(p.Unsafe(), offset+5)) = byte(v >> 40)
   622  	*(*byte)(unsafe.Add(p.Unsafe(), offset+6)) = byte(v >> 48)
   623  }
   624  
   625  ///////////////////////////////////////////////////////////////////////////////////////////////
   626  // Uint56 Big Endian
   627  ///////////////////////////////////////////////////////////////////////////////////////////////
   628  
   629  func (p Pointer) Uint56BE(offset int) uint64 {
   630  	return uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+6))) |
   631  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+5)))<<8 |
   632  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+4)))<<16 |
   633  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+3)))<<24 |
   634  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+2)))<<32 |
   635  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset+1)))<<40 |
   636  		uint64(*(*byte)(unsafe.Add(p.Unsafe(), offset)))<<48
   637  }
   638  
   639  func (p Pointer) SetUint56BE(offset int, v uint64) {
   640  	*(*byte)(unsafe.Add(p.Unsafe(), offset)) = byte(v >> 48)
   641  	*(*byte)(unsafe.Add(p.Unsafe(), offset+1)) = byte(v >> 40)
   642  	*(*byte)(unsafe.Add(p.Unsafe(), offset+2)) = byte(v >> 32)
   643  	*(*byte)(unsafe.Add(p.Unsafe(), offset+3)) = byte(v >> 24)
   644  	*(*byte)(unsafe.Add(p.Unsafe(), offset+4)) = byte(v >> 16)
   645  	*(*byte)(unsafe.Add(p.Unsafe(), offset+5)) = byte(v >> 8)
   646  	*(*byte)(unsafe.Add(p.Unsafe(), offset+6)) = byte(v)
   647  }
   648  
   649  func (p Pointer) Hash64(length int) uint64 {
   650  	return hash.Hash(p.Unsafe(), uint64(length), hash.DefaultSeed)
   651  }
   652  
   653  func (p Pointer) Hash64At(offset, length int) uint64 {
   654  	return hash.Hash(p.Pointer(offset).Unsafe(), uint64(length), hash.DefaultSeed)
   655  }