summaryrefslogtreecommitdiff
path: root/swift/Sources
diff options
context:
space:
mode:
Diffstat (limited to 'swift/Sources')
-rw-r--r--swift/Sources/FlatBuffers/ByteBuffer.swift29
-rw-r--r--swift/Sources/FlatBuffers/FlatBufferBuilder.swift6
-rw-r--r--swift/Sources/FlatBuffers/FlatBufferObject.swift1
-rw-r--r--swift/Sources/FlatBuffers/Message.swift41
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()
+ }
+}