diff --git a/netmap/aggregator.go b/netmap/aggregator.go index 0f577a0..433a3ba 100644 --- a/netmap/aggregator.go +++ b/netmap/aggregator.go @@ -1,8 +1,6 @@ package netmap -import ( - "sort" -) +import "slices" type ( // aggregator can calculate some value across all netmap @@ -128,7 +126,7 @@ func (a *meanIQRAgg) Compute() float64 { return 0 } - sort.Slice(a.arr, func(i, j int) bool { return a.arr[i] < a.arr[j] }) + slices.Sort(a.arr) var min, max float64 diff --git a/netmap/node_info.go b/netmap/node_info.go index 8f323f7..bd37388 100644 --- a/netmap/node_info.go +++ b/netmap/node_info.go @@ -3,7 +3,7 @@ package netmap import ( "errors" "fmt" - "sort" + "slices" "strconv" "strings" @@ -227,14 +227,6 @@ func (x NodeInfo) Hash() uint64 { return hrw.Hash(x.m.GetPublicKey()) } -// less declares "less than" comparison between two NodeInfo instances: -// x1 is less than x2 if it has less Hash(). -// -// Method is needed for internal placement needs. -func less(x1, x2 NodeInfo) bool { - return x1.Hash() < x2.Hash() -} - func (x *NodeInfo) setNumericAttribute(key string, num uint64) { x.SetAttribute(key, strconv.FormatUint(num, 10)) } @@ -455,15 +447,11 @@ func (x *NodeInfo) SortAttributes() { return } - sort.Slice(as, func(i, j int) bool { - switch strings.Compare(as[i].GetKey(), as[j].GetKey()) { - case -1: - return true - case 1: - return false - default: - return as[i].GetValue() < as[j].GetValue() + slices.SortFunc(as, func(ai, aj netmap.Attribute) int { + if r := strings.Compare(ai.GetKey(), aj.GetKey()); r != 0 { + return r } + return strings.Compare(ai.GetValue(), aj.GetValue()) }) x.m.SetAttributes(as) diff --git a/netmap/selector.go b/netmap/selector.go index f9247ff..d57a89d 100644 --- a/netmap/selector.go +++ b/netmap/selector.go @@ -1,8 +1,9 @@ package netmap import ( + "cmp" "fmt" - "sort" + "slices" "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap" "git.frostfs.info/TrueCloudLab/hrw" @@ -70,12 +71,12 @@ func (c *context) getSelection(s netmap.Selector) ([]nodes, error) { // we also need to have deterministic input to HRW sorting routine. if len(c.hrwSeed) == 0 { if s.GetAttribute() == "" { - sort.Slice(buckets, func(i, j int) bool { - return less(buckets[i].nodes[0], buckets[j].nodes[0]) + slices.SortFunc(buckets, func(b1, b2 nodeAttrPair) int { + return cmp.Compare(b1.nodes[0].Hash(), b2.nodes[0].Hash()) }) } else { - sort.Slice(buckets, func(i, j int) bool { - return buckets[i].attr < buckets[j].attr + slices.SortFunc(buckets, func(b1, b2 nodeAttrPair) int { + return cmp.Compare(b1.attr, b2.attr) }) } } diff --git a/netmap/selector_test.go b/netmap/selector_test.go index 934ff7e..0f0dd24 100644 --- a/netmap/selector_test.go +++ b/netmap/selector_test.go @@ -1,11 +1,12 @@ package netmap import ( + "cmp" "crypto/rand" "encoding/binary" "fmt" mrand "math/rand" - "sort" + "slices" "strconv" "testing" @@ -85,8 +86,8 @@ func BenchmarkHRWSort(b *testing.B) { copy(realNodes, vectors) b.StartTimer() - sort.Slice(vectors, func(i, j int) bool { - return less(vectors[i][0], vectors[j][0]) + slices.SortFunc(vectors, func(vi, vj nodes) int { + return cmp.Compare(vi[0].Hash(), vj[0].Hash()) }) hrw.SortSliceByWeightIndex(realNodes, weights, pivot) }