package maps
import (
)
func ( *Map) ( *abi.SwissMapType, string) unsafe.Pointer {
:= groupReference{
data: .dirPtr,
}
:= *.ctrls()
:= .key(, 0)
:= .SlotSize
if len() > 64 {
:= abi.SwissMapGroupSlots
for := range abi.SwissMapGroupSlots {
if &(1<<7) == 0 && longStringQuickEqualityTest(, *(*string)()) {
if < abi.SwissMapGroupSlots {
goto
}
=
}
= unsafe.Pointer(uintptr() + )
>>= 8
}
if == abi.SwissMapGroupSlots {
return nil
}
= .key(, uintptr())
if == *(*string)() {
return unsafe.Pointer(uintptr() + 2*goarch.PtrSize)
}
return nil
}
:
:= .Hasher(abi.NoEscape(unsafe.Pointer(&)), .seed)
:= uint8(h2())
= *.ctrls()
= .key(, 0)
for range abi.SwissMapGroupSlots {
if uint8() == && == *(*string)() {
return unsafe.Pointer(uintptr() + 2*goarch.PtrSize)
}
= unsafe.Pointer(uintptr() + )
>>= 8
}
return nil
}
func (, string) bool {
if len() != len() {
return false
}
, := stringPtr(), stringPtr()
if *(*[8]byte)() != *(*[8]byte)() {
return false
}
= unsafe.Pointer(uintptr() + uintptr(len()) - 8)
= unsafe.Pointer(uintptr() + uintptr(len()) - 8)
if *(*[8]byte)() != *(*[8]byte)() {
return false
}
return true
}
func ( string) unsafe.Pointer {
type struct {
unsafe.Pointer
int
}
return (*)(unsafe.Pointer(&)).
}
func ( *abi.SwissMapType, *Map, string) unsafe.Pointer {
if race.Enabled && != nil {
:= sys.GetCallerPC()
:= abi.FuncPCABIInternal()
race.ReadPC(unsafe.Pointer(), , )
}
if == nil || .Used() == 0 {
return unsafe.Pointer(&zeroVal[0])
}
if .writing != 0 {
fatal("concurrent map read and map write")
return nil
}
if .dirLen <= 0 {
:= .getWithoutKeySmallFastStr(, )
if == nil {
return unsafe.Pointer(&zeroVal[0])
}
return
}
:=
:= .Hasher(abi.NoEscape(unsafe.Pointer(&)), .seed)
:= .directoryIndex()
:= .directoryAt()
:= makeProbeSeq(h1(), .groups.lengthMask)
for ; ; = .next() {
:= .groups.group(, .offset)
:= .ctrls().matchH2(h2())
for != 0 {
:= .first()
:= .key(, )
if == *(*string)() {
:= unsafe.Pointer(uintptr() + 2*goarch.PtrSize)
return
}
= .removeFirst()
}
= .ctrls().matchEmpty()
if != 0 {
return unsafe.Pointer(&zeroVal[0])
}
}
}
func ( *abi.SwissMapType, *Map, string) (unsafe.Pointer, bool) {
if race.Enabled && != nil {
:= sys.GetCallerPC()
:= abi.FuncPCABIInternal()
race.ReadPC(unsafe.Pointer(), , )
}
if == nil || .Used() == 0 {
return unsafe.Pointer(&zeroVal[0]), false
}
if .writing != 0 {
fatal("concurrent map read and map write")
return nil, false
}
if .dirLen <= 0 {
:= .getWithoutKeySmallFastStr(, )
if == nil {
return unsafe.Pointer(&zeroVal[0]), false
}
return , true
}
:=
:= .Hasher(abi.NoEscape(unsafe.Pointer(&)), .seed)
:= .directoryIndex()
:= .directoryAt()
:= makeProbeSeq(h1(), .groups.lengthMask)
for ; ; = .next() {
:= .groups.group(, .offset)
:= .ctrls().matchH2(h2())
for != 0 {
:= .first()
:= .key(, )
if == *(*string)() {
:= unsafe.Pointer(uintptr() + 2*goarch.PtrSize)
return , true
}
= .removeFirst()
}
= .ctrls().matchEmpty()
if != 0 {
return unsafe.Pointer(&zeroVal[0]), false
}
}
}
func ( *Map) ( *abi.SwissMapType, uintptr, string) unsafe.Pointer {
:= groupReference{
data: .dirPtr,
}
:= .ctrls().matchH2(h2())
for != 0 {
:= .first()
:= .key(, )
if == *(*string)() {
*(*string)() =
:= .elem(, )
return
}
= .removeFirst()
}
= .ctrls().matchEmptyOrDeleted()
if == 0 {
fatal("small map with no empty slot (concurrent map writes?)")
}
:= .first()
:= .key(, )
*(*string)() =
:= .elem(, )
.ctrls().set(, ctrl(h2()))
.used++
return
}
func ( *abi.SwissMapType, *Map, string) unsafe.Pointer {
if == nil {
panic(errNilAssign)
}
if race.Enabled {
:= sys.GetCallerPC()
:= abi.FuncPCABIInternal()
race.WritePC(unsafe.Pointer(), , )
}
if .writing != 0 {
fatal("concurrent map writes")
}
:=
:= .Hasher(abi.NoEscape(unsafe.Pointer(&)), .seed)
.writing ^= 1
if .dirPtr == nil {
.growToSmall()
}
if .dirLen == 0 {
if .used < abi.SwissMapGroupSlots {
:= .putSlotSmallFastStr(, , )
if .writing == 0 {
fatal("concurrent map writes")
}
.writing ^= 1
return
}
.growToTable()
}
var unsafe.Pointer
:
for {
:= .directoryIndex()
:= .directoryAt()
:= makeProbeSeq(h1(), .groups.lengthMask)
var groupReference
var uintptr
for ; ; = .next() {
:= .groups.group(, .offset)
:= .ctrls().matchH2(h2())
for != 0 {
:= .first()
:= .key(, )
if == *(*string)() {
*(*string)() =
= .elem(, )
.checkInvariants(, )
break
}
= .removeFirst()
}
= .ctrls().matchEmptyOrDeleted()
if == 0 {
continue
}
:= .first()
if .ctrls().get() == ctrlDeleted {
if .data == nil {
=
=
}
continue
}
if .data != nil {
=
=
.growthLeft++
}
if .growthLeft > 0 {
:= .key(, )
*(*string)() =
= .elem(, )
.ctrls().set(, ctrl(h2()))
.growthLeft--
.used++
.used++
.checkInvariants(, )
break
}
.rehash(, )
continue
}
}
if .writing == 0 {
fatal("concurrent map writes")
}
.writing ^= 1
return
}
func ( *abi.SwissMapType, *Map, string) {
if race.Enabled {
:= sys.GetCallerPC()
:= abi.FuncPCABIInternal()
race.WritePC(unsafe.Pointer(), , )
}
if == nil || .Used() == 0 {
return
}
.Delete(, abi.NoEscape(unsafe.Pointer(&)))
}