Use Go 1.21 Ordered and clear for sets
Go 1.21 provides its own type constraint permitting ordered types, cmp.Ordered; use that instead of the private ordered constraint. Go 1.21 introduces a clear function for maps, use that to clear sets. Signed-off-by: Stephen Kitt <skitt@redhat.com>
This commit is contained in:
		@@ -1,53 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2022 The Kubernetes 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 sets
 | 
			
		||||
 | 
			
		||||
// ordered is a constraint that permits any ordered type: any type
 | 
			
		||||
// that supports the operators < <= >= >.
 | 
			
		||||
// If future releases of Go add new ordered types,
 | 
			
		||||
// this constraint will be modified to include them.
 | 
			
		||||
type ordered interface {
 | 
			
		||||
	integer | float | ~string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// integer is a constraint that permits any integer type.
 | 
			
		||||
// If future releases of Go add new predeclared integer types,
 | 
			
		||||
// this constraint will be modified to include them.
 | 
			
		||||
type integer interface {
 | 
			
		||||
	signed | unsigned
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// float is a constraint that permits any floating-point type.
 | 
			
		||||
// If future releases of Go add new predeclared floating-point types,
 | 
			
		||||
// this constraint will be modified to include them.
 | 
			
		||||
type float interface {
 | 
			
		||||
	~float32 | ~float64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// signed is a constraint that permits any signed integer type.
 | 
			
		||||
// If future releases of Go add new predeclared signed integer types,
 | 
			
		||||
// this constraint will be modified to include them.
 | 
			
		||||
type signed interface {
 | 
			
		||||
	~int | ~int8 | ~int16 | ~int32 | ~int64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// unsigned is a constraint that permits any unsigned integer type.
 | 
			
		||||
// If future releases of Go add new predeclared unsigned integer types,
 | 
			
		||||
// this constraint will be modified to include them.
 | 
			
		||||
type unsigned interface {
 | 
			
		||||
	~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr
 | 
			
		||||
}
 | 
			
		||||
@@ -17,6 +17,7 @@ limitations under the License.
 | 
			
		||||
package sets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"cmp"
 | 
			
		||||
	"sort"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -67,14 +68,8 @@ func (s Set[T]) Delete(items ...T) Set[T] {
 | 
			
		||||
// Clear empties the set.
 | 
			
		||||
// It is preferable to replace the set with a newly constructed set,
 | 
			
		||||
// but not all callers can do that (when there are other references to the map).
 | 
			
		||||
// In some cases the set *won't* be fully cleared, e.g. a Set[float32] containing NaN
 | 
			
		||||
// can't be cleared because NaN can't be removed.
 | 
			
		||||
// For sets containing items of a type that is reflexive for ==,
 | 
			
		||||
// this is optimized to a single call to runtime.mapclear().
 | 
			
		||||
func (s Set[T]) Clear() Set[T] {
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		delete(s, key)
 | 
			
		||||
	}
 | 
			
		||||
	clear(s)
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -193,7 +188,7 @@ func (s1 Set[T]) Equal(s2 Set[T]) bool {
 | 
			
		||||
	return len(s1) == len(s2) && s1.IsSuperset(s2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type sortableSliceOfGeneric[T ordered] []T
 | 
			
		||||
type sortableSliceOfGeneric[T cmp.Ordered] []T
 | 
			
		||||
 | 
			
		||||
func (g sortableSliceOfGeneric[T]) Len() int           { return len(g) }
 | 
			
		||||
func (g sortableSliceOfGeneric[T]) Less(i, j int) bool { return less[T](g[i], g[j]) }
 | 
			
		||||
@@ -203,7 +198,7 @@ func (g sortableSliceOfGeneric[T]) Swap(i, j int)      { g[i], g[j] = g[j], g[i]
 | 
			
		||||
//
 | 
			
		||||
// This is a separate function and not a method because not all types supported
 | 
			
		||||
// by Generic are ordered and only those can be sorted.
 | 
			
		||||
func List[T ordered](s Set[T]) []T {
 | 
			
		||||
func List[T cmp.Ordered](s Set[T]) []T {
 | 
			
		||||
	res := make(sortableSliceOfGeneric[T], 0, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		res = append(res, key)
 | 
			
		||||
@@ -236,6 +231,6 @@ func (s Set[T]) Len() int {
 | 
			
		||||
	return len(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func less[T ordered](lhs, rhs T) bool {
 | 
			
		||||
func less[T cmp.Ordered](lhs, rhs T) bool {
 | 
			
		||||
	return lhs < rhs
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user