42 lines
		
	
	
		
			578 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			578 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| //+build rocksdb
 | |
| 
 | |
| package rocksdb
 | |
| 
 | |
| // #cgo LDFLAGS: -lrocksdb
 | |
| // #include <rocksdb/c.h>
 | |
| // #include <stdlib.h>
 | |
| import "C"
 | |
| 
 | |
| import (
 | |
| 	"reflect"
 | |
| 	"unsafe"
 | |
| )
 | |
| 
 | |
| type CSlice struct {
 | |
| 	data unsafe.Pointer
 | |
| 	size int
 | |
| }
 | |
| 
 | |
| func NewCSlice(p unsafe.Pointer, n int) *CSlice {
 | |
| 	return &CSlice{p, n}
 | |
| }
 | |
| 
 | |
| func (s *CSlice) Data() []byte {
 | |
| 	var value []byte
 | |
| 
 | |
| 	sH := (*reflect.SliceHeader)(unsafe.Pointer(&value))
 | |
| 	sH.Cap = int(s.size)
 | |
| 	sH.Len = int(s.size)
 | |
| 	sH.Data = uintptr(s.data)
 | |
| 
 | |
| 	return value
 | |
| }
 | |
| 
 | |
| func (s *CSlice) Size() int {
 | |
| 	return int(s.size)
 | |
| }
 | |
| 
 | |
| func (s *CSlice) Free() {
 | |
| 	C.free(s.data)
 | |
| }
 |