[Swift] Swift implementation 🎉🎉 (#5603)
* Implemented the swift version of Flatbuffers
Implemented serailzing, reading, and mutating data from object monster
Fixes mis-aligned pointer issue
Fixes issue when shared strings are removed from table
Adds swift enum, structs code gen
Fixed namespace issues + started implementing the table gen
Added Mutate function to the code generator
Generated linux test cases
Fixed an issue with bools, and structs readers in table writer
Swift docker image added
Updated the test cases, and removed a method parameters in swift
Fixed createVector api when called with scalars
Fixed issues with scalar arrays, and fixed the code gen namespaces, added sample_binary.swift
Cleaned up project
Added enum vectors, and their readers
Refactored code
Added swift into the support document
Added documentation in docs, and fixed a small issue with Data() not being returned correctly
Fixes Lowercase issue, and prevents generating lookups for deprecated keys
* Made all the required funcs to have const + removed unneeded code + fix lowercase func
* Removed transform from lowercased and moved it to function
* Fixes an issue with iOS allocation from read
* Refactored cpp code to be more readable
* casts position into int for position
* Fix enums issue, moves scalar writer code to use memcpy
* Removed c_str from struct function
* Fixed script to generate new objects when ran on travis ci: fix
* Handles deallocating space allocated for structs
* Updated the test cases to adhere to the fileprivate lookup, no mutation for unions, and updated the names of the vector functions
2020-01-09 20:12:10 +00:00
|
|
|
#if os(Linux)
|
|
|
|
import CoreFoundation
|
|
|
|
#else
|
|
|
|
import Foundation
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/// A boolean to see if the system is littleEndian
|
|
|
|
let isLitteEndian = CFByteOrderGetCurrent() == Int(CFByteOrderLittleEndian.rawValue)
|
|
|
|
/// Constant for the file id length
|
|
|
|
let FileIdLength = 4
|
|
|
|
/// Type aliases
|
|
|
|
public typealias Byte = UInt8
|
|
|
|
public typealias UOffset = UInt32
|
|
|
|
public typealias SOffset = Int32
|
|
|
|
public typealias VOffset = UInt16
|
|
|
|
/// Maximum size for a buffer
|
|
|
|
public let FlatBufferMaxSize = UInt32.max << ((MemoryLayout<SOffset>.size * 8 - 1) - 1)
|
|
|
|
|
|
|
|
/// Protocol that confirms all the numbers
|
|
|
|
///
|
|
|
|
/// Scalar is used to confirm all the numbers that can be represented in a FlatBuffer. It's used to write/read from the buffer.
|
|
|
|
public protocol Scalar: Equatable {
|
|
|
|
associatedtype NumericValue
|
|
|
|
var convertedEndian: NumericValue { get }
|
|
|
|
}
|
|
|
|
|
|
|
|
extension Scalar where Self: FixedWidthInteger {
|
|
|
|
/// Converts the value from BigEndian to LittleEndian
|
|
|
|
///
|
|
|
|
/// Converts values to little endian on machines that work with BigEndian, however this is NOT TESTED yet.
|
|
|
|
public var convertedEndian: NumericValue {
|
|
|
|
if isLitteEndian { return self as! Self.NumericValue }
|
|
|
|
fatalError("This is not tested! please report an issue on the offical flatbuffers repo")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
extension Double: Scalar {
|
|
|
|
public typealias NumericValue = UInt64
|
|
|
|
|
|
|
|
public var convertedEndian: UInt64 {
|
|
|
|
if isLitteEndian { return self.bitPattern }
|
|
|
|
return self.bitPattern.littleEndian
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
extension Float32: Scalar {
|
|
|
|
public typealias NumericValue = UInt32
|
|
|
|
|
|
|
|
public var convertedEndian: UInt32 {
|
|
|
|
if isLitteEndian { return self.bitPattern }
|
|
|
|
return self.bitPattern.littleEndian
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
extension Int: Scalar {
|
|
|
|
public typealias NumericValue = Int
|
|
|
|
}
|
|
|
|
|
|
|
|
extension Int8: Scalar {
|
|
|
|
public typealias NumericValue = Int8
|
|
|
|
}
|
|
|
|
|
|
|
|
extension Int16: Scalar {
|
|
|
|
public typealias NumericValue = Int16
|
|
|
|
}
|
|
|
|
|
|
|
|
extension Int32: Scalar {
|
|
|
|
public typealias NumericValue = Int32
|
|
|
|
}
|
|
|
|
|
|
|
|
extension Int64: Scalar {
|
|
|
|
public typealias NumericValue = Int64
|
|
|
|
}
|
|
|
|
|
|
|
|
extension UInt8: Scalar {
|
|
|
|
public typealias NumericValue = UInt8
|
|
|
|
}
|
|
|
|
|
|
|
|
extension UInt16: Scalar {
|
|
|
|
public typealias NumericValue = UInt16
|
|
|
|
}
|
|
|
|
|
|
|
|
extension UInt32: Scalar {
|
|
|
|
public typealias NumericValue = UInt32
|
|
|
|
}
|
|
|
|
|
|
|
|
extension UInt64: Scalar {
|
|
|
|
public typealias NumericValue = UInt64
|
|
|
|
}
|
2020-01-24 22:55:57 +00:00
|
|
|
|
2020-03-12 21:41:06 +00:00
|
|
|
public func FlatBuffersVersion_1_12_0() {}
|