iterator.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package libbox
  2. import "github.com/sagernet/sing/common"
  3. type StringIterator interface {
  4. Len() int32
  5. HasNext() bool
  6. Next() string
  7. }
  8. type Int32Iterator interface {
  9. Len() int32
  10. HasNext() bool
  11. Next() int32
  12. }
  13. var _ StringIterator = (*iterator[string])(nil)
  14. type iterator[T any] struct {
  15. values []T
  16. }
  17. func newIterator[T any](values []T) *iterator[T] {
  18. return &iterator[T]{values}
  19. }
  20. //go:noinline
  21. func newPtrIterator[T any](values []T) *iterator[*T] {
  22. return &iterator[*T]{common.Map(values, func(value T) *T { return &value })}
  23. }
  24. func (i *iterator[T]) Len() int32 {
  25. return int32(len(i.values))
  26. }
  27. func (i *iterator[T]) HasNext() bool {
  28. return len(i.values) > 0
  29. }
  30. func (i *iterator[T]) Next() T {
  31. if len(i.values) == 0 {
  32. return common.DefaultValue[T]()
  33. }
  34. nextValue := i.values[0]
  35. i.values = i.values[1:]
  36. return nextValue
  37. }
  38. type abstractIterator[T any] interface {
  39. Next() T
  40. HasNext() bool
  41. }
  42. func iteratorToArray[T any](iterator abstractIterator[T]) []T {
  43. if iterator == nil {
  44. return nil
  45. }
  46. var values []T
  47. for iterator.HasNext() {
  48. values = append(values, iterator.Next())
  49. }
  50. return values
  51. }