memstore/common/common.go (41 lines of code) (raw):
package common
import (
"unsafe"
)
// SetValue sets the value as dataType at ith position from baseAddr.
func SetValue(baseAddr uintptr, i int, val unsafe.Pointer, dataType DataType) {
idx := uintptr(i)
unitBits := DataTypeBits(dataType)
switch unitBits {
case 8:
*(*uint8)(unsafe.Pointer(baseAddr + idx)) = *(*uint8)(val)
case 16:
*(*uint16)(unsafe.Pointer(baseAddr + idx*2)) = *(*uint16)(val)
case 32:
*(*uint32)(unsafe.Pointer(baseAddr + idx*4)) = *(*uint32)(val)
case 64:
*(*uint64)(unsafe.Pointer(baseAddr + idx*8)) = *(*uint64)(val)
case 128:
*(*uint64)(unsafe.Pointer(baseAddr + idx*16)) = *(*uint64)(val)
*(*uint64)(unsafe.Pointer(baseAddr + idx*16 + 8)) = *(*uint64)(unsafe.Pointer(uintptr(val) + 8))
}
}
// SetBool sets the value as bool at ith position from baseAddr.
func SetBool(baseAddr uintptr, i int, val bool) {
wordOffset := uintptr(i / 32 * 4)
localBit := uint(i % 32)
wordAddr := (*uint32)(unsafe.Pointer(baseAddr + wordOffset))
if val {
*wordAddr |= 1 << localBit
} else {
*wordAddr &^= 1 << localBit
}
}
// GetValue reads value as dataType at ith position from baseAddr
func GetValue(baseAddr uintptr, i int, dataType DataType) unsafe.Pointer {
unitBits := DataTypeBits(dataType)
return unsafe.Pointer(baseAddr + uintptr(unitBits/8*i))
}
// GetBool reads the value as bool at ith position from baseAddr.
func GetBool(baseAddr uintptr, i int) bool {
wordOffset := uintptr(i / 32 * 4)
localBit := uint(i % 32)
wordAddr := (*uint32)(unsafe.Pointer(baseAddr + wordOffset))
return *wordAddr&(1<<localBit) != 0
}