summaryrefslogtreecommitdiff
path: root/vendor/github.com/bytedance/sonic/ast/iterator.go
diff options
context:
space:
mode:
authorLibravatar dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>2023-11-27 13:15:03 +0000
committerLibravatar GitHub <noreply@github.com>2023-11-27 13:15:03 +0000
commit66b77acb1c8b86f0be3836ccaf31683c0bfa317a (patch)
tree9a255a8ea8ef97229b6d75d17de45bdac1755be9 /vendor/github.com/bytedance/sonic/ast/iterator.go
parent[bugfix] Add Actor to outgoing poll vote Create; other fixes (#2384) (diff)
downloadgotosocial-66b77acb1c8b86f0be3836ccaf31683c0bfa317a.tar.xz
[chore]: Bump github.com/gin-contrib/cors from 1.4.0 to 1.5.0 (#2388)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Diffstat (limited to 'vendor/github.com/bytedance/sonic/ast/iterator.go')
-rw-r--r--vendor/github.com/bytedance/sonic/ast/iterator.go75
1 files changed, 53 insertions, 22 deletions
diff --git a/vendor/github.com/bytedance/sonic/ast/iterator.go b/vendor/github.com/bytedance/sonic/ast/iterator.go
index 03a25b4e9..3c4187a9c 100644
--- a/vendor/github.com/bytedance/sonic/ast/iterator.go
+++ b/vendor/github.com/bytedance/sonic/ast/iterator.go
@@ -82,26 +82,54 @@ type ObjectIterator struct {
Iterator
}
+func (self *ListIterator) next() *Node {
+next_start:
+ if !self.HasNext() {
+ return nil
+ } else {
+ n := self.p.nodeAt(self.i)
+ self.i++
+ if !n.Exists() {
+ goto next_start
+ }
+ return n
+ }
+}
+
// Next scans through children of underlying V_ARRAY,
// copies each child to v, and returns .HasNext().
func (self *ListIterator) Next(v *Node) bool {
- if !self.HasNext() {
+ n := self.next()
+ if n == nil {
return false
+ }
+ *v = *n
+ return true
+}
+
+func (self *ObjectIterator) next() *Pair {
+next_start:
+ if !self.HasNext() {
+ return nil
} else {
- *v, self.i = *self.p.nodeAt(self.i), self.i + 1
- return true
+ n := self.p.pairAt(self.i)
+ self.i++
+ if !n.Value.Exists() {
+ goto next_start
+ }
+ return n
}
}
// Next scans through children of underlying V_OBJECT,
// copies each child to v, and returns .HasNext().
func (self *ObjectIterator) Next(p *Pair) bool {
- if !self.HasNext() {
+ n := self.next()
+ if n == nil {
return false
- } else {
- *p, self.i = *self.p.pairAt(self.i), self.i + 1
- return true
}
+ *p = *n
+ return true
}
// Sequence represents scanning path of single-layer nodes.
@@ -129,36 +157,39 @@ type Scanner func(path Sequence, node *Node) bool
//
// Especailly, if the node is not V_ARRAY or V_OBJECT,
// the node itself will be returned and Sequence.Index == -1.
+//
+// NOTICE: A unsetted node WON'T trigger sc, but its index still counts into Path.Index
func (self *Node) ForEach(sc Scanner) error {
switch self.itype() {
case types.V_ARRAY:
- ns, err := self.UnsafeArray()
+ iter, err := self.Values()
if err != nil {
return err
}
- for i := range ns {
- if !sc(Sequence{i, nil}, &ns[i]) {
- return err
+ v := iter.next()
+ for v != nil {
+ if !sc(Sequence{iter.i-1, nil}, v) {
+ return nil
}
+ v = iter.next()
}
case types.V_OBJECT:
- ns, err := self.UnsafeMap()
+ iter, err := self.Properties()
if err != nil {
return err
}
- for i := range ns {
- if !sc(Sequence{i, &ns[i].Key}, &ns[i].Value) {
- return err
+ v := iter.next()
+ for v != nil {
+ if !sc(Sequence{iter.i-1, &v.Key}, &v.Value) {
+ return nil
}
+ v = iter.next()
}
default:
+ if self.Check() != nil {
+ return self
+ }
sc(Sequence{-1, nil}, self)
}
- return self.Check()
+ return nil
}
-
-type PairSlice []Pair
-
-func (self PairSlice) Sort() {
- radixQsort(self, 0, maxDepth(len(self)))
-} \ No newline at end of file