Source File
map.go
Belonging Package
google.golang.org/grpc/resolver
/*
*
* Copyright 2021 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package resolver
type addressMapEntry struct {
addr Address
value interface{}
}
// AddressMap is a map of addresses to arbitrary values taking into account
// Attributes. BalancerAttributes are ignored, as are Metadata and Type.
// Multiple accesses may not be performed concurrently. Must be created via
// NewAddressMap; do not construct directly.
type AddressMap struct {
// The underlying map is keyed by an Address with fields that we don't care
// about being set to their zero values. The only fields that we care about
// are `Addr`, `ServerName` and `Attributes`. Since we need to be able to
// distinguish between addresses with same `Addr` and `ServerName`, but
// different `Attributes`, we cannot store the `Attributes` in the map key.
//
// The comparison operation for structs work as follows:
// Struct values are comparable if all their fields are comparable. Two
// struct values are equal if their corresponding non-blank fields are equal.
//
// The value type of the map contains a slice of addresses which match the key
// in their `Addr` and `ServerName` fields and contain the corresponding value
// associated with them.
m map[Address]addressMapEntryList
}
func ( *Address) Address {
return Address{Addr: .Addr, ServerName: .ServerName}
}
type addressMapEntryList []*addressMapEntry
// NewAddressMap creates a new AddressMap.
func () *AddressMap {
return &AddressMap{m: make(map[Address]addressMapEntryList)}
}
// find returns the index of addr in the addressMapEntry slice, or -1 if not
// present.
func ( addressMapEntryList) ( Address) int {
for , := range {
// Attributes are the only thing to match on here, since `Addr` and
// `ServerName` are already equal.
if .addr.Attributes.Equal(.Attributes) {
return
}
}
return -1
}
// Get returns the value for the address in the map, if present.
func ( *AddressMap) ( Address) ( interface{}, bool) {
:= toMapKey(&)
:= .m[]
if := .find(); != -1 {
return [].value, true
}
return nil, false
}
// Set updates or adds the value to the address in the map.
func ( *AddressMap) ( Address, interface{}) {
:= toMapKey(&)
:= .m[]
if := .find(); != -1 {
[].value =
return
}
.m[] = append(, &addressMapEntry{addr: , value: })
}
// Delete removes addr from the map.
func ( *AddressMap) ( Address) {
:= toMapKey(&)
:= .m[]
:= .find()
if == -1 {
return
}
if len() == 1 {
= nil
} else {
copy([:], [+1:])
= [:len()-1]
}
.m[] =
}
// Len returns the number of entries in the map.
func ( *AddressMap) () int {
:= 0
for , := range .m {
+= len()
}
return
}
// Keys returns a slice of all current map keys.
func ( *AddressMap) () []Address {
:= make([]Address, 0, .Len())
for , := range .m {
for , := range {
= append(, .addr)
}
}
return
}
// Values returns a slice of all current map values.
func ( *AddressMap) () []interface{} {
:= make([]interface{}, 0, .Len())
for , := range .m {
for , := range {
= append(, .value)
}
}
return
}
The pages are generated with Golds v0.4.9. (GOOS=linux GOARCH=amd64)