mirror of
https://codeberg.org/scip/tablizer.git
synced 2025-12-18 04:51:05 +01:00
added
This commit is contained in:
15
vendor/github.com/zclconf/go-cty/cty/set/iterator.go
generated
vendored
Normal file
15
vendor/github.com/zclconf/go-cty/cty/set/iterator.go
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
package set
|
||||
|
||||
type Iterator[T any] struct {
|
||||
vals []T
|
||||
idx int
|
||||
}
|
||||
|
||||
func (it *Iterator[T]) Value() T {
|
||||
return it.vals[it.idx]
|
||||
}
|
||||
|
||||
func (it *Iterator[T]) Next() bool {
|
||||
it.idx++
|
||||
return it.idx < len(it.vals)
|
||||
}
|
||||
210
vendor/github.com/zclconf/go-cty/cty/set/ops.go
generated
vendored
Normal file
210
vendor/github.com/zclconf/go-cty/cty/set/ops.go
generated
vendored
Normal file
@@ -0,0 +1,210 @@
|
||||
package set
|
||||
|
||||
import (
|
||||
"sort"
|
||||
)
|
||||
|
||||
// Add inserts the given value into the receiving Set.
|
||||
//
|
||||
// This mutates the set in-place. This operation is not thread-safe.
|
||||
func (s Set[T]) Add(val T) {
|
||||
hv := s.rules.Hash(val)
|
||||
if _, ok := s.vals[hv]; !ok {
|
||||
s.vals[hv] = make([]T, 0, 1)
|
||||
}
|
||||
bucket := s.vals[hv]
|
||||
|
||||
// See if an equivalent value is already present
|
||||
for _, ev := range bucket {
|
||||
if s.rules.Equivalent(val, ev) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
s.vals[hv] = append(bucket, val)
|
||||
}
|
||||
|
||||
// Remove deletes the given value from the receiving set, if indeed it was
|
||||
// there in the first place. If the value is not present, this is a no-op.
|
||||
func (s Set[T]) Remove(val T) {
|
||||
hv := s.rules.Hash(val)
|
||||
bucket, ok := s.vals[hv]
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
for i, ev := range bucket {
|
||||
if s.rules.Equivalent(val, ev) {
|
||||
newBucket := make([]T, 0, len(bucket)-1)
|
||||
newBucket = append(newBucket, bucket[:i]...)
|
||||
newBucket = append(newBucket, bucket[i+1:]...)
|
||||
if len(newBucket) > 0 {
|
||||
s.vals[hv] = newBucket
|
||||
} else {
|
||||
delete(s.vals, hv)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Has returns true if the given value is in the receiving set, or false if
|
||||
// it is not.
|
||||
func (s Set[T]) Has(val T) bool {
|
||||
hv := s.rules.Hash(val)
|
||||
bucket, ok := s.vals[hv]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
for _, ev := range bucket {
|
||||
if s.rules.Equivalent(val, ev) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Copy performs a shallow copy of the receiving set, returning a new set
|
||||
// with the same rules and elements.
|
||||
func (s Set[T]) Copy() Set[T] {
|
||||
ret := NewSet(s.rules)
|
||||
for k, v := range s.vals {
|
||||
ret.vals[k] = v
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
// Iterator returns an iterator over values in the set. If the set's rules
|
||||
// implement OrderedRules then the result is ordered per those rules. If
|
||||
// no order is provided, or if it is not a total order, then the iteration
|
||||
// order is undefined but consistent for a particular version of cty. Do not
|
||||
// rely on specific ordering between cty releases unless the rules order is a
|
||||
// total order.
|
||||
//
|
||||
// The pattern for using the returned iterator is:
|
||||
//
|
||||
// it := set.Iterator()
|
||||
// for it.Next() {
|
||||
// val := it.Value()
|
||||
// // ...
|
||||
// }
|
||||
//
|
||||
// Once an iterator has been created for a set, the set *must not* be mutated
|
||||
// until the iterator is no longer in use.
|
||||
func (s Set[T]) Iterator() *Iterator[T] {
|
||||
vals := s.Values()
|
||||
|
||||
return &Iterator[T]{
|
||||
vals: vals,
|
||||
idx: -1,
|
||||
}
|
||||
}
|
||||
|
||||
// EachValue calls the given callback once for each value in the set, in an
|
||||
// undefined order that callers should not depend on.
|
||||
func (s Set[T]) EachValue(cb func(T)) {
|
||||
it := s.Iterator()
|
||||
for it.Next() {
|
||||
cb(it.Value())
|
||||
}
|
||||
}
|
||||
|
||||
// Values returns a slice of all the values in the set. If the set rules have
|
||||
// an order then the result is in that order. If no order is provided or if
|
||||
// it is not a total order then the result order is undefined, but consistent
|
||||
// for a particular set value within a specific release of cty.
|
||||
func (s Set[T]) Values() []T {
|
||||
var ret []T
|
||||
// Sort the bucketIds to ensure that we always traverse in a
|
||||
// consistent order.
|
||||
bucketIDs := make([]int, 0, len(s.vals))
|
||||
for id := range s.vals {
|
||||
bucketIDs = append(bucketIDs, id)
|
||||
}
|
||||
sort.Ints(bucketIDs)
|
||||
|
||||
for _, bucketID := range bucketIDs {
|
||||
ret = append(ret, s.vals[bucketID]...)
|
||||
}
|
||||
|
||||
if orderRules, ok := s.rules.(OrderedRules[T]); ok {
|
||||
sort.SliceStable(ret, func(i, j int) bool {
|
||||
return orderRules.Less(ret[i], ret[j])
|
||||
})
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
// Length returns the number of values in the set.
|
||||
func (s Set[T]) Length() int {
|
||||
var count int
|
||||
for _, bucket := range s.vals {
|
||||
count = count + len(bucket)
|
||||
}
|
||||
return count
|
||||
}
|
||||
|
||||
// Union returns a new set that contains all of the members of both the
|
||||
// receiving set and the given set. Both sets must have the same rules, or
|
||||
// else this function will panic.
|
||||
func (s1 Set[T]) Union(s2 Set[T]) Set[T] {
|
||||
mustHaveSameRules(s1, s2)
|
||||
rs := NewSet(s1.rules)
|
||||
s1.EachValue(func(v T) {
|
||||
rs.Add(v)
|
||||
})
|
||||
s2.EachValue(func(v T) {
|
||||
rs.Add(v)
|
||||
})
|
||||
return rs
|
||||
}
|
||||
|
||||
// Intersection returns a new set that contains the values that both the
|
||||
// receiver and given sets have in common. Both sets must have the same rules,
|
||||
// or else this function will panic.
|
||||
func (s1 Set[T]) Intersection(s2 Set[T]) Set[T] {
|
||||
mustHaveSameRules(s1, s2)
|
||||
rs := NewSet(s1.rules)
|
||||
s1.EachValue(func(v T) {
|
||||
if s2.Has(v) {
|
||||
rs.Add(v)
|
||||
}
|
||||
})
|
||||
return rs
|
||||
}
|
||||
|
||||
// Subtract returns a new set that contains all of the values from the receiver
|
||||
// that are not also in the given set. Both sets must have the same rules,
|
||||
// or else this function will panic.
|
||||
func (s1 Set[T]) Subtract(s2 Set[T]) Set[T] {
|
||||
mustHaveSameRules(s1, s2)
|
||||
rs := NewSet(s1.rules)
|
||||
s1.EachValue(func(v T) {
|
||||
if !s2.Has(v) {
|
||||
rs.Add(v)
|
||||
}
|
||||
})
|
||||
return rs
|
||||
}
|
||||
|
||||
// SymmetricDifference returns a new set that contains all of the values from
|
||||
// both the receiver and given sets, except those that both sets have in
|
||||
// common. Both sets must have the same rules, or else this function will
|
||||
// panic.
|
||||
func (s1 Set[T]) SymmetricDifference(s2 Set[T]) Set[T] {
|
||||
mustHaveSameRules(s1, s2)
|
||||
rs := NewSet(s1.rules)
|
||||
s1.EachValue(func(v T) {
|
||||
if !s2.Has(v) {
|
||||
rs.Add(v)
|
||||
}
|
||||
})
|
||||
s2.EachValue(func(v T) {
|
||||
if !s1.Has(v) {
|
||||
rs.Add(v)
|
||||
}
|
||||
})
|
||||
return rs
|
||||
}
|
||||
47
vendor/github.com/zclconf/go-cty/cty/set/rules.go
generated
vendored
Normal file
47
vendor/github.com/zclconf/go-cty/cty/set/rules.go
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
package set
|
||||
|
||||
// Rules represents the operations that define membership for a Set.
|
||||
//
|
||||
// Each Set has a Rules instance, whose methods must satisfy the interface
|
||||
// contracts given below for any value that will be added to the set.
|
||||
type Rules[T any] interface {
|
||||
// Hash returns an int that somewhat-uniquely identifies the given value.
|
||||
//
|
||||
// A good hash function will minimize collisions for values that will be
|
||||
// added to the set, though collisions *are* permitted. Collisions will
|
||||
// simply reduce the efficiency of operations on the set.
|
||||
Hash(T) int
|
||||
|
||||
// Equivalent returns true if and only if the two values are considered
|
||||
// equivalent for the sake of set membership. Two values that are
|
||||
// equivalent cannot exist in the set at the same time, and if two
|
||||
// equivalent values are added it is undefined which one will be
|
||||
// returned when enumerating all of the set members.
|
||||
//
|
||||
// Two values that are equivalent *must* result in the same hash value,
|
||||
// though it is *not* required that two values with the same hash value
|
||||
// be equivalent.
|
||||
Equivalent(T, T) bool
|
||||
|
||||
// SameRules returns true if the instance is equivalent to another Rules
|
||||
// instance over the same element type.
|
||||
SameRules(Rules[T]) bool
|
||||
}
|
||||
|
||||
// OrderedRules is an extension of Rules that can apply a partial order to
|
||||
// element values. When a set's Rules implements OrderedRules an iterator
|
||||
// over the set will return items in the order described by the rules.
|
||||
//
|
||||
// If the given order is not a total order (that is, some pairs of non-equivalent
|
||||
// elements do not have a defined order) then the resulting iteration order
|
||||
// is undefined but consistent for a particular version of cty. The exact
|
||||
// order in that case is not part of the contract and is subject to change
|
||||
// between versions.
|
||||
type OrderedRules[T any] interface {
|
||||
Rules[T]
|
||||
|
||||
// Less returns true if and only if the first argument should sort before
|
||||
// the second argument. If the second argument should sort before the first
|
||||
// or if there is no defined order for the values, return false.
|
||||
Less(interface{}, interface{}) bool
|
||||
}
|
||||
62
vendor/github.com/zclconf/go-cty/cty/set/set.go
generated
vendored
Normal file
62
vendor/github.com/zclconf/go-cty/cty/set/set.go
generated
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
package set
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Set is an implementation of the concept of a set: a collection where all
|
||||
// values are conceptually either in or out of the set, but the members are
|
||||
// not ordered.
|
||||
//
|
||||
// This type primarily exists to be the internal type of sets in cty, but
|
||||
// it is considered to be at the same level of abstraction as Go's built in
|
||||
// slice and map collection types, and so should make no cty-specific
|
||||
// assumptions.
|
||||
//
|
||||
// Set operations are not thread safe. It is the caller's responsibility to
|
||||
// provide mutex guarantees where necessary.
|
||||
//
|
||||
// Set operations are not optimized to minimize memory pressure. Mutating
|
||||
// a set will generally create garbage and so should perhaps be avoided in
|
||||
// tight loops where memory pressure is a concern.
|
||||
type Set[T any] struct {
|
||||
vals map[int][]T
|
||||
rules Rules[T]
|
||||
}
|
||||
|
||||
// NewSet returns an empty set with the membership rules given.
|
||||
func NewSet[T any](rules Rules[T]) Set[T] {
|
||||
return Set[T]{
|
||||
vals: map[int][]T{},
|
||||
rules: rules,
|
||||
}
|
||||
}
|
||||
|
||||
func NewSetFromSlice[T any](rules Rules[T], vals []T) Set[T] {
|
||||
s := NewSet(rules)
|
||||
for _, v := range vals {
|
||||
s.Add(v)
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func sameRules[T any](s1 Set[T], s2 Set[T]) bool {
|
||||
return s1.rules.SameRules(s2.rules)
|
||||
}
|
||||
|
||||
func mustHaveSameRules[T any](s1 Set[T], s2 Set[T]) {
|
||||
if !sameRules(s1, s2) {
|
||||
panic(fmt.Errorf("incompatible set rules: %#v, %#v", s1.rules, s2.rules))
|
||||
}
|
||||
}
|
||||
|
||||
// HasRules returns true if and only if the receiving set has the given rules
|
||||
// instance as its rules.
|
||||
func (s Set[T]) HasRules(rules Rules[T]) bool {
|
||||
return s.rules.SameRules(rules)
|
||||
}
|
||||
|
||||
// Rules returns the receiving set's rules instance.
|
||||
func (s Set[T]) Rules() Rules[T] {
|
||||
return s.rules
|
||||
}
|
||||
Reference in New Issue
Block a user