// automatically generated by the FlatBuffers compiler, do not modify

import * as flatbuffers from 'flatbuffers';

export class Foo {
  bb: flatbuffers.ByteBuffer|null = null;
  bb_pos = 0;
  __init(i:number, bb:flatbuffers.ByteBuffer):Foo {
  this.bb_pos = i;
  this.bb = bb;
  return this;
}

static getRootAsFoo(bb:flatbuffers.ByteBuffer, obj?:Foo):Foo {
  return (obj || new Foo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
}

static getSizePrefixedRootAsFoo(bb:flatbuffers.ByteBuffer, obj?:Foo):Foo {
  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
  return (obj || new Foo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
}

strA():string|null
strA(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
strA(optionalEncoding?:any):string|Uint8Array|null {
  const offset = this.bb!.__offset(this.bb_pos, 4);
  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
}

strB():string|null
strB(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
strB(optionalEncoding?:any):string|Uint8Array|null {
  const offset = this.bb!.__offset(this.bb_pos, 6);
  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
}

static startFoo(builder:flatbuffers.Builder) {
  builder.startObject(2);
}

static addStrA(builder:flatbuffers.Builder, strAOffset:flatbuffers.Offset) {
  builder.addFieldOffset(0, strAOffset, 0);
}

static addStrB(builder:flatbuffers.Builder, strBOffset:flatbuffers.Offset) {
  builder.addFieldOffset(1, strBOffset, 0);
}

static endFoo(builder:flatbuffers.Builder):flatbuffers.Offset {
  const offset = builder.endObject();
  builder.requiredField(offset, 4) // str_a
  builder.requiredField(offset, 6) // str_b
  return offset;
}

static createFoo(builder:flatbuffers.Builder, strAOffset:flatbuffers.Offset, strBOffset:flatbuffers.Offset):flatbuffers.Offset {
  Foo.startFoo(builder);
  Foo.addStrA(builder, strAOffset);
  Foo.addStrB(builder, strBOffset);
  return Foo.endFoo(builder);
}
}
