summaryrefslogtreecommitdiff
path: root/vendor/github.com/minio/minio-go/v7/pkg/set
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/minio/minio-go/v7/pkg/set')
-rw-r--r--vendor/github.com/minio/minio-go/v7/pkg/set/msgp.go149
-rw-r--r--vendor/github.com/minio/minio-go/v7/pkg/set/stringset.go30
2 files changed, 176 insertions, 3 deletions
diff --git a/vendor/github.com/minio/minio-go/v7/pkg/set/msgp.go b/vendor/github.com/minio/minio-go/v7/pkg/set/msgp.go
new file mode 100644
index 000000000..7d3c3620b
--- /dev/null
+++ b/vendor/github.com/minio/minio-go/v7/pkg/set/msgp.go
@@ -0,0 +1,149 @@
+/*
+ * MinIO Go Library for Amazon S3 Compatible Cloud Storage
+ * Copyright 2015-2025 MinIO, Inc.
+ *
+ * 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 set
+
+import "github.com/tinylib/msgp/msgp"
+
+// EncodeMsg encodes the message to the writer.
+// Values are stored as a slice of strings or nil.
+func (s StringSet) EncodeMsg(writer *msgp.Writer) error {
+ if s == nil {
+ return writer.WriteNil()
+ }
+ err := writer.WriteArrayHeader(uint32(len(s)))
+ if err != nil {
+ return err
+ }
+ sorted := s.ToByteSlices()
+ for _, k := range sorted {
+ err = writer.WriteStringFromBytes(k)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// MarshalMsg encodes the message to the bytes.
+// Values are stored as a slice of strings or nil.
+func (s StringSet) MarshalMsg(bytes []byte) ([]byte, error) {
+ if s == nil {
+ return msgp.AppendNil(bytes), nil
+ }
+ if len(s) == 0 {
+ return msgp.AppendArrayHeader(bytes, 0), nil
+ }
+ bytes = msgp.AppendArrayHeader(bytes, uint32(len(s)))
+ sorted := s.ToByteSlices()
+ for _, k := range sorted {
+ bytes = msgp.AppendStringFromBytes(bytes, k)
+ }
+ return bytes, nil
+}
+
+// DecodeMsg decodes the message from the reader.
+func (s *StringSet) DecodeMsg(reader *msgp.Reader) error {
+ if reader.IsNil() {
+ *s = nil
+ return reader.Skip()
+ }
+ sz, err := reader.ReadArrayHeader()
+ if err != nil {
+ return err
+ }
+ dst := *s
+ if dst == nil {
+ dst = make(StringSet, sz)
+ } else {
+ for k := range dst {
+ delete(dst, k)
+ }
+ }
+ for i := uint32(0); i < sz; i++ {
+ var k string
+ k, err = reader.ReadString()
+ if err != nil {
+ return err
+ }
+ dst[k] = struct{}{}
+ }
+ *s = dst
+ return nil
+}
+
+// UnmarshalMsg decodes the message from the bytes.
+func (s *StringSet) UnmarshalMsg(bytes []byte) ([]byte, error) {
+ if msgp.IsNil(bytes) {
+ *s = nil
+ return bytes[msgp.NilSize:], nil
+ }
+ // Read the array header
+ sz, bytes, err := msgp.ReadArrayHeaderBytes(bytes)
+ if err != nil {
+ return nil, err
+ }
+ dst := *s
+ if dst == nil {
+ dst = make(StringSet, sz)
+ } else {
+ for k := range dst {
+ delete(dst, k)
+ }
+ }
+ for i := uint32(0); i < sz; i++ {
+ var k string
+ k, bytes, err = msgp.ReadStringBytes(bytes)
+ if err != nil {
+ return nil, err
+ }
+ dst[k] = struct{}{}
+ }
+ *s = dst
+ return bytes, nil
+}
+
+// Msgsize returns the maximum size of the message.
+func (s StringSet) Msgsize() int {
+ if s == nil {
+ return msgp.NilSize
+ }
+ if len(s) == 0 {
+ return msgp.ArrayHeaderSize
+ }
+ size := msgp.ArrayHeaderSize
+ for key := range s {
+ size += msgp.StringPrefixSize + len(key)
+ }
+ return size
+}
+
+// MarshalBinary encodes the receiver into a binary form and returns the result.
+func (s StringSet) MarshalBinary() ([]byte, error) {
+ return s.MarshalMsg(nil)
+}
+
+// AppendBinary appends the binary representation of itself to the end of b
+func (s StringSet) AppendBinary(b []byte) ([]byte, error) {
+ return s.MarshalMsg(b)
+}
+
+// UnmarshalBinary decodes the binary representation of itself from b
+func (s *StringSet) UnmarshalBinary(b []byte) error {
+ _, err := s.UnmarshalMsg(b)
+ return err
+}
diff --git a/vendor/github.com/minio/minio-go/v7/pkg/set/stringset.go b/vendor/github.com/minio/minio-go/v7/pkg/set/stringset.go
index c265ce572..8aa92212b 100644
--- a/vendor/github.com/minio/minio-go/v7/pkg/set/stringset.go
+++ b/vendor/github.com/minio/minio-go/v7/pkg/set/stringset.go
@@ -21,7 +21,7 @@ import (
"fmt"
"sort"
- "github.com/goccy/go-json"
+ "github.com/minio/minio-go/v7/internal/json"
)
// StringSet - uses map as set of strings.
@@ -37,6 +37,30 @@ func (set StringSet) ToSlice() []string {
return keys
}
+// ToByteSlices - returns StringSet as a sorted
+// slice of byte slices, using only one allocation.
+func (set StringSet) ToByteSlices() [][]byte {
+ length := 0
+ for k := range set {
+ length += len(k)
+ }
+ // Preallocate the slice with the total length of all strings
+ // to avoid multiple allocations.
+ dst := make([]byte, length)
+
+ // Add keys to this...
+ keys := make([][]byte, 0, len(set))
+ for k := range set {
+ n := copy(dst, k)
+ keys = append(keys, dst[:n])
+ dst = dst[n:]
+ }
+ sort.Slice(keys, func(i, j int) bool {
+ return string(keys[i]) < string(keys[j])
+ })
+ return keys
+}
+
// IsEmpty - returns whether the set is empty or not.
func (set StringSet) IsEmpty() bool {
return len(set) == 0
@@ -178,7 +202,7 @@ func NewStringSet() StringSet {
// CreateStringSet - creates new string set with given string values.
func CreateStringSet(sl ...string) StringSet {
- set := make(StringSet)
+ set := make(StringSet, len(sl))
for _, k := range sl {
set.Add(k)
}
@@ -187,7 +211,7 @@ func CreateStringSet(sl ...string) StringSet {
// CopyStringSet - returns copy of given set.
func CopyStringSet(set StringSet) StringSet {
- nset := NewStringSet()
+ nset := make(StringSet, len(set))
for k, v := range set {
nset[k] = v
}