mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-11-03 23:40:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// +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 (
 | 
						|
	"unsafe"
 | 
						|
)
 | 
						|
 | 
						|
// This file has unsafe variants of some helper methods.
 | 
						|
 | 
						|
type unsafeString struct {
 | 
						|
	Data uintptr
 | 
						|
	Len  int
 | 
						|
}
 | 
						|
 | 
						|
type unsafeSlice struct {
 | 
						|
	Data uintptr
 | 
						|
	Len  int
 | 
						|
	Cap  int
 | 
						|
}
 | 
						|
 | 
						|
// stringView returns a view of the []byte as a string.
 | 
						|
// In unsafe mode, it doesn't incur allocation and copying caused by conversion.
 | 
						|
// In regular safe mode, it is an allocation and copy.
 | 
						|
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))
 | 
						|
}
 | 
						|
 | 
						|
// bytesView returns a view of the string as a []byte.
 | 
						|
// In unsafe mode, it doesn't incur allocation and copying caused by conversion.
 | 
						|
// In regular safe mode, it is an allocation and copy.
 | 
						|
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))
 | 
						|
}
 |