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