Created
May 15, 2016 22:38
-
-
Save mzaks/deac08a7ffc4c9cab60ec84a41adad67 to your computer and use it in GitHub Desktop.
Decoding FlatBuffers with struct API
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| struct FooBarStruct { | |
| var buffer : UnsafePointer<UInt8> = nil | |
| var myOffset : Offset = 0 | |
| var name: UnsafeBufferPointer<UInt8> { get { return getStringBuffer(buffer, getOffset(buffer, myOffset, propertyIndex: 1))! } } | |
| var rating: Float64 { get { return get(buffer, myOffset, propertyIndex: 2)! } } | |
| var postfix: UInt8 { get { return get(buffer, myOffset, propertyIndex: 3)! } } | |
| var sibling: Bar { get { return get(buffer, myOffset, propertyIndex: 0)! } } | |
| } | |
| struct FooBarContainerStruct { | |
| var buffer : UnsafePointer<UInt8> = nil | |
| var myOffset : Offset = 0 | |
| init(_ data : UnsafePointer<UInt8>) { | |
| self.buffer = data | |
| self.myOffset = UnsafePointer<Offset>(buffer.advancedBy(0)).memory | |
| self.list = ListStruct(buffer: buffer, myOffset: myOffset) // set up vector | |
| } | |
| // table properties | |
| var list : ListStruct | |
| var location: UnsafeBufferPointer<UInt8> { get { return getStringBuffer(buffer, getOffset(buffer, myOffset, propertyIndex: 3))! } } | |
| var fruit: Enum { get { return Enum(rawValue: get(buffer, myOffset, propertyIndex: 2, defaultValue: Enum.Apples.rawValue))! } } | |
| var initialized: Bool { get { return get(buffer, myOffset, propertyIndex: 1, defaultValue: false) } } | |
| // definition of table vector to provice nice subscripting etc | |
| struct ListStruct { | |
| var buffer : UnsafePointer<UInt8> = nil | |
| var myOffset : Offset = 0 | |
| let offsetList : Offset? | |
| init(buffer b: UnsafePointer<UInt8>, myOffset o: Offset ) | |
| { | |
| buffer = b | |
| myOffset = o | |
| offsetList = getOffset(buffer, myOffset, propertyIndex: 0) // cache to make subscript faster | |
| } | |
| var count : Int { get { return getVectorLength(buffer, offsetList) } } | |
| subscript (index : Int) -> FooBarStruct { | |
| let ofs = getVectorOffsetElement(buffer, offsetList!, index: index)! | |
| return FooBarStruct(buffer: buffer, myOffset: ofs) | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment