Skip to content

Instantly share code, notes, and snippets.

@mish15
Created June 23, 2015 00:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mish15/778a66e9e79a5dbe179f to your computer and use it in GitHub Desktop.
Save mish15/778a66e9e79a5dbe179f to your computer and use it in GitHub Desktop.
flatbuffers pack nested vector
func (term *Term) Encode(version string) []byte {
builder := flatbuffers.NewBuilder(0)
// Preprocess the shotguns
shotguns := make([]flatbuffers.UOffsetT, len(term.Shotgun))
shotgunStrs := make([]flatbuffers.UOffsetT, len(term.Shotgun))
for i := 0; i < len(term.Shotgun); i++ {
shotgunStrs[i] = builder.CreateString(term.Shotgun[i].Term)
}
for i := 0; i < len(term.Shotgun); i++ {
sjfb.ShotgunStart(builder)
sjfb.ShotgunAddTerm(builder, shotgunStrs[i])
sjfb.ShotgunAddPotency(builder, term.Shotgun[i].Potency)
shotguns[i] = sjfb.ShotgunEnd(builder)
}
sjfb.TermStartShotgunVector(builder, len(term.Shotgun))
for i := len(term.Shotgun) - 1; i >= 0; i-- {
//for i := 0; i < len(term.Shotgun); i++ {
builder.PrependUOffsetT(shotguns[i])
}
shotgun_vec := builder.EndVector(len(term.Shotgun))
// Preprocess the clues
clueStrs := make([]flatbuffers.UOffsetT, len(term.Clues))
introStrs := make([]flatbuffers.UOffsetT, len(term.Clues))
for i := 0; i < len(term.Clues); i++ {
clueStrs[i] = builder.CreateString(term.Clues[i].Term)
}
for i := 0; i < len(term.Clues); i++ {
introStrs[i] = builder.CreateString(term.Clues[i].Intro)
}
clues := make([]flatbuffers.UOffsetT, len(term.Clues))
for i := 0; i < len(term.Clues); i++ {
sjfb.ClueStart(builder)
sjfb.ClueAddTerm(builder, clueStrs[i])
sjfb.ClueAddIntro(builder, introStrs[i])
sjfb.ClueAddPotency(builder, term.Clues[i].Potency)
clues[i] = sjfb.ClueEnd(builder)
}
sjfb.TermStartCluesVector(builder, len(term.Clues))
for i := len(term.Clues) - 1; i >= 0; i-- {
//for i := 0; i < len(term.Clues); i++ {
builder.PrependUOffsetT(clues[i])
}
clues_vec := builder.EndVector(len(term.Clues))
// Start packing the final term
sjfb.TermStart(builder)
termStr := builder.CreateString(term.TermStr)
sjfb.TermAddTermStr(builder, termStr)
sjfb.TermAddSlot(builder, term.Slot)
sjfb.TermAddNumDocuments(builder, term.NumDocuments)
sjfb.TermAddNumWords(builder, int16(term.NumWords))
sjfb.TermAddShotgun(builder, shotgun_vec)
sjfb.TermAddClues(builder, clues_vec)
sjfb.TermAddInteractionPos(builder, int16(term.InteractionsPos))
sjfb.TermAddInteractionNeg(builder, int16(term.InteractionsNeg))
sjfb.TermAddHardcodedScore(builder, int16(term.HardcodedScore))
sjfb.TermAddInfogain(builder, term.Infogain)
obj := sjfb.TermEnd(builder)
builder.Finish(obj)
return builder.Bytes[builder.Head():]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment