1 /* 2 * Copyright 2021 Google Inc. All rights reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #if os(Linux) 18 import CoreFoundation 19 #else 20 import Foundation 21 #endif 22 23 /// A boolean to see if the system is littleEndian 24 let isLitteEndian = CFByteOrderGetCurrent() == Int(CFByteOrderLittleEndian.rawValue) 25 /// Constant for the file id length 26 let FileIdLength = 4 27 /// Type aliases 28 public typealias Byte = UInt8 29 public typealias UOffset = UInt32 30 public typealias SOffset = Int32 31 public typealias VOffset = UInt16 32 /// Maximum size for a buffer 33 public let FlatBufferMaxSize = UInt32.max << ((MemoryLayout<SOffset>.size * 8 - 1) - 1) 34 35 /// Protocol that confirms all the numbers 36 /// 37 /// Scalar is used to confirm all the numbers that can be represented in a FlatBuffer. It's used to write/read from the buffer. 38 public protocol Scalar: Equatable { 39 associatedtype NumericValue 40 var convertedEndian: NumericValue { get } 41 } 42 43 extension Scalar where Self: FixedWidthInteger { 44 /// Converts the value from BigEndian to LittleEndian 45 /// 46 /// Converts values to little endian on machines that work with BigEndian, however this is NOT TESTED yet. 47 public var convertedEndian: NumericValue { 48 self as! Self.NumericValue 49 } 50 } 51 52 extension Double: Scalar { 53 public typealias NumericValue = UInt64 54 55 public var convertedEndian: UInt64 { 56 bitPattern.littleEndian 57 } 58 } 59 60 extension Float32: Scalar { 61 public typealias NumericValue = UInt32 62 63 public var convertedEndian: UInt32 { 64 bitPattern.littleEndian 65 } 66 } 67 68 extension Bool: Scalar { 69 public var convertedEndian: UInt8 { 70 self == true ? 1 : 0 71 } 72 73 public typealias NumericValue = UInt8 74 } 75 76 extension Int: Scalar { 77 public typealias NumericValue = Int 78 } 79 80 extension Int8: Scalar { 81 public typealias NumericValue = Int8 82 } 83 84 extension Int16: Scalar { 85 public typealias NumericValue = Int16 86 } 87 88 extension Int32: Scalar { 89 public typealias NumericValue = Int32 90 } 91 92 extension Int64: Scalar { 93 public typealias NumericValue = Int64 94 } 95 96 extension UInt8: Scalar { 97 public typealias NumericValue = UInt8 98 } 99 100 extension UInt16: Scalar { 101 public typealias NumericValue = UInt16 102 } 103 104 extension UInt32: Scalar { 105 public typealias NumericValue = UInt32 106 } 107 108 extension UInt64: Scalar { 109 public typealias NumericValue = UInt64 110 } 111 FlatBuffersVersion_2_0_0null112public func FlatBuffersVersion_2_0_0() {} 113