本文整理汇总了Golang中github.com/Workiva/go-datastructures/slice/skip.SkipList类的典型用法代码示例。如果您正苦于以下问题:Golang SkipList类的具体用法?Golang SkipList怎么用?Golang SkipList使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了SkipList类的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: apply
func (rt *skipListRT) apply(sl *skip.SkipList, dimension uint64,
interval rangetree.Interval, fn func(rangetree.Entry) bool) bool {
lowValue, highValue := interval.LowAtDimension(dimension), interval.HighAtDimension(dimension)
var e common.Comparator
for iter := sl.Iter(skipEntry(lowValue)); iter.Next(); {
e = iter.Value()
if int64(e.(keyed).key()) >= highValue {
break
}
if isLastDimension(dimension, rt.dimensions) {
if !fn(e.(*lastBundle).entry) {
return false
}
} else {
if !rt.apply(e.(*dimensionalBundle).sl, dimension+1, interval, fn) {
return false
}
}
}
return true
}
示例2: flatten
func (rt *skipListRT) flatten(sl *skip.SkipList, dimension uint64, entries *rangetree.Entries) {
lastDimension := isLastDimension(dimension, rt.dimensions)
for iter := sl.Iter(skipEntry(0)); iter.Next(); {
if lastDimension {
*entries = append(*entries, iter.Value().(*lastBundle).entry)
} else {
rt.flatten(iter.Value().(*dimensionalBundle).sl, dimension+1, entries)
}
}
}
示例3: deleteRecursive
// deleteRecursive is used by the delete logic. The recursion depth
// only goes as far as the number of dimensions, so this shouldn't be an
// issue.
func (rt *skipListRT) deleteRecursive(sl *skip.SkipList, dimension uint64,
entry rangetree.Entry) rangetree.Entry {
value := entry.ValueAtDimension(dimension)
if isLastDimension(dimension, rt.dimensions) {
entries := sl.Delete(skipEntry(value))
if entries[0] == nil {
return nil
}
rt.number--
return entries[0].(*lastBundle).entry
}
db, ok := sl.Get(skipEntry(value))[0].(*dimensionalBundle)
if !ok { // value was not found
return nil
}
result := rt.deleteRecursive(db.sl, dimension+1, entry)
if result == nil {
return nil
}
if db.sl.Len() == 0 {
sl.Delete(db)
}
return result
}
示例4: insert
func (rt *skipListRT) insert(sl *skip.SkipList, dimension, insertDimension uint64,
index, number int64, deleted, affected *rangetree.Entries) {
var e common.Comparator
lastDimension := isLastDimension(dimension, rt.dimensions)
affectedDimension := dimension == insertDimension
var iter skip.Iterator
if dimension == insertDimension {
iter = sl.Iter(skipEntry(index))
} else {
iter = sl.Iter(skipEntry(0))
}
var toDelete common.Comparators
if number < 0 {
toDelete = make(common.Comparators, 0, 100)
}
for iter.Next() {
e = iter.Value()
if !affectedDimension {
rt.insert(e.(*dimensionalBundle).sl, dimension+1,
insertDimension, index, number, deleted, affected,
)
continue
}
if needsDeletion(int64(e.(keyed).key()), index, number) {
toDelete = append(toDelete, e)
continue
}
if lastDimension {
e.(*lastBundle).id += uint64(number)
*affected = append(*affected, e.(*lastBundle).entry)
} else {
e.(*dimensionalBundle).id += uint64(number)
rt.flatten(e.(*dimensionalBundle).sl, dimension+1, affected)
}
}
if len(toDelete) > 0 {
for _, e := range toDelete {
if lastDimension {
*deleted = append(*deleted, e.(*lastBundle).entry)
} else {
rt.flatten(e.(*dimensionalBundle).sl, dimension+1, deleted)
}
}
sl.Delete(toDelete...)
}
}