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

import * as flatbuffers from 'flatbuffers';



export class InParentNamespace implements flatbuffers.IUnpackableObject<InParentNamespaceT> {
  bb: flatbuffers.ByteBuffer|null = null;
  bb_pos = 0;
  __init(i:number, bb:flatbuffers.ByteBuffer):InParentNamespace {
  this.bb_pos = i;
  this.bb = bb;
  return this;
}

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

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

static getFullyQualifiedName():string {
  return 'MyGame_InParentNamespace';
}

static startInParentNamespace(builder:flatbuffers.Builder) {
  builder.startObject(0);
}

static endInParentNamespace(builder:flatbuffers.Builder):flatbuffers.Offset {
  const offset = builder.endObject();
  return offset;
}

static createInParentNamespace(builder:flatbuffers.Builder):flatbuffers.Offset {
  InParentNamespace.startInParentNamespace(builder);
  return InParentNamespace.endInParentNamespace(builder);
}

serialize():Uint8Array {
  return this.bb!.bytes();
}

static deserialize(buffer: Uint8Array):InParentNamespace {
  return InParentNamespace.getRootAsInParentNamespace(new flatbuffers.ByteBuffer(buffer))
}

unpack(): InParentNamespaceT {
  return new InParentNamespaceT();
}


unpackTo(_o: InParentNamespaceT): void {}
}

export class InParentNamespaceT implements flatbuffers.IGeneratedObject {
constructor(){}


pack(builder:flatbuffers.Builder): flatbuffers.Offset {
  return InParentNamespace.createInParentNamespace(builder);
}
}
