// +build unsafe // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. package codec import ( "runtime" "unsafe" ) // This file has unsafe variants of some helper methods. // NOTE: See helper_not_unsafe.go for the usage information. type unsafeString struct { Data uintptr Len int } type unsafeSlice struct { Data uintptr Len int Cap int } func stringView(v []byte) string { if len(v) == 0 { return "" } bx := (*unsafeSlice)(unsafe.Pointer(&v)) sx := unsafeString{bx.Data, bx.Len} return *(*string)(unsafe.Pointer(&sx)) } func bytesView(v string) []byte { if len(v) == 0 { return zeroByteSlice } sx := (*unsafeString)(unsafe.Pointer(&v)) bx := unsafeSlice{sx.Data, sx.Len, sx.Len} return *(*[]byte)(unsafe.Pointer(&bx)) } func keepAlive4BytesView(v string) { runtime.KeepAlive(v) } func keepAlive4StringView(v []byte) { runtime.KeepAlive(v) }