mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-11 15:37:27 +00:00
Add key lookup support for tables in Go (#7644)
* Add support for key lookup for tables in Go * Run clang format * Run go fmt on tests * Remove TODO in tests * Update LookupByKey API * Update LookupByKey API * Don't use resolvePointer in expectEq * Use generated getters instead of reading values directly from buffer * Fix typo Co-authored-by: Derek Bailey <derekbailey@google.com>
This commit is contained in:
@@ -67,6 +67,43 @@ func (rcv *Referrable) MutateId(n uint64) bool {
|
||||
return rcv._tab.MutateUint64Slot(4, n)
|
||||
}
|
||||
|
||||
func ReferrableKeyCompare(o1, o2 flatbuffers.UOffsetT, buf []byte) bool {
|
||||
obj1 := &Referrable{}
|
||||
obj2 := &Referrable{}
|
||||
obj1.Init(buf, flatbuffers.UOffsetT(len(buf)) - o1)
|
||||
obj2.Init(buf, flatbuffers.UOffsetT(len(buf)) - o2)
|
||||
return obj1.Id() < obj2.Id()
|
||||
}
|
||||
|
||||
func (rcv *Referrable) LookupByKey(key uint64, vectorLocation flatbuffers.UOffsetT, buf []byte) bool {
|
||||
span := flatbuffers.GetUOffsetT(buf[vectorLocation - 4:])
|
||||
start := flatbuffers.UOffsetT(0)
|
||||
for span != 0 {
|
||||
middle := span / 2
|
||||
tableOffset := flatbuffers.GetIndirectOffset(buf, vectorLocation+ 4 * (start + middle))
|
||||
obj := &Referrable{}
|
||||
obj.Init(buf, tableOffset)
|
||||
val := obj.Id()
|
||||
comp := 0
|
||||
if val > key {
|
||||
comp = 1
|
||||
} else if val < key {
|
||||
comp = -1
|
||||
}
|
||||
if comp > 0 {
|
||||
span = middle
|
||||
} else if comp < 0 {
|
||||
middle += 1
|
||||
start += middle
|
||||
span -= middle
|
||||
} else {
|
||||
rcv.Init(buf, tableOffset)
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func ReferrableStart(builder *flatbuffers.Builder) {
|
||||
builder.StartObject(1)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user