diff options
Diffstat (limited to 'swift/Sources')
-rw-r--r-- | swift/Sources/FlatBuffers/ByteBuffer.swift | 29 | ||||
-rw-r--r-- | swift/Sources/FlatBuffers/FlatBufferBuilder.swift | 6 | ||||
-rw-r--r-- | swift/Sources/FlatBuffers/FlatBufferObject.swift | 1 | ||||
-rw-r--r-- | swift/Sources/FlatBuffers/Message.swift | 41 |
4 files changed, 77 insertions, 0 deletions
diff --git a/swift/Sources/FlatBuffers/ByteBuffer.swift b/swift/Sources/FlatBuffers/ByteBuffer.swift index cbe3cd05..0c523178 100644 --- a/swift/Sources/FlatBuffers/ByteBuffer.swift +++ b/swift/Sources/FlatBuffers/ByteBuffer.swift @@ -51,6 +51,35 @@ public final class ByteBuffer { _memory.initializeMemory(as: UInt8.self, repeating: 0, count: size) _capacity = size } + +#if swift(>=5.0) + /// Constructor that creates a Flatbuffer object from a ContiguousBytes + /// - Parameters: + /// - contiguousBytes: Binary stripe to use as the buffer + /// - count: amount of readable bytes + public init<Bytes: ContiguousBytes>( + contiguousBytes: Bytes, + count: Int + ) { + _memory = UnsafeMutableRawPointer.allocate(byteCount: count, alignment: alignment) + _capacity = count + _writerSize = _capacity + contiguousBytes.withUnsafeBytes { buf in + _memory.copyMemory(from: buf.baseAddress!, byteCount: buf.count) + } + } +#endif + + /// Creates a copy of the buffer that's being built by calling sizedBuffer + /// - Parameters: + /// - memory: Current memory of the buffer + /// - count: count of bytes + internal init(memory: UnsafeMutableRawPointer, count: Int) { + _memory = UnsafeMutableRawPointer.allocate(byteCount: count, alignment: alignment) + _memory.copyMemory(from: memory, byteCount: count) + _capacity = count + _writerSize = _capacity + } /// Creates a copy of the existing flatbuffer, by copying it to a different memory. /// - Parameters: diff --git a/swift/Sources/FlatBuffers/FlatBufferBuilder.swift b/swift/Sources/FlatBuffers/FlatBufferBuilder.swift index 9a4ed3d0..cf479fd6 100644 --- a/swift/Sources/FlatBuffers/FlatBufferBuilder.swift +++ b/swift/Sources/FlatBuffers/FlatBufferBuilder.swift @@ -50,6 +50,12 @@ public final class FlatBufferBuilder { /// Returns the buffer public var buffer: ByteBuffer { return _bb } + /// Returns A sized Buffer from the readable bytes + public var sizedBuffer: ByteBuffer { + assert(finished, "Data shouldn't be called before finish()") + return ByteBuffer(memory: _bb.memory.advanced(by: _bb.reader), count: _bb.reader) + } + // MARK: - Init /// initialize the buffer with a size diff --git a/swift/Sources/FlatBuffers/FlatBufferObject.swift b/swift/Sources/FlatBuffers/FlatBufferObject.swift index 6e405f5b..a247b142 100644 --- a/swift/Sources/FlatBuffers/FlatBufferObject.swift +++ b/swift/Sources/FlatBuffers/FlatBufferObject.swift @@ -2,6 +2,7 @@ import Foundation /// FlatbufferObject structures all the Flatbuffers objects public protocol FlatBufferObject { + var __buffer: ByteBuffer! { get } init(_ bb: ByteBuffer, o: Int32) } diff --git a/swift/Sources/FlatBuffers/Message.swift b/swift/Sources/FlatBuffers/Message.swift new file mode 100644 index 00000000..590d3d7f --- /dev/null +++ b/swift/Sources/FlatBuffers/Message.swift @@ -0,0 +1,41 @@ +public protocol FlatBufferGRPCMessage { + + /// Raw pointer which would be pointing to the beginning of the readable bytes + var rawPointer: UnsafeMutableRawPointer { get } + + /// Size of readable bytes in the buffer + var size: Int { get } + + init(byteBuffer: ByteBuffer) +} + +/// Message is a wrapper around Buffers to to able to send Flatbuffers `Buffers` through the +/// GRPC library +public final class Message<T: FlatBufferObject>: FlatBufferGRPCMessage { + internal var buffer: ByteBuffer + + /// Returns the an object of type T that would be read from the buffer + public var object: T { + T.init(buffer, o: Int32(buffer.read(def: UOffset.self, position: buffer.reader)) + Int32(buffer.reader)) + } + + public var rawPointer: UnsafeMutableRawPointer { return buffer.memory.advanced(by: buffer.reader) } + + public var size: Int { return Int(buffer.size) } + + /// Initializes the message with the type Flatbuffer.Bytebuffer that is transmitted over + /// GRPC + /// - Parameter byteBuffer: Flatbuffer ByteBuffer object + public init(byteBuffer: ByteBuffer) { + buffer = byteBuffer + } + + /// Initializes the message by copying the buffer to the message to be sent. + /// from the builder + /// - Parameter builder: FlatbufferBuilder that has the bytes created in + /// - Note: Use `builder.finish(offset)` before passing the builder without prefixing anything to it + public init(builder: inout FlatBufferBuilder) { + buffer = builder.sizedBuffer + builder.clear() + } +} |