Skip to content

Instantly share code, notes, and snippets.

@jmcguirk
Created January 28, 2016 18:37
Show Gist options
  • Save jmcguirk/d7705f6b92ea4c57c045 to your computer and use it in GitHub Desktop.
Save jmcguirk/d7705f6b92ea4c57c045 to your computer and use it in GitHub Desktop.
FlatBuffers caching proof of concept
{
"Reference" :{
"TestValue": "A"
}
}
// automatically generated, do not modify
namespace TestData
{
using System;
using FlatBuffers;
public partial class AnotherTable : Table {
public static AnotherTable GetRootAsAnotherTable(ByteBuffer _bb) { return GetRootAsAnotherTable(_bb, new AnotherTable()); }
public static AnotherTable GetRootAsAnotherTable(ByteBuffer _bb, AnotherTable obj) { return (obj.__init(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public AnotherTable __init(int _i, ByteBuffer _bb) { bb_pos = _i; bb = _bb; return this; }
public string TestValue { get { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; } }
public ArraySegment<byte>? GetTestValueBytes() { return __vector_as_arraysegment(4); }
public static Offset<AnotherTable> CreateAnotherTable(FlatBufferBuilder builder,
StringOffset TestValueOffset = default(StringOffset)) {
builder.StartObject(1);
AnotherTable.AddTestValue(builder, TestValueOffset);
return AnotherTable.EndAnotherTable(builder);
}
public static void StartAnotherTable(FlatBufferBuilder builder) { builder.StartObject(1); }
public static void AddTestValue(FlatBufferBuilder builder, StringOffset TestValueOffset) { builder.AddOffset(0, TestValueOffset.Value, 0); }
public static Offset<AnotherTable> EndAnotherTable(FlatBufferBuilder builder) {
int o = builder.EndObject();
return new Offset<AnotherTable>(o);
}
};
}
{
"Reference" :{
"TestValue": "B"
}
}
// automatically generated, do not modify
namespace TestData
{
using System;
using FlatBuffers;
public partial class Container : Table {
public static Container GetRootAsContainer(ByteBuffer _bb) { return GetRootAsContainer(_bb, new Container()); }
public static Container GetRootAsContainer(ByteBuffer _bb, Container obj) { return (obj.__init(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public static bool ContainerBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, "TEST"); }
public Container __init(int _i, ByteBuffer _bb) { bb_pos = _i; bb = _bb; return this; }
protected AnotherTable m_Reference;
public AnotherTable Reference { get { if( m_Reference==null){ m_Reference = GetReference(new AnotherTable()); }return m_Reference;}}
public AnotherTable GetReference(AnotherTable obj) { int o = __offset(4); return o != 0 ? obj.__init(__indirect(o + bb_pos), bb) : null; }
public static Offset<Container> CreateContainer(FlatBufferBuilder builder,
Offset<AnotherTable> ReferenceOffset = default(Offset<AnotherTable>)) {
builder.StartObject(1);
Container.AddReference(builder, ReferenceOffset);
return Container.EndContainer(builder);
}
public static void StartContainer(FlatBufferBuilder builder) { builder.StartObject(1); }
public static void AddReference(FlatBufferBuilder builder, Offset<AnotherTable> ReferenceOffset) { builder.AddOffset(0, ReferenceOffset.Value, 0); }
public static Offset<Container> EndContainer(FlatBufferBuilder builder) {
int o = builder.EndObject();
return new Offset<Container>(o);
}
public static void FinishContainerBuffer(FlatBufferBuilder builder, Offset<Container> offset) { builder.Finish(offset.Value, "TEST"); }
};
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System;
using System.Reflection;
using FlatBuffers;
using System.IO;
using UnityEditor;
using UnityEngine;
using TestData;
public class FlatBuffersTestMenu : Editor
{
[MenuItem("FlatBuffers/Run Cache Test")]
public static void RunCacheTest() {
string fileAPath = Path.Combine(Application.dataPath, "A.bin");
string fileBPath = Path.Combine(Application.dataPath, "B.bin");
ByteBuffer bufferA = new ByteBuffer(File.ReadAllBytes(fileAPath));
ByteBuffer bufferB = new ByteBuffer(File.ReadAllBytes(fileBPath));
Container containerA = Container.GetRootAsContainer(bufferA);
Debug.Log("Reference test value for object A is " + containerA.Reference.TestValue);
bool equalityCheckA = containerA.Reference == containerA.Reference;
Debug.Log("Reference Equality check on object A " + equalityCheckA);
Container containerB = Container.GetRootAsContainer(bufferB);
Debug.Log("Reference test value for object B is " + containerB.Reference.TestValue);
bool equalityCheckB = containerB.Reference == containerB.Reference;
Debug.Log("Reference Equality check on object B " + equalityCheckB);
Debug.Log("Double check reference test value for object A is " + containerA.Reference.TestValue);
bool crossEqualityCheck = containerA.Reference == containerB.Reference;
Debug.Log("Equality cross check " + crossEqualityCheck);
}
}
Reference test value for object A is A
Reference Equality check on object A True
Reference test value for object B is B
Reference Equality check on object B True
Double check reference test value for object A is A
Equality cross check False
namespace TestData;
table Container{
Reference:AnotherTable;
}
table AnotherTable{
TestValue:string;
}
root_type Container;
file_identifier "TEST";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment