diff --git a/third_party/flatbuffers/nim/flatbuffers.nimble b/third_party/flatbuffers/nim/flatbuffers.nimble deleted file mode 100644 index df16be26a..000000000 --- a/third_party/flatbuffers/nim/flatbuffers.nimble +++ /dev/null @@ -1,7 +0,0 @@ -version = "2.0.8" -author = "flatbuffers" -description = "Flatbuffers" -license = "Apache 2.0" -srcDir = "flatbuffers" - -requires "nim >= 1.4.0" diff --git a/third_party/flatbuffers/nim/flatbuffers/flatbuffers.nim b/third_party/flatbuffers/nim/flatbuffers/flatbuffers.nim deleted file mode 100644 index b9532877e..000000000 --- a/third_party/flatbuffers/nim/flatbuffers/flatbuffers.nim +++ /dev/null @@ -1,7 +0,0 @@ -import - src/[ - builder, - struct, - table - ] -export flatbuffers.builder, flatbuffers.table, flatbuffers.struct diff --git a/third_party/flatbuffers/nim/flatbuffers/src/builder.nim b/third_party/flatbuffers/nim/flatbuffers/src/builder.nim deleted file mode 100644 index 62ac2edb0..000000000 --- a/third_party/flatbuffers/nim/flatbuffers/src/builder.nim +++ /dev/null @@ -1,262 +0,0 @@ -import math -import table - - -const MAX_BUFFER_SIZE* = 2^31 - - -type Builder* = ref object of RootObj - bytes*: seq[byte] - minalign*: int - current_vtable*: seq[uoffset] - objectEnd*: uoffset - vtables*: seq[uoffset] #? - head*: uoffset - nested*: bool - finished*: bool - vectorNumElems*: uoffset - -using this: var Builder - -func newBuilder*(size: int): Builder = - result = new Builder - result.bytes.setLen(size) - result.minalign = 1 - result.head = size.uoffset - result.nested = false - result.finished = false - result.vectorNumElems = 0 - -proc FinishedBytes*(this): seq[byte] = - if not this.finished: - quit("Builder not finished, Incorrect use of FinishedBytes(): must call 'Finish' first.") - result = this.bytes[this.head..^1] - -proc Output*(this): seq[byte] = - if not this.finished: - quit("Builder not finished, Incorrect use of Output(): must call 'Finish' first.") - - result = this.bytes[this.head..^1] - -func Offset*(this): uoffset = - result = this.bytes.len.uoffset - this.head - -proc StartObject*(this; numfields: int) = - if this.nested: - quit("builder is nested") - - this.current_vtable.setLen(numfields) - for i in this.current_vtable.mitems(): - i = 0 - this.objectEnd = this.Offset() - this.nested = true - -proc GrowByteBuffer*(this) = - if this.bytes.len == MAX_BUFFER_SIZE: - quit("flatbuffers: cannot grow buffer beyond 2 gigabytes") - let oldLen = this.bytes.len - var newLen = min(this.bytes.len * 2, MAX_BUFFER_SIZE) - if newLen == 0: - newLen = 1 - this.bytes.setLen(newLen) - var j = this.bytes.len - 1 - while j >= 0: - if j >= newLen - oldLen: - this.bytes[j] = this.bytes[j - (newLen - oldLen)] - else: - this.bytes[j] = 0 - dec(j) - -proc Place*[T](this; x: T) = - this.head -= uoffset x.sizeof - WriteVal(this.bytes, this.head, x) - -func Pad*(this; n: int) = - for i in 0.. this.minalign: - this.minalign = size - var alignsize = (not (this.bytes.len - this.head.int + additionalBytes)) + 1 - alignsize = alignsize and (size - 1) - - while this.head.int < alignsize + size + additionalBytes: - let oldbufSize = this.bytes.len - this.GrowByteBuffer() - this.head = (this.head.int + this.bytes.len - oldbufSize).uoffset - this.Pad(alignsize) - -proc PrependOffsetRelative*[T: Offsets](this; off: T) = - when T is voffset: - this.Prep(T.sizeof, 0) - if not off.uoffset <= this.Offset: - quit("flatbuffers: Offset arithmetic error.") - this.Place(off) - else: - this.Prep(T.sizeof, 0) - if not off.uoffset <= this.Offset: - quit("flatbuffers: Offset arithmetic error.") - let off2: T = this.Offset.T - off + sizeof(T).T - this.Place(off2) - - -proc Prepend*[T](this; x: T) = - this.Prep(x.sizeof, 0) - this.Place(x) - -proc Slot*(this; slotnum: int) = - this.current_vtable[slotnum] = this.Offset - -proc PrependSlot*[T](this; o: int; x, d: T) = - if x != d: - when T is uoffset or T is soffset or T is voffset: - this.PrependOffsetRelative(x) - else: - this.Prepend(x) - this.Slot(o) - -proc AssertStuctInline(this; obj: uoffset) = - if obj != this.Offset: - quit("flatbuffers: Tried to write a Struct at an Offset that is different from the current Offset of the Builder.") - -proc PrependStructSlot*(this; o: int; x: uoffset; d: uoffset) = - if x != d: - this.AssertStuctInline(x) - this.Slot(o) - -proc Add*[T](this; n: T) = - this.Prep(T.sizeof, 0) - WriteVal(this.bytes, this.head, n) - -proc VtableEqual*(a: seq[uoffset]; objectStart: uoffset; b: seq[byte]): bool = - if a.len * voffset.sizeof != b.len: - return false - - var i = 0 - while i < a.len: - var seq = b[i * voffset.sizeof..<(i + 1) * voffset.sizeof] - let x = GetVal[voffset](addr seq) - - if x == 0 and a[i] == 0: - inc i - continue - - let y = objectStart.soffset - a[i].soffset - if x.soffset != y: - return false - inc i - return true - -proc WriteVtable*(this): uoffset = - this.PrependOffsetRelative(0.soffset) - - let objectOffset = this.Offset - var existingVtable = uoffset 0 - - var i = this.current_vtable.len - 1 - while i >= 0 and this.current_vtable[i] == 0: dec i - - this.current_vtable = this.current_vtable[0..i] - for i in countdown(this.vtables.len - 1, 0): - let - vt2Offset: uoffset = this.vtables[i] - vt2Start: int = this.bytes.len - int vt2Offset - - var seq = this.bytes[vt2Start.. None: - ## @cond FLATBUFFERS_INTERNAL - self.current_vtable = None - self.head = UOffsetTFlags.py_type(len(self.Bytes)) - self.minalign = 1 - self.objectEnd = None - self.vtables = {} - self.nested = False - self.forceDefaults = False - self.sharedStrings = {} - self.vectorNumElems = None - ## @endcond - self.finished = False - - def Output(self): - """Return the portion of the buffer that has been used for writing data. - - This is the typical way to access the FlatBuffer data inside the - builder. If you try to access `Builder.Bytes` directly, you would need - to manually index it with `Head()`, since the buffer is constructed - backwards. - - It raises BuilderNotFinishedError if the buffer has not been finished - with `Finish`. - """ - - if not self.finished: - raise BuilderNotFinishedError() - - return self.Bytes[self.Head():] - - ## @cond FLATBUFFERS_INTERNAL - def StartObject(self, numfields): - """StartObject initializes bookkeeping for writing a new object.""" - - self.assertNotNested() - - # use 32-bit offsets so that arithmetic doesn't overflow. - self.current_vtable = [0 for _ in range_func(numfields)] - self.objectEnd = self.Offset() - self.nested = True - - def WriteVtable(self): - """ - WriteVtable serializes the vtable for the current object, if needed. - - Before writing out the vtable, this checks pre-existing vtables for - equality to this one. If an equal vtable is found, point the object to - the existing vtable and return. - - Because vtable values are sensitive to alignment of object data, not - all logically-equal vtables will be deduplicated. - - A vtable has the following format: - - - * N, where N is the number of fields - in the schema for this type. Includes deprecated fields. - Thus, a vtable is made of 2 + N elements, each VOffsetT bytes wide. - - An object has the following format: - - + - """ - - # Prepend a zero scalar to the object. Later in this function we'll - # write an offset here that points to the object's vtable: - self.PrependSOffsetTRelative(0) - - objectOffset = self.Offset() - - vtKey = [] - trim = True - for elem in reversed(self.current_vtable): - if elem == 0: - if trim: - continue - else: - elem = objectOffset - elem - trim = False - - vtKey.append(elem) - - vtKey = tuple(vtKey) - vt2Offset = self.vtables.get(vtKey) - if vt2Offset is None: - # Did not find a vtable, so write this one to the buffer. - - # Write out the current vtable in reverse , because - # serialization occurs in last-first order: - i = len(self.current_vtable) - 1 - trailing = 0 - trim = True - while i >= 0: - off = 0 - elem = self.current_vtable[i] - i -= 1 - - if elem == 0: - if trim: - trailing += 1 - continue - else: - # Forward reference to field; - # use 32bit number to ensure no overflow: - off = objectOffset - elem - trim = False - - self.PrependVOffsetT(off) - - # The two metadata fields are written last. - - # First, store the object bytesize: - objectSize = UOffsetTFlags.py_type(objectOffset - self.objectEnd) - self.PrependVOffsetT(VOffsetTFlags.py_type(objectSize)) - - # Second, store the vtable bytesize: - vBytes = len(self.current_vtable) - trailing + VtableMetadataFields - vBytes *= N.VOffsetTFlags.bytewidth - self.PrependVOffsetT(VOffsetTFlags.py_type(vBytes)) - - # Next, write the offset to the new vtable in the - # already-allocated SOffsetT at the beginning of this object: - objectStart = SOffsetTFlags.py_type(len(self.Bytes) - objectOffset) - encode.Write(packer.soffset, self.Bytes, objectStart, - SOffsetTFlags.py_type(self.Offset() - objectOffset)) - - # Finally, store this vtable in memory for future - # deduplication: - self.vtables[vtKey] = self.Offset() - else: - # Found a duplicate vtable. - objectStart = SOffsetTFlags.py_type(len(self.Bytes) - objectOffset) - self.head = UOffsetTFlags.py_type(objectStart) - - # Write the offset to the found vtable in the - # already-allocated SOffsetT at the beginning of this object: - encode.Write(packer.soffset, self.Bytes, self.Head(), - SOffsetTFlags.py_type(vt2Offset - objectOffset)) - - self.current_vtable = None - return objectOffset - - def EndObject(self): - """EndObject writes data necessary to finish object construction.""" - self.assertNested() - self.nested = False - return self.WriteVtable() - - def growByteBuffer(self): - """Doubles the size of the byteslice, and copies the old data towards - the end of the new buffer (since we build the buffer backwards).""" - if len(self.Bytes) == Builder.MAX_BUFFER_SIZE: - msg = "flatbuffers: cannot grow buffer beyond 2 gigabytes" - raise BuilderSizeError(msg) - - newSize = min(len(self.Bytes) * 2, Builder.MAX_BUFFER_SIZE) - if newSize == 0: - newSize = 1 - bytes2 = bytearray(newSize) - bytes2[newSize-len(self.Bytes):] = self.Bytes - self.Bytes = bytes2 - ## @endcond - - def Head(self): - """Get the start of useful data in the underlying byte buffer. - - Note: unlike other functions, this value is interpreted as from the - left. - """ - ## @cond FLATBUFFERS_INTERNAL - return self.head - ## @endcond - - ## @cond FLATBUFFERS_INTERNAL - def Offset(self): - """Offset relative to the end of the buffer.""" - return UOffsetTFlags.py_type(len(self.Bytes) - self.Head()) - - def Pad(self, n): - """Pad places zeros at the current offset.""" - for i in range_func(n): - self.Place(0, N.Uint8Flags) - - def Prep(self, size, additionalBytes): - """ - Prep prepares to write an element of `size` after `additional_bytes` - have been written, e.g. if you write a string, you need to align - such the int length field is aligned to SizeInt32, and the string - data follows it directly. - If all you need to do is align, `additionalBytes` will be 0. - """ - - # Track the biggest thing we've ever aligned to. - if size > self.minalign: - self.minalign = size - - # Find the amount of alignment needed such that `size` is properly - # aligned after `additionalBytes`: - alignSize = (~(len(self.Bytes) - self.Head() + additionalBytes)) + 1 - alignSize &= (size - 1) - - # Reallocate the buffer if needed: - while self.Head() < alignSize+size+additionalBytes: - oldBufSize = len(self.Bytes) - self.growByteBuffer() - updated_head = self.head + len(self.Bytes) - oldBufSize - self.head = UOffsetTFlags.py_type(updated_head) - self.Pad(alignSize) - - def PrependSOffsetTRelative(self, off): - """ - PrependSOffsetTRelative prepends an SOffsetT, relative to where it - will be written. - """ - - # Ensure alignment is already done: - self.Prep(N.SOffsetTFlags.bytewidth, 0) - if not (off <= self.Offset()): - msg = "flatbuffers: Offset arithmetic error." - raise OffsetArithmeticError(msg) - off2 = self.Offset() - off + N.SOffsetTFlags.bytewidth - self.PlaceSOffsetT(off2) - ## @endcond - - def PrependUOffsetTRelative(self, off): - """Prepends an unsigned offset into vector data, relative to where it - will be written. - """ - - # Ensure alignment is already done: - self.Prep(N.UOffsetTFlags.bytewidth, 0) - if not (off <= self.Offset()): - msg = "flatbuffers: Offset arithmetic error." - raise OffsetArithmeticError(msg) - off2 = self.Offset() - off + N.UOffsetTFlags.bytewidth - self.PlaceUOffsetT(off2) - - ## @cond FLATBUFFERS_INTERNAL - def StartVector(self, elemSize, numElems, alignment): - """ - StartVector initializes bookkeeping for writing a new vector. - - A vector has the following format: - - - - +, where T is the type of elements of this vector. - """ - - self.assertNotNested() - self.nested = True - self.vectorNumElems = numElems - self.Prep(N.Uint32Flags.bytewidth, elemSize*numElems) - self.Prep(alignment, elemSize*numElems) # In case alignment > int. - return self.Offset() - ## @endcond - - def EndVector(self, numElems = None): - """EndVector writes data necessary to finish vector construction.""" - - self.assertNested() - ## @cond FLATBUFFERS_INTERNAL - self.nested = False - ## @endcond - - if numElems: - warnings.warn("numElems is deprecated.", - DeprecationWarning, stacklevel=2) - if numElems != self.vectorNumElems: - raise EndVectorLengthMismatched(); - - # we already made space for this, so write without PrependUint32 - self.PlaceUOffsetT(self.vectorNumElems) - self.vectorNumElems = None - return self.Offset() - - def CreateSharedString(self, s, encoding='utf-8', errors='strict'): - """ - CreateSharedString checks if the string is already written to the buffer - before calling CreateString. - """ - - if s in self.sharedStrings: - return self.sharedStrings[s] - - off = self.CreateString(s, encoding, errors) - self.sharedStrings[s] = off - - return off - - def CreateString(self, s, encoding='utf-8', errors='strict'): - """CreateString writes a null-terminated byte string as a vector.""" - - self.assertNotNested() - ## @cond FLATBUFFERS_INTERNAL - self.nested = True - ## @endcond - - if isinstance(s, compat.string_types): - x = s.encode(encoding, errors) - elif isinstance(s, compat.binary_types): - x = s - else: - raise TypeError("non-string passed to CreateString") - - self.Prep(N.UOffsetTFlags.bytewidth, (len(x)+1)*N.Uint8Flags.bytewidth) - self.Place(0, N.Uint8Flags) - - l = UOffsetTFlags.py_type(len(s)) - ## @cond FLATBUFFERS_INTERNAL - self.head = UOffsetTFlags.py_type(self.Head() - l) - ## @endcond - self.Bytes[self.Head():self.Head()+l] = x - - self.vectorNumElems = len(x) - return self.EndVector() - - def CreateByteVector(self, x): - """CreateString writes a byte vector.""" - - self.assertNotNested() - ## @cond FLATBUFFERS_INTERNAL - self.nested = True - ## @endcond - - if not isinstance(x, compat.binary_types): - raise TypeError("non-byte vector passed to CreateByteVector") - - self.Prep(N.UOffsetTFlags.bytewidth, len(x)*N.Uint8Flags.bytewidth) - - l = UOffsetTFlags.py_type(len(x)) - ## @cond FLATBUFFERS_INTERNAL - self.head = UOffsetTFlags.py_type(self.Head() - l) - ## @endcond - self.Bytes[self.Head():self.Head()+l] = x - - self.vectorNumElems = len(x) - return self.EndVector() - - def CreateNumpyVector(self, x): - """CreateNumpyVector writes a numpy array into the buffer.""" - - if np is None: - # Numpy is required for this feature - raise NumpyRequiredForThisFeature("Numpy was not found.") - - if not isinstance(x, np.ndarray): - raise TypeError("non-numpy-ndarray passed to CreateNumpyVector") - - if x.dtype.kind not in ['b', 'i', 'u', 'f']: - raise TypeError("numpy-ndarray holds elements of unsupported datatype") - - if x.ndim > 1: - raise TypeError("multidimensional-ndarray passed to CreateNumpyVector") - - self.StartVector(x.itemsize, x.size, x.dtype.alignment) - - # Ensure little endian byte ordering - if x.dtype.str[0] == "<": - x_lend = x - else: - x_lend = x.byteswap(inplace=False) - - # Calculate total length - l = UOffsetTFlags.py_type(x_lend.itemsize * x_lend.size) - ## @cond FLATBUFFERS_INTERNAL - self.head = UOffsetTFlags.py_type(self.Head() - l) - ## @endcond - - # tobytes ensures c_contiguous ordering - self.Bytes[self.Head():self.Head()+l] = x_lend.tobytes(order='C') - - self.vectorNumElems = x.size - return self.EndVector() - - ## @cond FLATBUFFERS_INTERNAL - def assertNested(self): - """ - Check that we are in the process of building an object. - """ - - if not self.nested: - raise IsNotNestedError() - - def assertNotNested(self): - """ - Check that no other objects are being built while making this - object. If not, raise an exception. - """ - - if self.nested: - raise IsNestedError() - - def assertStructIsInline(self, obj): - """ - Structs are always stored inline, so need to be created right - where they are used. You'll get this error if you created it - elsewhere. - """ - - N.enforce_number(obj, N.UOffsetTFlags) - if obj != self.Offset(): - msg = ("flatbuffers: Tried to write a Struct at an Offset that " - "is different from the current Offset of the Builder.") - raise StructIsNotInlineError(msg) - - def Slot(self, slotnum): - """ - Slot sets the vtable key `voffset` to the current location in the - buffer. - - """ - self.assertNested() - self.current_vtable[slotnum] = self.Offset() - ## @endcond - - def __Finish(self, rootTable, sizePrefix, file_identifier=None): - """Finish finalizes a buffer, pointing to the given `rootTable`.""" - N.enforce_number(rootTable, N.UOffsetTFlags) - - prepSize = N.UOffsetTFlags.bytewidth - if file_identifier is not None: - prepSize += N.Int32Flags.bytewidth - if sizePrefix: - prepSize += N.Int32Flags.bytewidth - self.Prep(self.minalign, prepSize) - - if file_identifier is not None: - self.Prep(N.UOffsetTFlags.bytewidth, encode.FILE_IDENTIFIER_LENGTH) - - # Convert bytes object file_identifier to an array of 4 8-bit integers, - # and use big-endian to enforce size compliance. - # https://docs.python.org/2/library/struct.html#format-characters - file_identifier = N.struct.unpack(">BBBB", file_identifier) - for i in range(encode.FILE_IDENTIFIER_LENGTH-1, -1, -1): - # Place the bytes of the file_identifer in reverse order: - self.Place(file_identifier[i], N.Uint8Flags) - - self.PrependUOffsetTRelative(rootTable) - if sizePrefix: - size = len(self.Bytes) - self.Head() - N.enforce_number(size, N.Int32Flags) - self.PrependInt32(size) - self.finished = True - return self.Head() - - def Finish(self, rootTable, file_identifier=None): - """Finish finalizes a buffer, pointing to the given `rootTable`.""" - return self.__Finish(rootTable, False, file_identifier=file_identifier) - - def FinishSizePrefixed(self, rootTable, file_identifier=None): - """ - Finish finalizes a buffer, pointing to the given `rootTable`, - with the size prefixed. - """ - return self.__Finish(rootTable, True, file_identifier=file_identifier) - - ## @cond FLATBUFFERS_INTERNAL - def Prepend(self, flags, off): - self.Prep(flags.bytewidth, 0) - self.Place(off, flags) - - def PrependSlot(self, flags, o, x, d): - if x is not None: - N.enforce_number(x, flags) - if d is not None: - N.enforce_number(d, flags) - if x != d or (self.forceDefaults and d is not None): - self.Prepend(flags, x) - self.Slot(o) - - def PrependBoolSlot(self, *args): self.PrependSlot(N.BoolFlags, *args) - - def PrependByteSlot(self, *args): self.PrependSlot(N.Uint8Flags, *args) - - def PrependUint8Slot(self, *args): self.PrependSlot(N.Uint8Flags, *args) - - def PrependUint16Slot(self, *args): self.PrependSlot(N.Uint16Flags, *args) - - def PrependUint32Slot(self, *args): self.PrependSlot(N.Uint32Flags, *args) - - def PrependUint64Slot(self, *args): self.PrependSlot(N.Uint64Flags, *args) - - def PrependInt8Slot(self, *args): self.PrependSlot(N.Int8Flags, *args) - - def PrependInt16Slot(self, *args): self.PrependSlot(N.Int16Flags, *args) - - def PrependInt32Slot(self, *args): self.PrependSlot(N.Int32Flags, *args) - - def PrependInt64Slot(self, *args): self.PrependSlot(N.Int64Flags, *args) - - def PrependFloat32Slot(self, *args): self.PrependSlot(N.Float32Flags, - *args) - - def PrependFloat64Slot(self, *args): self.PrependSlot(N.Float64Flags, - *args) - - def PrependUOffsetTRelativeSlot(self, o, x, d): - """ - PrependUOffsetTRelativeSlot prepends an UOffsetT onto the object at - vtable slot `o`. If value `x` equals default `d`, then the slot will - be set to zero and no other data will be written. - """ - - if x != d or self.forceDefaults: - self.PrependUOffsetTRelative(x) - self.Slot(o) - - def PrependStructSlot(self, v, x, d): - """ - PrependStructSlot prepends a struct onto the object at vtable slot `o`. - Structs are stored inline, so nothing additional is being added. - In generated code, `d` is always 0. - """ - - N.enforce_number(d, N.UOffsetTFlags) - if x != d: - self.assertStructIsInline(x) - self.Slot(v) - - ## @endcond - - def PrependBool(self, x): - """Prepend a `bool` to the Builder buffer. - - Note: aligns and checks for space. - """ - self.Prepend(N.BoolFlags, x) - - def PrependByte(self, x): - """Prepend a `byte` to the Builder buffer. - - Note: aligns and checks for space. - """ - self.Prepend(N.Uint8Flags, x) - - def PrependUint8(self, x): - """Prepend an `uint8` to the Builder buffer. - - Note: aligns and checks for space. - """ - self.Prepend(N.Uint8Flags, x) - - def PrependUint16(self, x): - """Prepend an `uint16` to the Builder buffer. - - Note: aligns and checks for space. - """ - self.Prepend(N.Uint16Flags, x) - - def PrependUint32(self, x): - """Prepend an `uint32` to the Builder buffer. - - Note: aligns and checks for space. - """ - self.Prepend(N.Uint32Flags, x) - - def PrependUint64(self, x): - """Prepend an `uint64` to the Builder buffer. - - Note: aligns and checks for space. - """ - self.Prepend(N.Uint64Flags, x) - - def PrependInt8(self, x): - """Prepend an `int8` to the Builder buffer. - - Note: aligns and checks for space. - """ - self.Prepend(N.Int8Flags, x) - - def PrependInt16(self, x): - """Prepend an `int16` to the Builder buffer. - - Note: aligns and checks for space. - """ - self.Prepend(N.Int16Flags, x) - - def PrependInt32(self, x): - """Prepend an `int32` to the Builder buffer. - - Note: aligns and checks for space. - """ - self.Prepend(N.Int32Flags, x) - - def PrependInt64(self, x): - """Prepend an `int64` to the Builder buffer. - - Note: aligns and checks for space. - """ - self.Prepend(N.Int64Flags, x) - - def PrependFloat32(self, x): - """Prepend a `float32` to the Builder buffer. - - Note: aligns and checks for space. - """ - self.Prepend(N.Float32Flags, x) - - def PrependFloat64(self, x): - """Prepend a `float64` to the Builder buffer. - - Note: aligns and checks for space. - """ - self.Prepend(N.Float64Flags, x) - - def ForceDefaults(self, forceDefaults): - """ - In order to save space, fields that are set to their default value - don't get serialized into the buffer. Forcing defaults provides a - way to manually disable this optimization. When set to `True`, will - always serialize default values. - """ - self.forceDefaults = forceDefaults - -############################################################## - - ## @cond FLATBUFFERS_INTERNAL - def PrependVOffsetT(self, x): self.Prepend(N.VOffsetTFlags, x) - - def Place(self, x, flags): - """ - Place prepends a value specified by `flags` to the Builder, - without checking for available space. - """ - - N.enforce_number(x, flags) - self.head = self.head - flags.bytewidth - encode.Write(flags.packer_type, self.Bytes, self.Head(), x) - - def PlaceVOffsetT(self, x): - """PlaceVOffsetT prepends a VOffsetT to the Builder, without checking - for space. - """ - N.enforce_number(x, N.VOffsetTFlags) - self.head = self.head - N.VOffsetTFlags.bytewidth - encode.Write(packer.voffset, self.Bytes, self.Head(), x) - - def PlaceSOffsetT(self, x): - """PlaceSOffsetT prepends a SOffsetT to the Builder, without checking - for space. - """ - N.enforce_number(x, N.SOffsetTFlags) - self.head = self.head - N.SOffsetTFlags.bytewidth - encode.Write(packer.soffset, self.Bytes, self.Head(), x) - - def PlaceUOffsetT(self, x): - """PlaceUOffsetT prepends a UOffsetT to the Builder, without checking - for space. - """ - N.enforce_number(x, N.UOffsetTFlags) - self.head = self.head - N.UOffsetTFlags.bytewidth - encode.Write(packer.uoffset, self.Bytes, self.Head(), x) - ## @endcond - -## @cond FLATBUFFERS_INTERNAL -def vtableEqual(a, objectStart, b): - """vtableEqual compares an unwritten vtable to a written vtable.""" - - N.enforce_number(objectStart, N.UOffsetTFlags) - - if len(a) * N.VOffsetTFlags.bytewidth != len(b): - return False - - for i, elem in enumerate(a): - x = encode.Get(packer.voffset, b, i * N.VOffsetTFlags.bytewidth) - - # Skip vtable entries that indicate a default value. - if x == 0 and elem == 0: - pass - else: - y = objectStart - elem - if x != y: - return False - return True -## @endcond -## @} diff --git a/third_party/flatbuffers/python/flatbuffers/compat.py b/third_party/flatbuffers/python/flatbuffers/compat.py deleted file mode 100644 index 0244c9787..000000000 --- a/third_party/flatbuffers/python/flatbuffers/compat.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright 2016 Google Inc. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" A tiny version of `six` to help with backwards compability. Also includes - compatibility helpers for numpy. """ - -import sys - -PY2 = sys.version_info[0] == 2 -PY26 = sys.version_info[0:2] == (2, 6) -PY27 = sys.version_info[0:2] == (2, 7) -PY275 = sys.version_info[0:3] >= (2, 7, 5) -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - import importlib.machinery - string_types = (str,) - binary_types = (bytes,bytearray) - range_func = range - memoryview_type = memoryview - struct_bool_decl = "?" -else: - import imp - string_types = (unicode,) - if PY26 or PY27: - binary_types = (str,bytearray) - else: - binary_types = (str,) - range_func = xrange - if PY26 or (PY27 and not PY275): - memoryview_type = buffer - struct_bool_decl = "= 0 - - if value < (1 << 8): - return BitWidth.W8 - elif value < (1 << 16): - return BitWidth.W16 - elif value < (1 << 32): - return BitWidth.W32 - elif value < (1 << 64): - return BitWidth.W64 - else: - raise ValueError('value is too big to encode: %s' % value) - - @staticmethod - def I(value): - """Returns the minimum `BitWidth` to encode signed integer value.""" - # -2^(n-1) <= value < 2^(n-1) - # -2^n <= 2 * value < 2^n - # 2 * value < 2^n, when value >= 0 or 2 * (-value) <= 2^n, when value < 0 - # 2 * value < 2^n, when value >= 0 or 2 * (-value) - 1 < 2^n, when value < 0 - # - # if value >= 0: - # return BitWidth.U(2 * value) - # else: - # return BitWidth.U(2 * (-value) - 1) # ~x = -x - 1 - value *= 2 - return BitWidth.U(value if value >= 0 else ~value) - - @staticmethod - def F(value): - """Returns the `BitWidth` to encode floating point value.""" - if struct.unpack(' 0: - i = first - step = count // 2 - i += step - if pred(values[i], value): - i += 1 - first = i - count -= step + 1 - else: - count = step - return first - - -# https://en.cppreference.com/w/cpp/algorithm/binary_search -def _BinarySearch(values, value, pred=lambda x, y: x < y): - """Implementation of C++ std::binary_search() algorithm.""" - index = _LowerBound(values, value, pred) - if index != len(values) and not pred(value, values[index]): - return index - return -1 - - -class Type(enum.IntEnum): - """Supported types of encoded data. - - These are used as the upper 6 bits of a type field to indicate the actual - type. - """ - NULL = 0 - INT = 1 - UINT = 2 - FLOAT = 3 - # Types above stored inline, types below store an offset. - KEY = 4 - STRING = 5 - INDIRECT_INT = 6 - INDIRECT_UINT = 7 - INDIRECT_FLOAT = 8 - MAP = 9 - VECTOR = 10 # Untyped. - - VECTOR_INT = 11 # Typed any size (stores no type table). - VECTOR_UINT = 12 - VECTOR_FLOAT = 13 - VECTOR_KEY = 14 - # DEPRECATED, use VECTOR or VECTOR_KEY instead. - # Read test.cpp/FlexBuffersDeprecatedTest() for details on why. - VECTOR_STRING_DEPRECATED = 15 - - VECTOR_INT2 = 16 # Typed tuple (no type table, no size field). - VECTOR_UINT2 = 17 - VECTOR_FLOAT2 = 18 - VECTOR_INT3 = 19 # Typed triple (no type table, no size field). - VECTOR_UINT3 = 20 - VECTOR_FLOAT3 = 21 - VECTOR_INT4 = 22 # Typed quad (no type table, no size field). - VECTOR_UINT4 = 23 - VECTOR_FLOAT4 = 24 - - BLOB = 25 - BOOL = 26 - VECTOR_BOOL = 36 # To do the same type of conversion of type to vector type - - @staticmethod - def Pack(type_, bit_width): - return (int(type_) << 2) | bit_width - - @staticmethod - def Unpack(packed_type): - return 1 << (packed_type & 0b11), Type(packed_type >> 2) - - @staticmethod - def IsInline(type_): - return type_ <= Type.FLOAT or type_ == Type.BOOL - - @staticmethod - def IsTypedVector(type_): - return Type.VECTOR_INT <= type_ <= Type.VECTOR_STRING_DEPRECATED or \ - type_ == Type.VECTOR_BOOL - - @staticmethod - def IsTypedVectorElementType(type_): - return Type.INT <= type_ <= Type.STRING or type_ == Type.BOOL - - @staticmethod - def ToTypedVectorElementType(type_): - if not Type.IsTypedVector(type_): - raise ValueError('must be typed vector type') - - return Type(type_ - Type.VECTOR_INT + Type.INT) - - @staticmethod - def IsFixedTypedVector(type_): - return Type.VECTOR_INT2 <= type_ <= Type.VECTOR_FLOAT4 - - @staticmethod - def IsFixedTypedVectorElementType(type_): - return Type.INT <= type_ <= Type.FLOAT - - @staticmethod - def ToFixedTypedVectorElementType(type_): - if not Type.IsFixedTypedVector(type_): - raise ValueError('must be fixed typed vector type') - - # 3 types each, starting from length 2. - fixed_type = type_ - Type.VECTOR_INT2 - return Type(fixed_type % 3 + Type.INT), fixed_type // 3 + 2 - - @staticmethod - def ToTypedVector(element_type, fixed_len=0): - """Converts element type to corresponding vector type. - - Args: - element_type: vector element type - fixed_len: number of elements: 0 for typed vector; 2, 3, or 4 for fixed - typed vector. - - Returns: - Typed vector type or fixed typed vector type. - """ - if fixed_len == 0: - if not Type.IsTypedVectorElementType(element_type): - raise ValueError('must be typed vector element type') - else: - if not Type.IsFixedTypedVectorElementType(element_type): - raise ValueError('must be fixed typed vector element type') - - offset = element_type - Type.INT - if fixed_len == 0: - return Type(offset + Type.VECTOR_INT) # TypedVector - elif fixed_len == 2: - return Type(offset + Type.VECTOR_INT2) # FixedTypedVector - elif fixed_len == 3: - return Type(offset + Type.VECTOR_INT3) # FixedTypedVector - elif fixed_len == 4: - return Type(offset + Type.VECTOR_INT4) # FixedTypedVector - else: - raise ValueError('unsupported fixed_len: %s' % fixed_len) - - -class Buf: - """Class to access underlying buffer object starting from the given offset.""" - - def __init__(self, buf, offset): - self._buf = buf - self._offset = offset if offset >= 0 else len(buf) + offset - self._length = len(buf) - self._offset - - def __getitem__(self, key): - if isinstance(key, slice): - return self._buf[_ShiftSlice(key, self._offset, self._length)] - elif isinstance(key, int): - return self._buf[self._offset + key] - else: - raise TypeError('invalid key type') - - def __setitem__(self, key, value): - if isinstance(key, slice): - self._buf[_ShiftSlice(key, self._offset, self._length)] = value - elif isinstance(key, int): - self._buf[self._offset + key] = key - else: - raise TypeError('invalid key type') - - def __repr__(self): - return 'buf[%d:]' % self._offset - - def Find(self, sub): - """Returns the lowest index where the sub subsequence is found.""" - return self._buf[self._offset:].find(sub) - - def Slice(self, offset): - """Returns new `Buf` which starts from the given offset.""" - return Buf(self._buf, self._offset + offset) - - def Indirect(self, offset, byte_width): - """Return new `Buf` based on the encoded offset (indirect encoding).""" - return self.Slice(offset - _Unpack(U, self[offset:offset + byte_width])) - - -class Object: - """Base class for all non-trivial data accessors.""" - __slots__ = '_buf', '_byte_width' - - def __init__(self, buf, byte_width): - self._buf = buf - self._byte_width = byte_width - - @property - def ByteWidth(self): - return self._byte_width - - -class Sized(Object): - """Base class for all data accessors which need to read encoded size.""" - __slots__ = '_size', - - def __init__(self, buf, byte_width, size=0): - super().__init__(buf, byte_width) - if size == 0: - self._size = _Unpack(U, self.SizeBytes) - else: - self._size = size - - @property - def SizeBytes(self): - return self._buf[-self._byte_width:0] - - def __len__(self): - return self._size - - -class Blob(Sized): - """Data accessor for the encoded blob bytes.""" - __slots__ = () - - @property - def Bytes(self): - return self._buf[0:len(self)] - - def __repr__(self): - return 'Blob(%s, size=%d)' % (self._buf, len(self)) - - -class String(Sized): - """Data accessor for the encoded string bytes.""" - __slots__ = () - - @property - def Bytes(self): - return self._buf[0:len(self)] - - def Mutate(self, value): - """Mutates underlying string bytes in place. - - Args: - value: New string to replace the existing one. New string must have less - or equal UTF-8-encoded bytes than the existing one to successfully - mutate underlying byte buffer. - - Returns: - Whether the value was mutated or not. - """ - encoded = value.encode('utf-8') - n = len(encoded) - if n <= len(self): - self._buf[-self._byte_width:0] = _Pack(U, n, self._byte_width) - self._buf[0:n] = encoded - self._buf[n:len(self)] = bytearray(len(self) - n) - return True - return False - - def __str__(self): - return self.Bytes.decode('utf-8') - - def __repr__(self): - return 'String(%s, size=%d)' % (self._buf, len(self)) - - -class Key(Object): - """Data accessor for the encoded key bytes.""" - __slots__ = () - - def __init__(self, buf, byte_width): - assert byte_width == 1 - super().__init__(buf, byte_width) - - @property - def Bytes(self): - return self._buf[0:len(self)] - - def __len__(self): - return self._buf.Find(0) - - def __str__(self): - return self.Bytes.decode('ascii') - - def __repr__(self): - return 'Key(%s, size=%d)' % (self._buf, len(self)) - - -class Vector(Sized): - """Data accessor for the encoded vector bytes.""" - __slots__ = () - - def __getitem__(self, index): - if index < 0 or index >= len(self): - raise IndexError('vector index %s is out of [0, %d) range' % \ - (index, len(self))) - - packed_type = self._buf[len(self) * self._byte_width + index] - buf = self._buf.Slice(index * self._byte_width) - return Ref.PackedType(buf, self._byte_width, packed_type) - - @property - def Value(self): - """Returns the underlying encoded data as a list object.""" - return [e.Value for e in self] - - def __repr__(self): - return 'Vector(%s, byte_width=%d, size=%d)' % \ - (self._buf, self._byte_width, self._size) - - -class TypedVector(Sized): - """Data accessor for the encoded typed vector or fixed typed vector bytes.""" - __slots__ = '_element_type', '_size' - - def __init__(self, buf, byte_width, element_type, size=0): - super().__init__(buf, byte_width, size) - - if element_type == Type.STRING: - # These can't be accessed as strings, since we don't know the bit-width - # of the size field, see the declaration of - # FBT_VECTOR_STRING_DEPRECATED above for details. - # We change the type here to be keys, which are a subtype of strings, - # and will ignore the size field. This will truncate strings with - # embedded nulls. - element_type = Type.KEY - - self._element_type = element_type - - @property - def Bytes(self): - return self._buf[:self._byte_width * len(self)] - - @property - def ElementType(self): - return self._element_type - - def __getitem__(self, index): - if index < 0 or index >= len(self): - raise IndexError('vector index %s is out of [0, %d) range' % \ - (index, len(self))) - - buf = self._buf.Slice(index * self._byte_width) - return Ref(buf, self._byte_width, 1, self._element_type) - - @property - def Value(self): - """Returns underlying data as list object.""" - if not self: - return [] - - if self._element_type is Type.BOOL: - return [bool(e) for e in _UnpackVector(U, self.Bytes, len(self))] - elif self._element_type is Type.INT: - return list(_UnpackVector(I, self.Bytes, len(self))) - elif self._element_type is Type.UINT: - return list(_UnpackVector(U, self.Bytes, len(self))) - elif self._element_type is Type.FLOAT: - return list(_UnpackVector(F, self.Bytes, len(self))) - elif self._element_type is Type.KEY: - return [e.AsKey for e in self] - elif self._element_type is Type.STRING: - return [e.AsString for e in self] - else: - raise TypeError('unsupported element_type: %s' % self._element_type) - - def __repr__(self): - return 'TypedVector(%s, byte_width=%d, element_type=%s, size=%d)' % \ - (self._buf, self._byte_width, self._element_type, self._size) - - -class Map(Vector): - """Data accessor for the encoded map bytes.""" - - @staticmethod - def CompareKeys(a, b): - if isinstance(a, Ref): - a = a.AsKeyBytes - if isinstance(b, Ref): - b = b.AsKeyBytes - return a < b - - def __getitem__(self, key): - if isinstance(key, int): - return super().__getitem__(key) - - index = _BinarySearch(self.Keys, key.encode('ascii'), self.CompareKeys) - if index != -1: - return super().__getitem__(index) - - raise KeyError(key) - - @property - def Keys(self): - byte_width = _Unpack(U, self._buf[-2 * self._byte_width:-self._byte_width]) - buf = self._buf.Indirect(-3 * self._byte_width, self._byte_width) - return TypedVector(buf, byte_width, Type.KEY) - - @property - def Values(self): - return Vector(self._buf, self._byte_width) - - @property - def Value(self): - return {k.Value: v.Value for k, v in zip(self.Keys, self.Values)} - - def __repr__(self): - return 'Map(%s, size=%d)' % (self._buf, len(self)) - - -class Ref: - """Data accessor for the encoded data bytes.""" - __slots__ = '_buf', '_parent_width', '_byte_width', '_type' - - @staticmethod - def PackedType(buf, parent_width, packed_type): - byte_width, type_ = Type.Unpack(packed_type) - return Ref(buf, parent_width, byte_width, type_) - - def __init__(self, buf, parent_width, byte_width, type_): - self._buf = buf - self._parent_width = parent_width - self._byte_width = byte_width - self._type = type_ - - def __repr__(self): - return 'Ref(%s, parent_width=%d, byte_width=%d, type_=%s)' % \ - (self._buf, self._parent_width, self._byte_width, self._type) - - @property - def _Bytes(self): - return self._buf[:self._parent_width] - - def _ConvertError(self, target_type): - raise TypeError('cannot convert %s to %s' % (self._type, target_type)) - - def _Indirect(self): - return self._buf.Indirect(0, self._parent_width) - - @property - def IsNull(self): - return self._type is Type.NULL - - @property - def IsBool(self): - return self._type is Type.BOOL - - @property - def AsBool(self): - if self._type is Type.BOOL: - return bool(_Unpack(U, self._Bytes)) - else: - return self.AsInt != 0 - - def MutateBool(self, value): - """Mutates underlying boolean value bytes in place. - - Args: - value: New boolean value. - - Returns: - Whether the value was mutated or not. - """ - return self.IsBool and \ - _Mutate(U, self._buf, value, self._parent_width, BitWidth.W8) - - @property - def IsNumeric(self): - return self.IsInt or self.IsFloat - - @property - def IsInt(self): - return self._type in (Type.INT, Type.INDIRECT_INT, Type.UINT, - Type.INDIRECT_UINT) - - @property - def AsInt(self): - """Returns current reference as integer value.""" - if self.IsNull: - return 0 - elif self.IsBool: - return int(self.AsBool) - elif self._type is Type.INT: - return _Unpack(I, self._Bytes) - elif self._type is Type.INDIRECT_INT: - return _Unpack(I, self._Indirect()[:self._byte_width]) - if self._type is Type.UINT: - return _Unpack(U, self._Bytes) - elif self._type is Type.INDIRECT_UINT: - return _Unpack(U, self._Indirect()[:self._byte_width]) - elif self.IsString: - return len(self.AsString) - elif self.IsKey: - return len(self.AsKey) - elif self.IsBlob: - return len(self.AsBlob) - elif self.IsVector: - return len(self.AsVector) - elif self.IsTypedVector: - return len(self.AsTypedVector) - elif self.IsFixedTypedVector: - return len(self.AsFixedTypedVector) - else: - raise self._ConvertError(Type.INT) - - def MutateInt(self, value): - """Mutates underlying integer value bytes in place. - - Args: - value: New integer value. It must fit to the byte size of the existing - encoded value. - - Returns: - Whether the value was mutated or not. - """ - if self._type is Type.INT: - return _Mutate(I, self._buf, value, self._parent_width, BitWidth.I(value)) - elif self._type is Type.INDIRECT_INT: - return _Mutate(I, self._Indirect(), value, self._byte_width, - BitWidth.I(value)) - elif self._type is Type.UINT: - return _Mutate(U, self._buf, value, self._parent_width, BitWidth.U(value)) - elif self._type is Type.INDIRECT_UINT: - return _Mutate(U, self._Indirect(), value, self._byte_width, - BitWidth.U(value)) - else: - return False - - @property - def IsFloat(self): - return self._type in (Type.FLOAT, Type.INDIRECT_FLOAT) - - @property - def AsFloat(self): - """Returns current reference as floating point value.""" - if self.IsNull: - return 0.0 - elif self.IsBool: - return float(self.AsBool) - elif self.IsInt: - return float(self.AsInt) - elif self._type is Type.FLOAT: - return _Unpack(F, self._Bytes) - elif self._type is Type.INDIRECT_FLOAT: - return _Unpack(F, self._Indirect()[:self._byte_width]) - elif self.IsString: - return float(self.AsString) - elif self.IsVector: - return float(len(self.AsVector)) - elif self.IsTypedVector(): - return float(len(self.AsTypedVector)) - elif self.IsFixedTypedVector(): - return float(len(self.FixedTypedVector)) - else: - raise self._ConvertError(Type.FLOAT) - - def MutateFloat(self, value): - """Mutates underlying floating point value bytes in place. - - Args: - value: New float value. It must fit to the byte size of the existing - encoded value. - - Returns: - Whether the value was mutated or not. - """ - if self._type is Type.FLOAT: - return _Mutate(F, self._buf, value, self._parent_width, - BitWidth.B(self._parent_width)) - elif self._type is Type.INDIRECT_FLOAT: - return _Mutate(F, self._Indirect(), value, self._byte_width, - BitWidth.B(self._byte_width)) - else: - return False - - @property - def IsKey(self): - return self._type is Type.KEY - - @property - def AsKeyBytes(self): - if self.IsKey: - return Key(self._Indirect(), self._byte_width).Bytes - else: - raise self._ConvertError(Type.KEY) - - @property - def AsKey(self): - if self.IsKey: - return str(Key(self._Indirect(), self._byte_width)) - else: - raise self._ConvertError(Type.KEY) - - @property - def IsString(self): - return self._type is Type.STRING - - @property - def AsStringBytes(self): - if self.IsString: - return String(self._Indirect(), self._byte_width).Bytes - elif self.IsKey: - return self.AsKeyBytes - else: - raise self._ConvertError(Type.STRING) - - @property - def AsString(self): - if self.IsString: - return str(String(self._Indirect(), self._byte_width)) - elif self.IsKey: - return self.AsKey - else: - raise self._ConvertError(Type.STRING) - - def MutateString(self, value): - return String(self._Indirect(), self._byte_width).Mutate(value) - - @property - def IsBlob(self): - return self._type is Type.BLOB - - @property - def AsBlob(self): - if self.IsBlob: - return Blob(self._Indirect(), self._byte_width).Bytes - else: - raise self._ConvertError(Type.BLOB) - - @property - def IsAnyVector(self): - return self.IsVector or self.IsTypedVector or self.IsFixedTypedVector() - - @property - def IsVector(self): - return self._type in (Type.VECTOR, Type.MAP) - - @property - def AsVector(self): - if self.IsVector: - return Vector(self._Indirect(), self._byte_width) - else: - raise self._ConvertError(Type.VECTOR) - - @property - def IsTypedVector(self): - return Type.IsTypedVector(self._type) - - @property - def AsTypedVector(self): - if self.IsTypedVector: - return TypedVector(self._Indirect(), self._byte_width, - Type.ToTypedVectorElementType(self._type)) - else: - raise self._ConvertError('TYPED_VECTOR') - - @property - def IsFixedTypedVector(self): - return Type.IsFixedTypedVector(self._type) - - @property - def AsFixedTypedVector(self): - if self.IsFixedTypedVector: - element_type, size = Type.ToFixedTypedVectorElementType(self._type) - return TypedVector(self._Indirect(), self._byte_width, element_type, size) - else: - raise self._ConvertError('FIXED_TYPED_VECTOR') - - @property - def IsMap(self): - return self._type is Type.MAP - - @property - def AsMap(self): - if self.IsMap: - return Map(self._Indirect(), self._byte_width) - else: - raise self._ConvertError(Type.MAP) - - @property - def Value(self): - """Converts current reference to value of corresponding type. - - This is equivalent to calling `AsInt` for integer values, `AsFloat` for - floating point values, etc. - - Returns: - Value of corresponding type. - """ - if self.IsNull: - return None - elif self.IsBool: - return self.AsBool - elif self.IsInt: - return self.AsInt - elif self.IsFloat: - return self.AsFloat - elif self.IsString: - return self.AsString - elif self.IsKey: - return self.AsKey - elif self.IsBlob: - return self.AsBlob - elif self.IsMap: - return self.AsMap.Value - elif self.IsVector: - return self.AsVector.Value - elif self.IsTypedVector: - return self.AsTypedVector.Value - elif self.IsFixedTypedVector: - return self.AsFixedTypedVector.Value - else: - raise TypeError('cannot convert %r to value' % self) - - -def _IsIterable(obj): - try: - iter(obj) - return True - except TypeError: - return False - - -class Value: - """Class to represent given value during the encoding process.""" - - @staticmethod - def Null(): - return Value(0, Type.NULL, BitWidth.W8) - - @staticmethod - def Bool(value): - return Value(value, Type.BOOL, BitWidth.W8) - - @staticmethod - def Int(value, bit_width): - return Value(value, Type.INT, bit_width) - - @staticmethod - def UInt(value, bit_width): - return Value(value, Type.UINT, bit_width) - - @staticmethod - def Float(value, bit_width): - return Value(value, Type.FLOAT, bit_width) - - @staticmethod - def Key(offset): - return Value(offset, Type.KEY, BitWidth.W8) - - def __init__(self, value, type_, min_bit_width): - self._value = value - self._type = type_ - - # For scalars: of itself, for vector: of its elements, for string: length. - self._min_bit_width = min_bit_width - - @property - def Value(self): - return self._value - - @property - def Type(self): - return self._type - - @property - def MinBitWidth(self): - return self._min_bit_width - - def StoredPackedType(self, parent_bit_width=BitWidth.W8): - return Type.Pack(self._type, self.StoredWidth(parent_bit_width)) - - # We have an absolute offset, but want to store a relative offset - # elem_index elements beyond the current buffer end. Since whether - # the relative offset fits in a certain byte_width depends on - # the size of the elements before it (and their alignment), we have - # to test for each size in turn. - def ElemWidth(self, buf_size, elem_index=0): - if Type.IsInline(self._type): - return self._min_bit_width - for byte_width in 1, 2, 4, 8: - offset_loc = buf_size + _PaddingBytes(buf_size, byte_width) + \ - elem_index * byte_width - bit_width = BitWidth.U(offset_loc - self._value) - if byte_width == (1 << bit_width): - return bit_width - raise ValueError('relative offset is too big') - - def StoredWidth(self, parent_bit_width=BitWidth.W8): - if Type.IsInline(self._type): - return max(self._min_bit_width, parent_bit_width) - return self._min_bit_width - - def __repr__(self): - return 'Value(%s, %s, %s)' % (self._value, self._type, self._min_bit_width) - - def __str__(self): - return str(self._value) - - -def InMap(func): - def wrapper(self, *args, **kwargs): - if isinstance(args[0], str): - self.Key(args[0]) - func(self, *args[1:], **kwargs) - else: - func(self, *args, **kwargs) - return wrapper - - -def InMapForString(func): - def wrapper(self, *args): - if len(args) == 1: - func(self, args[0]) - elif len(args) == 2: - self.Key(args[0]) - func(self, args[1]) - else: - raise ValueError('invalid number of arguments') - return wrapper - - -class Pool: - """Collection of (data, offset) pairs sorted by data for quick access.""" - - def __init__(self): - self._pool = [] # sorted list of (data, offset) tuples - - def FindOrInsert(self, data, offset): - do = data, offset - index = _BinarySearch(self._pool, do, lambda a, b: a[0] < b[0]) - if index != -1: - _, offset = self._pool[index] - return offset - self._pool.insert(index, do) - return None - - def Clear(self): - self._pool = [] - - @property - def Elements(self): - return [data for data, _ in self._pool] - - -class Builder: - """Helper class to encode structural data into flexbuffers format.""" - - def __init__(self, - share_strings=False, - share_keys=True, - force_min_bit_width=BitWidth.W8): - self._share_strings = share_strings - self._share_keys = share_keys - self._force_min_bit_width = force_min_bit_width - - self._string_pool = Pool() - self._key_pool = Pool() - - self._finished = False - self._buf = bytearray() - self._stack = [] - - def __len__(self): - return len(self._buf) - - @property - def StringPool(self): - return self._string_pool - - @property - def KeyPool(self): - return self._key_pool - - def Clear(self): - self._string_pool.Clear() - self._key_pool.Clear() - self._finished = False - self._buf = bytearray() - self._stack = [] - - def Finish(self): - """Finishes encoding process and returns underlying buffer.""" - if self._finished: - raise RuntimeError('builder has been already finished') - - # If you hit this exception, you likely have objects that were never - # included in a parent. You need to have exactly one root to finish a - # buffer. Check your Start/End calls are matched, and all objects are inside - # some other object. - if len(self._stack) != 1: - raise RuntimeError('internal stack size must be one') - - value = self._stack[0] - byte_width = self._Align(value.ElemWidth(len(self._buf))) - self._WriteAny(value, byte_width=byte_width) # Root value - self._Write(U, value.StoredPackedType(), byte_width=1) # Root type - self._Write(U, byte_width, byte_width=1) # Root size - - self.finished = True - return self._buf - - def _ReadKey(self, offset): - key = self._buf[offset:] - return key[:key.find(0)] - - def _Align(self, alignment): - byte_width = 1 << alignment - self._buf.extend(b'\x00' * _PaddingBytes(len(self._buf), byte_width)) - return byte_width - - def _Write(self, fmt, value, byte_width): - self._buf.extend(_Pack(fmt, value, byte_width)) - - def _WriteVector(self, fmt, values, byte_width): - self._buf.extend(_PackVector(fmt, values, byte_width)) - - def _WriteOffset(self, offset, byte_width): - relative_offset = len(self._buf) - offset - assert byte_width == 8 or relative_offset < (1 << (8 * byte_width)) - self._Write(U, relative_offset, byte_width) - - def _WriteAny(self, value, byte_width): - fmt = { - Type.NULL: U, Type.BOOL: U, Type.INT: I, Type.UINT: U, Type.FLOAT: F - }.get(value.Type) - if fmt: - self._Write(fmt, value.Value, byte_width) - else: - self._WriteOffset(value.Value, byte_width) - - def _WriteBlob(self, data, append_zero, type_): - bit_width = BitWidth.U(len(data)) - byte_width = self._Align(bit_width) - self._Write(U, len(data), byte_width) - loc = len(self._buf) - self._buf.extend(data) - if append_zero: - self._buf.append(0) - self._stack.append(Value(loc, type_, bit_width)) - return loc - - def _WriteScalarVector(self, element_type, byte_width, elements, fixed): - """Writes scalar vector elements to the underlying buffer.""" - bit_width = BitWidth.B(byte_width) - # If you get this exception, you're trying to write a vector with a size - # field that is bigger than the scalars you're trying to write (e.g. a - # byte vector > 255 elements). For such types, write a "blob" instead. - if BitWidth.U(len(elements)) > bit_width: - raise ValueError('too many elements for the given byte_width') - - self._Align(bit_width) - if not fixed: - self._Write(U, len(elements), byte_width) - - loc = len(self._buf) - - fmt = {Type.INT: I, Type.UINT: U, Type.FLOAT: F}.get(element_type) - if not fmt: - raise TypeError('unsupported element_type') - self._WriteVector(fmt, elements, byte_width) - - type_ = Type.ToTypedVector(element_type, len(elements) if fixed else 0) - self._stack.append(Value(loc, type_, bit_width)) - return loc - - def _CreateVector(self, elements, typed, fixed, keys=None): - """Writes vector elements to the underlying buffer.""" - length = len(elements) - - if fixed and not typed: - raise ValueError('fixed vector must be typed') - - # Figure out smallest bit width we can store this vector with. - bit_width = max(self._force_min_bit_width, BitWidth.U(length)) - prefix_elems = 1 # Vector size - if keys: - bit_width = max(bit_width, keys.ElemWidth(len(self._buf))) - prefix_elems += 2 # Offset to the keys vector and its byte width. - - vector_type = Type.KEY - # Check bit widths and types for all elements. - for i, e in enumerate(elements): - bit_width = max(bit_width, e.ElemWidth(len(self._buf), prefix_elems + i)) - - if typed: - if i == 0: - vector_type = e.Type - else: - if vector_type != e.Type: - raise RuntimeError('typed vector elements must be of the same type') - - if fixed and not Type.IsFixedTypedVectorElementType(vector_type): - raise RuntimeError('must be fixed typed vector element type') - - byte_width = self._Align(bit_width) - # Write vector. First the keys width/offset if available, and size. - if keys: - self._WriteOffset(keys.Value, byte_width) - self._Write(U, 1 << keys.MinBitWidth, byte_width) - - if not fixed: - self._Write(U, length, byte_width) - - # Then the actual data. - loc = len(self._buf) - for e in elements: - self._WriteAny(e, byte_width) - - # Then the types. - if not typed: - for e in elements: - self._buf.append(e.StoredPackedType(bit_width)) - - if keys: - type_ = Type.MAP - else: - if typed: - type_ = Type.ToTypedVector(vector_type, length if fixed else 0) - else: - type_ = Type.VECTOR - - return Value(loc, type_, bit_width) - - def _PushIndirect(self, value, type_, bit_width): - byte_width = self._Align(bit_width) - loc = len(self._buf) - fmt = { - Type.INDIRECT_INT: I, - Type.INDIRECT_UINT: U, - Type.INDIRECT_FLOAT: F - }[type_] - self._Write(fmt, value, byte_width) - self._stack.append(Value(loc, type_, bit_width)) - - @InMapForString - def String(self, value): - """Encodes string value.""" - reset_to = len(self._buf) - encoded = value.encode('utf-8') - loc = self._WriteBlob(encoded, append_zero=True, type_=Type.STRING) - if self._share_strings: - prev_loc = self._string_pool.FindOrInsert(encoded, loc) - if prev_loc is not None: - del self._buf[reset_to:] - self._stack[-1]._value = loc = prev_loc # pylint: disable=protected-access - - return loc - - @InMap - def Blob(self, value): - """Encodes binary blob value. - - Args: - value: A byte/bytearray value to encode - - Returns: - Offset of the encoded value in underlying the byte buffer. - """ - return self._WriteBlob(value, append_zero=False, type_=Type.BLOB) - - def Key(self, value): - """Encodes key value. - - Args: - value: A byte/bytearray/str value to encode. Byte object must not contain - zero bytes. String object must be convertible to ASCII. - - Returns: - Offset of the encoded value in the underlying byte buffer. - """ - if isinstance(value, (bytes, bytearray)): - encoded = value - else: - encoded = value.encode('ascii') - - if 0 in encoded: - raise ValueError('key contains zero byte') - - loc = len(self._buf) - self._buf.extend(encoded) - self._buf.append(0) - if self._share_keys: - prev_loc = self._key_pool.FindOrInsert(encoded, loc) - if prev_loc is not None: - del self._buf[loc:] - loc = prev_loc - - self._stack.append(Value.Key(loc)) - return loc - - def Null(self, key=None): - """Encodes None value.""" - if key: - self.Key(key) - self._stack.append(Value.Null()) - - @InMap - def Bool(self, value): - """Encodes boolean value. - - Args: - value: A boolean value. - """ - self._stack.append(Value.Bool(value)) - - @InMap - def Int(self, value, byte_width=0): - """Encodes signed integer value. - - Args: - value: A signed integer value. - byte_width: Number of bytes to use: 1, 2, 4, or 8. - """ - bit_width = BitWidth.I(value) if byte_width == 0 else BitWidth.B(byte_width) - self._stack.append(Value.Int(value, bit_width)) - - @InMap - def IndirectInt(self, value, byte_width=0): - """Encodes signed integer value indirectly. - - Args: - value: A signed integer value. - byte_width: Number of bytes to use: 1, 2, 4, or 8. - """ - bit_width = BitWidth.I(value) if byte_width == 0 else BitWidth.B(byte_width) - self._PushIndirect(value, Type.INDIRECT_INT, bit_width) - - @InMap - def UInt(self, value, byte_width=0): - """Encodes unsigned integer value. - - Args: - value: An unsigned integer value. - byte_width: Number of bytes to use: 1, 2, 4, or 8. - """ - bit_width = BitWidth.U(value) if byte_width == 0 else BitWidth.B(byte_width) - self._stack.append(Value.UInt(value, bit_width)) - - @InMap - def IndirectUInt(self, value, byte_width=0): - """Encodes unsigned integer value indirectly. - - Args: - value: An unsigned integer value. - byte_width: Number of bytes to use: 1, 2, 4, or 8. - """ - bit_width = BitWidth.U(value) if byte_width == 0 else BitWidth.B(byte_width) - self._PushIndirect(value, Type.INDIRECT_UINT, bit_width) - - @InMap - def Float(self, value, byte_width=0): - """Encodes floating point value. - - Args: - value: A floating point value. - byte_width: Number of bytes to use: 4 or 8. - """ - bit_width = BitWidth.F(value) if byte_width == 0 else BitWidth.B(byte_width) - self._stack.append(Value.Float(value, bit_width)) - - @InMap - def IndirectFloat(self, value, byte_width=0): - """Encodes floating point value indirectly. - - Args: - value: A floating point value. - byte_width: Number of bytes to use: 4 or 8. - """ - bit_width = BitWidth.F(value) if byte_width == 0 else BitWidth.B(byte_width) - self._PushIndirect(value, Type.INDIRECT_FLOAT, bit_width) - - def _StartVector(self): - """Starts vector construction.""" - return len(self._stack) - - def _EndVector(self, start, typed, fixed): - """Finishes vector construction by encodung its elements.""" - vec = self._CreateVector(self._stack[start:], typed, fixed) - del self._stack[start:] - self._stack.append(vec) - return vec.Value - - @contextlib.contextmanager - def Vector(self, key=None): - if key: - self.Key(key) - - try: - start = self._StartVector() - yield self - finally: - self._EndVector(start, typed=False, fixed=False) - - @InMap - def VectorFromElements(self, elements): - """Encodes sequence of any elements as a vector. - - Args: - elements: sequence of elements, they may have different types. - """ - with self.Vector(): - for e in elements: - self.Add(e) - - @contextlib.contextmanager - def TypedVector(self, key=None): - if key: - self.Key(key) - - try: - start = self._StartVector() - yield self - finally: - self._EndVector(start, typed=True, fixed=False) - - @InMap - def TypedVectorFromElements(self, elements, element_type=None): - """Encodes sequence of elements of the same type as typed vector. - - Args: - elements: Sequence of elements, they must be of the same type. - element_type: Suggested element type. Setting it to None means determining - correct value automatically based on the given elements. - """ - if isinstance(elements, array.array): - if elements.typecode == 'f': - self._WriteScalarVector(Type.FLOAT, 4, elements, fixed=False) - elif elements.typecode == 'd': - self._WriteScalarVector(Type.FLOAT, 8, elements, fixed=False) - elif elements.typecode in ('b', 'h', 'i', 'l', 'q'): - self._WriteScalarVector( - Type.INT, elements.itemsize, elements, fixed=False) - elif elements.typecode in ('B', 'H', 'I', 'L', 'Q'): - self._WriteScalarVector( - Type.UINT, elements.itemsize, elements, fixed=False) - else: - raise ValueError('unsupported array typecode: %s' % elements.typecode) - else: - add = self.Add if element_type is None else self.Adder(element_type) - with self.TypedVector(): - for e in elements: - add(e) - - @InMap - def FixedTypedVectorFromElements(self, - elements, - element_type=None, - byte_width=0): - """Encodes sequence of elements of the same type as fixed typed vector. - - Args: - elements: Sequence of elements, they must be of the same type. Allowed - types are `Type.INT`, `Type.UINT`, `Type.FLOAT`. Allowed number of - elements are 2, 3, or 4. - element_type: Suggested element type. Setting it to None means determining - correct value automatically based on the given elements. - byte_width: Number of bytes to use per element. For `Type.INT` and - `Type.UINT`: 1, 2, 4, or 8. For `Type.FLOAT`: 4 or 8. Setting it to 0 - means determining correct value automatically based on the given - elements. - """ - if not 2 <= len(elements) <= 4: - raise ValueError('only 2, 3, or 4 elements are supported') - - types = {type(e) for e in elements} - if len(types) != 1: - raise TypeError('all elements must be of the same type') - - type_, = types - - if element_type is None: - element_type = {int: Type.INT, float: Type.FLOAT}.get(type_) - if not element_type: - raise TypeError('unsupported element_type: %s' % type_) - - if byte_width == 0: - width = { - Type.UINT: BitWidth.U, - Type.INT: BitWidth.I, - Type.FLOAT: BitWidth.F - }[element_type] - byte_width = 1 << max(width(e) for e in elements) - - self._WriteScalarVector(element_type, byte_width, elements, fixed=True) - - def _StartMap(self): - """Starts map construction.""" - return len(self._stack) - - def _EndMap(self, start): - """Finishes map construction by encodung its elements.""" - # Interleaved keys and values on the stack. - stack = self._stack[start:] - - if len(stack) % 2 != 0: - raise RuntimeError('must be even number of keys and values') - - for key in stack[::2]: - if key.Type is not Type.KEY: - raise RuntimeError('all map keys must be of %s type' % Type.KEY) - - pairs = zip(stack[::2], stack[1::2]) # [(key, value), ...] - pairs = sorted(pairs, key=lambda pair: self._ReadKey(pair[0].Value)) - - del self._stack[start:] - for pair in pairs: - self._stack.extend(pair) - - keys = self._CreateVector(self._stack[start::2], typed=True, fixed=False) - values = self._CreateVector( - self._stack[start + 1::2], typed=False, fixed=False, keys=keys) - - del self._stack[start:] - self._stack.append(values) - return values.Value - - @contextlib.contextmanager - def Map(self, key=None): - if key: - self.Key(key) - - try: - start = self._StartMap() - yield self - finally: - self._EndMap(start) - - def MapFromElements(self, elements): - start = self._StartMap() - for k, v in elements.items(): - self.Key(k) - self.Add(v) - self._EndMap(start) - - def Adder(self, type_): - return { - Type.BOOL: self.Bool, - Type.INT: self.Int, - Type.INDIRECT_INT: self.IndirectInt, - Type.UINT: self.UInt, - Type.INDIRECT_UINT: self.IndirectUInt, - Type.FLOAT: self.Float, - Type.INDIRECT_FLOAT: self.IndirectFloat, - Type.KEY: self.Key, - Type.BLOB: self.Blob, - Type.STRING: self.String, - }[type_] - - @InMapForString - def Add(self, value): - """Encodes value of any supported type.""" - if value is None: - self.Null() - elif isinstance(value, bool): - self.Bool(value) - elif isinstance(value, int): - self.Int(value) - elif isinstance(value, float): - self.Float(value) - elif isinstance(value, str): - self.String(value) - elif isinstance(value, (bytes, bytearray)): - self.Blob(value) - elif isinstance(value, dict): - with self.Map(): - for k, v in value.items(): - self.Key(k) - self.Add(v) - elif isinstance(value, array.array): - self.TypedVectorFromElements(value) - elif _IsIterable(value): - self.VectorFromElements(value) - else: - raise TypeError('unsupported python type: %s' % type(value)) - - @property - def LastValue(self): - return self._stack[-1] - - @InMap - def ReuseValue(self, value): - self._stack.append(value) - - -def GetRoot(buf): - """Returns root `Ref` object for the given buffer.""" - if len(buf) < 3: - raise ValueError('buffer is too small') - byte_width = buf[-1] - return Ref.PackedType( - Buf(buf, -(2 + byte_width)), byte_width, packed_type=buf[-2]) - - -def Dumps(obj): - """Returns bytearray with the encoded python object.""" - fbb = Builder() - fbb.Add(obj) - return fbb.Finish() - - -def Loads(buf): - """Returns python object decoded from the buffer.""" - return GetRoot(buf).Value diff --git a/third_party/flatbuffers/python/flatbuffers/number_types.py b/third_party/flatbuffers/python/flatbuffers/number_types.py deleted file mode 100644 index 47942ffb2..000000000 --- a/third_party/flatbuffers/python/flatbuffers/number_types.py +++ /dev/null @@ -1,181 +0,0 @@ -# Copyright 2014 Google Inc. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import collections -import struct - -from . import packer -from .compat import import_numpy, NumpyRequiredForThisFeature - -np = import_numpy() - -# For reference, see: -# https://docs.python.org/2/library/ctypes.html#ctypes-fundamental-data-types-2 - -# These classes could be collections.namedtuple instances, but those are new -# in 2.6 and we want to work towards 2.5 compatability. - -class BoolFlags(object): - bytewidth = 1 - min_val = False - max_val = True - py_type = bool - name = "bool" - packer_type = packer.boolean - - -class Uint8Flags(object): - bytewidth = 1 - min_val = 0 - max_val = (2**8) - 1 - py_type = int - name = "uint8" - packer_type = packer.uint8 - - -class Uint16Flags(object): - bytewidth = 2 - min_val = 0 - max_val = (2**16) - 1 - py_type = int - name = "uint16" - packer_type = packer.uint16 - - -class Uint32Flags(object): - bytewidth = 4 - min_val = 0 - max_val = (2**32) - 1 - py_type = int - name = "uint32" - packer_type = packer.uint32 - - -class Uint64Flags(object): - bytewidth = 8 - min_val = 0 - max_val = (2**64) - 1 - py_type = int - name = "uint64" - packer_type = packer.uint64 - - -class Int8Flags(object): - bytewidth = 1 - min_val = -(2**7) - max_val = (2**7) - 1 - py_type = int - name = "int8" - packer_type = packer.int8 - - -class Int16Flags(object): - bytewidth = 2 - min_val = -(2**15) - max_val = (2**15) - 1 - py_type = int - name = "int16" - packer_type = packer.int16 - - -class Int32Flags(object): - bytewidth = 4 - min_val = -(2**31) - max_val = (2**31) - 1 - py_type = int - name = "int32" - packer_type = packer.int32 - - -class Int64Flags(object): - bytewidth = 8 - min_val = -(2**63) - max_val = (2**63) - 1 - py_type = int - name = "int64" - packer_type = packer.int64 - - -class Float32Flags(object): - bytewidth = 4 - min_val = None - max_val = None - py_type = float - name = "float32" - packer_type = packer.float32 - - -class Float64Flags(object): - bytewidth = 8 - min_val = None - max_val = None - py_type = float - name = "float64" - packer_type = packer.float64 - - -class SOffsetTFlags(Int32Flags): - pass - - -class UOffsetTFlags(Uint32Flags): - pass - - -class VOffsetTFlags(Uint16Flags): - pass - - -def valid_number(n, flags): - if flags.min_val is None and flags.max_val is None: - return True - return flags.min_val <= n <= flags.max_val - - -def enforce_number(n, flags): - if flags.min_val is None and flags.max_val is None: - return - if not flags.min_val <= n <= flags.max_val: - raise TypeError("bad number %s for type %s" % (str(n), flags.name)) - - -def float32_to_uint32(n): - packed = struct.pack("<1f", n) - (converted,) = struct.unpack("<1L", packed) - return converted - - -def uint32_to_float32(n): - packed = struct.pack("<1L", n) - (unpacked,) = struct.unpack("<1f", packed) - return unpacked - - -def float64_to_uint64(n): - packed = struct.pack("<1d", n) - (converted,) = struct.unpack("<1Q", packed) - return converted - - -def uint64_to_float64(n): - packed = struct.pack("<1Q", n) - (unpacked,) = struct.unpack("<1d", packed) - return unpacked - - -def to_numpy_type(number_type): - if np is not None: - return np.dtype(number_type.name).newbyteorder('<') - else: - raise NumpyRequiredForThisFeature('Numpy was not found.') diff --git a/third_party/flatbuffers/python/flatbuffers/packer.py b/third_party/flatbuffers/python/flatbuffers/packer.py deleted file mode 100644 index 20ee9f116..000000000 --- a/third_party/flatbuffers/python/flatbuffers/packer.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2016 Google Inc. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -Provide pre-compiled struct packers for encoding and decoding. - -See: https://docs.python.org/2/library/struct.html#format-characters -""" - -import struct -from . import compat - - -boolean = struct.Struct(compat.struct_bool_decl) - -uint8 = struct.Struct("`_ ' - 'serialization format.'), - packages=['flatbuffers'], - include_package_data=True, - requires=[], - description='The FlatBuffers serialization format for Python', - classifiers=[ - 'Intended Audience :: Developers', - 'License :: OSI Approved :: Apache Software License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 3', - 'Topic :: Software Development :: Libraries :: Python Modules', - ], - project_urls={ - 'Documentation': 'https://google.github.io/flatbuffers/', - 'Source': 'https://github.com/google/flatbuffers', - }, -) diff --git a/third_party/flatbuffers/swift/BUILD.bazel b/third_party/flatbuffers/swift/BUILD.bazel deleted file mode 100644 index 7bbf29887..000000000 --- a/third_party/flatbuffers/swift/BUILD.bazel +++ /dev/null @@ -1,8 +0,0 @@ -load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") - -swift_library( - name = "swift", - srcs = glob(["Sources/FlatBuffers/*.swift"]), - module_name = "FlatBuffers", - visibility = ["//visibility:public"], -) diff --git a/third_party/flatbuffers/swift/LICENSE b/third_party/flatbuffers/swift/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/third_party/flatbuffers/swift/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/third_party/flatbuffers/swift/README.md b/third_party/flatbuffers/swift/README.md deleted file mode 100644 index cbacbf4f9..000000000 --- a/third_party/flatbuffers/swift/README.md +++ /dev/null @@ -1,11 +0,0 @@ -FlatBuffers swift can be found in both SPM - -`.package(url: "https://github.com/google/flatbuffers.git", from: "X.Y.Z"),` - -and Cocoapods - -`pod 'FlatBuffers'` - -### Contribute - -1- Always run `swift test --generate-linuxmain` whenever new test functions are added or removed \ No newline at end of file diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/ByteBuffer.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/ByteBuffer.swift deleted file mode 100644 index d33574d8b..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/ByteBuffer.swift +++ /dev/null @@ -1,544 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// `ByteBuffer` is the interface that stores the data for a `Flatbuffers` object -/// it allows users to write and read data directly from memory thus the use of its -/// functions should be used -@frozen -public struct ByteBuffer { - - /// Storage is a container that would hold the memory pointer to solve the issue of - /// deallocating the memory that was held by (memory: UnsafeMutableRawPointer) - @usableFromInline - final class Storage { - // This storage doesn't own the memory, therefore, we won't deallocate on deinit. - private let unowned: Bool - /// pointer to the start of the buffer object in memory - var memory: UnsafeMutableRawPointer - /// Capacity of UInt8 the buffer can hold - var capacity: Int - - @usableFromInline - init(count: Int, alignment: Int) { - memory = UnsafeMutableRawPointer.allocate( - byteCount: count, - alignment: alignment) - capacity = count - unowned = false - } - - @usableFromInline - init(memory: UnsafeMutableRawPointer, capacity: Int, unowned: Bool) { - self.memory = memory - self.capacity = capacity - self.unowned = unowned - } - - deinit { - if !unowned { - memory.deallocate() - } - } - - @usableFromInline - func copy(from ptr: UnsafeRawPointer, count: Int) { - assert( - !unowned, - "copy should NOT be called on a buffer that is built by assumingMemoryBound") - memory.copyMemory(from: ptr, byteCount: count) - } - - @usableFromInline - func initialize(for size: Int) { - assert( - !unowned, - "initalize should NOT be called on a buffer that is built by assumingMemoryBound") - memset(memory, 0, size) - } - - /// Reallocates the buffer incase the object to be written doesnt fit in the current buffer - /// - Parameter size: Size of the current object - @usableFromInline - func reallocate(_ size: Int, writerSize: Int, alignment: Int) { - let currentWritingIndex = capacity &- writerSize - while capacity <= writerSize &+ size { - capacity = capacity << 1 - } - - /// solution take from Apple-NIO - capacity = capacity.convertToPowerofTwo - - let newData = UnsafeMutableRawPointer.allocate( - byteCount: capacity, - alignment: alignment) - memset(newData, 0, capacity &- writerSize) - memcpy( - newData.advanced(by: capacity &- writerSize), - memory.advanced(by: currentWritingIndex), - writerSize) - memory.deallocate() - memory = newData - } - } - - @usableFromInline var _storage: Storage - - /// The size of the elements written to the buffer + their paddings - private var _writerSize: Int = 0 - /// Aliginment of the current memory being written to the buffer - var alignment = 1 - /// Current Index which is being used to write to the buffer, it is written from the end to the start of the buffer - var writerIndex: Int { _storage.capacity &- _writerSize } - - /// Reader is the position of the current Writer Index (capacity - size) - public var reader: Int { writerIndex } - /// Current size of the buffer - public var size: UOffset { UOffset(_writerSize) } - /// Public Pointer to the buffer object in memory. This should NOT be modified for any reason - public var memory: UnsafeMutableRawPointer { _storage.memory } - /// Current capacity for the buffer - public var capacity: Int { _storage.capacity } - /// Crash if the trying to read an unaligned buffer instead of allowing users to read them. - public let allowReadingUnalignedBuffers: Bool - - /// Constructor that creates a Flatbuffer object from a UInt8 - /// - Parameter - /// - bytes: Array of UInt8 - /// - allowReadingUnalignedBuffers: allow reading from unaligned buffer - public init( - bytes: [UInt8], - allowReadingUnalignedBuffers allowUnalignedBuffers: Bool = false) - { - var b = bytes - _storage = Storage(count: bytes.count, alignment: alignment) - _writerSize = _storage.capacity - allowReadingUnalignedBuffers = allowUnalignedBuffers - b.withUnsafeMutableBytes { bufferPointer in - self._storage.copy(from: bufferPointer.baseAddress!, count: bytes.count) - } - } - - #if !os(WASI) - /// Constructor that creates a Flatbuffer from the Swift Data type object - /// - Parameter - /// - data: Swift data Object - /// - allowReadingUnalignedBuffers: allow reading from unaligned buffer - public init( - data: Data, - allowReadingUnalignedBuffers allowUnalignedBuffers: Bool = false) - { - var b = data - _storage = Storage(count: data.count, alignment: alignment) - _writerSize = _storage.capacity - allowReadingUnalignedBuffers = allowUnalignedBuffers - b.withUnsafeMutableBytes { bufferPointer in - self._storage.copy(from: bufferPointer.baseAddress!, count: data.count) - } - } - #endif - - /// Constructor that creates a Flatbuffer instance with a size - /// - Parameter: - /// - size: Length of the buffer - /// - allowReadingUnalignedBuffers: allow reading from unaligned buffer - init(initialSize size: Int) { - let size = size.convertToPowerofTwo - _storage = Storage(count: size, alignment: alignment) - _storage.initialize(for: size) - allowReadingUnalignedBuffers = false - } - - #if swift(>=5.0) && !os(WASI) - /// Constructor that creates a Flatbuffer object from a ContiguousBytes - /// - Parameters: - /// - contiguousBytes: Binary stripe to use as the buffer - /// - count: amount of readable bytes - /// - allowReadingUnalignedBuffers: allow reading from unaligned buffer - public init( - contiguousBytes: Bytes, - count: Int, - allowReadingUnalignedBuffers allowUnalignedBuffers: Bool = false) - { - _storage = Storage(count: count, alignment: alignment) - _writerSize = _storage.capacity - allowReadingUnalignedBuffers = allowUnalignedBuffers - contiguousBytes.withUnsafeBytes { buf in - _storage.copy(from: buf.baseAddress!, count: buf.count) - } - } - #endif - - /// Constructor that creates a Flatbuffer from unsafe memory region without copying - /// - Parameter: - /// - assumingMemoryBound: The unsafe memory region - /// - capacity: The size of the given memory region - /// - allowReadingUnalignedBuffers: allow reading from unaligned buffer - public init( - assumingMemoryBound memory: UnsafeMutableRawPointer, - capacity: Int, - allowReadingUnalignedBuffers allowUnalignedBuffers: Bool = false) - { - _storage = Storage(memory: memory, capacity: capacity, unowned: true) - _writerSize = capacity - allowReadingUnalignedBuffers = allowUnalignedBuffers - } - - /// Creates a copy of the buffer that's being built by calling sizedBuffer - /// - Parameters: - /// - memory: Current memory of the buffer - /// - count: count of bytes - /// - allowReadingUnalignedBuffers: allow reading from unaligned buffer - init( - memory: UnsafeMutableRawPointer, - count: Int, - allowReadingUnalignedBuffers allowUnalignedBuffers: Bool = false) - { - _storage = Storage(count: count, alignment: alignment) - _storage.copy(from: memory, count: count) - _writerSize = _storage.capacity - allowReadingUnalignedBuffers = allowUnalignedBuffers - } - - /// Creates a copy of the existing flatbuffer, by copying it to a different memory. - /// - Parameters: - /// - memory: Current memory of the buffer - /// - count: count of bytes - /// - removeBytes: Removes a number of bytes from the current size - /// - allowReadingUnalignedBuffers: allow reading from unaligned buffer - init( - memory: UnsafeMutableRawPointer, - count: Int, - removing removeBytes: Int, - allowReadingUnalignedBuffers allowUnalignedBuffers: Bool = false) - { - _storage = Storage(count: count, alignment: alignment) - _storage.copy(from: memory, count: count) - _writerSize = removeBytes - allowReadingUnalignedBuffers = allowUnalignedBuffers - } - - /// Fills the buffer with padding by adding to the writersize - /// - Parameter padding: Amount of padding between two to be serialized objects - @inline(__always) - @usableFromInline - mutating func fill(padding: Int) { - assert(padding >= 0, "Fill should be larger than or equal to zero") - ensureSpace(size: padding) - _writerSize = _writerSize &+ (MemoryLayout.size &* padding) - } - - /// Adds an array of type Scalar to the buffer memory - /// - Parameter elements: An array of Scalars - @inline(__always) - @usableFromInline - mutating func push(elements: [T]) { - elements.withUnsafeBytes { ptr in - ensureSpace(size: ptr.count) - memcpy( - _storage.memory.advanced(by: writerIndex &- ptr.count), - UnsafeRawPointer(ptr.baseAddress!), - ptr.count) - self._writerSize = self._writerSize &+ ptr.count - } - } - - /// Adds an array of type Scalar to the buffer memory - /// - Parameter elements: An array of Scalars - @inline(__always) - @usableFromInline - mutating func push(elements: [T]) { - elements.withUnsafeBytes { ptr in - ensureSpace(size: ptr.count) - _storage.memory - .advanced(by: writerIndex &- ptr.count) - .copyMemory(from: ptr.baseAddress!, byteCount: ptr.count) - self._writerSize = self._writerSize &+ ptr.count - } - } - - /// Adds a `ContiguousBytes` to buffer memory - /// - Parameter value: bytes to copy - #if swift(>=5.0) && !os(WASI) - @inline(__always) - @usableFromInline - mutating func push(bytes: ContiguousBytes) { - bytes.withUnsafeBytes { ptr in - ensureSpace(size: ptr.count) - memcpy( - _storage.memory.advanced(by: writerIndex &- ptr.count), - UnsafeRawPointer(ptr.baseAddress!), - ptr.count) - self._writerSize = self._writerSize &+ ptr.count - } - } - #endif - - /// Adds an object of type NativeStruct into the buffer - /// - Parameters: - /// - value: Object that will be written to the buffer - /// - size: size to subtract from the WriterIndex - @usableFromInline - @inline(__always) - mutating func push(struct value: T, size: Int) { - ensureSpace(size: size) - var v = value - withUnsafeBytes(of: &v) { - memcpy( - _storage.memory.advanced(by: writerIndex &- size), - $0.baseAddress!, - size) - self._writerSize = self._writerSize &+ size - } - } - - /// Adds an object of type Scalar into the buffer - /// - Parameters: - /// - value: Object that will be written to the buffer - /// - len: Offset to subtract from the WriterIndex - @inline(__always) - @usableFromInline - mutating func push(value: T, len: Int) { - ensureSpace(size: len) - var v = value - withUnsafeBytes(of: &v) { - memcpy( - _storage.memory.advanced(by: writerIndex &- len), - $0.baseAddress!, - len) - self._writerSize = self._writerSize &+ len - } - } - - /// Adds a string to the buffer using swift.utf8 object - /// - Parameter str: String that will be added to the buffer - /// - Parameter len: length of the string - @inline(__always) - @usableFromInline - mutating func push(string str: String, len: Int) { - ensureSpace(size: len) - if str.utf8 - .withContiguousStorageIfAvailable({ self.push(bytes: $0, len: len) }) != - nil - { - } else { - let utf8View = str.utf8 - for c in utf8View.reversed() { - push(value: c, len: 1) - } - } - } - - /// Writes a string to Bytebuffer using UTF8View - /// - Parameters: - /// - bytes: Pointer to the view - /// - len: Size of string - @usableFromInline - @inline(__always) - mutating func push( - bytes: UnsafeBufferPointer, - len: Int) -> Bool - { - memcpy( - _storage.memory.advanced(by: writerIndex &- len), - UnsafeRawPointer(bytes.baseAddress!), - len) - _writerSize = _writerSize &+ len - return true - } - - /// Write stores an object into the buffer directly or indirectly. - /// - /// Direct: ignores the capacity of buffer which would mean we are referring to the direct point in memory - /// indirect: takes into respect the current capacity of the buffer (capacity - index), writing to the buffer from the end - /// - Parameters: - /// - value: Value that needs to be written to the buffer - /// - index: index to write to - /// - direct: Should take into consideration the capacity of the buffer - @inline(__always) - func write(value: T, index: Int, direct: Bool = false) { - var index = index - if !direct { - index = _storage.capacity &- index - } - assert(index < _storage.capacity, "Write index is out of writing bound") - assert(index >= 0, "Writer index should be above zero") - _storage.memory.storeBytes(of: value, toByteOffset: index, as: T.self) - } - - /// Makes sure that buffer has enouch space for each of the objects that will be written into it - /// - Parameter size: size of object - @discardableResult - @usableFromInline - @inline(__always) - mutating func ensureSpace(size: Int) -> Int { - if size &+ _writerSize > _storage.capacity { - _storage.reallocate(size, writerSize: _writerSize, alignment: alignment) - } - assert(size < FlatBufferMaxSize, "Buffer can't grow beyond 2 Gigabytes") - return size - } - - /// pops the written VTable if it's already written into the buffer - /// - Parameter size: size of the `VTable` - @usableFromInline - @inline(__always) - mutating func pop(_ size: Int) { - assert( - (_writerSize &- size) > 0, - "New size should NOT be a negative number") - memset(_storage.memory.advanced(by: writerIndex), 0, _writerSize &- size) - _writerSize = size - } - - /// Clears the current size of the buffer - @inline(__always) - mutating public func clearSize() { - _writerSize = 0 - } - - /// Clears the current instance of the buffer, replacing it with new memory - @inline(__always) - mutating public func clear() { - _writerSize = 0 - alignment = 1 - _storage.initialize(for: _storage.capacity) - } - - /// Reads an object from the buffer - /// - Parameters: - /// - def: Type of the object - /// - position: the index of the object in the buffer - @inline(__always) - public func read(def: T.Type, position: Int) -> T { - #if swift(>=5.7) - if allowReadingUnalignedBuffers { - return _storage.memory.advanced(by: position).loadUnaligned(as: T.self) - } - #endif - return _storage.memory.advanced(by: position).load(as: T.self) - } - - /// Reads a slice from the memory assuming a type of T - /// - Parameters: - /// - index: index of the object to be read from the buffer - /// - count: count of bytes in memory - @inline(__always) - public func readSlice( - index: Int, - count: Int) -> [T] - { - assert( - index + count <= _storage.capacity, - "Reading out of bounds is illegal") - let start = _storage.memory.advanced(by: index) - .assumingMemoryBound(to: T.self) - let array = UnsafeBufferPointer(start: start, count: count) - return Array(array) - } - - #if !os(WASI) - /// Reads a string from the buffer and encodes it to a swift string - /// - Parameters: - /// - index: index of the string in the buffer - /// - count: length of the string - /// - type: Encoding of the string - @inline(__always) - public func readString( - at index: Int, - count: Int, - type: String.Encoding = .utf8) -> String? - { - assert( - index + count <= _storage.capacity, - "Reading out of bounds is illegal") - let start = _storage.memory.advanced(by: index) - .assumingMemoryBound(to: UInt8.self) - let bufprt = UnsafeBufferPointer(start: start, count: count) - return String(bytes: Array(bufprt), encoding: type) - } - #else - /// Reads a string from the buffer and encodes it to a swift string - /// - Parameters: - /// - index: index of the string in the buffer - /// - count: length of the string - /// - type: Encoding of the string - @inline(__always) - public func readString( - at index: Int, - count: Int) -> String? - { - assert( - index + count <= _storage.capacity, - "Reading out of bounds is illegal") - let start = _storage.memory.advanced(by: index) - .assumingMemoryBound(to: UInt8.self) - let bufprt = UnsafeBufferPointer(start: start, count: count) - return String(cString: bufprt.baseAddress!) - } - #endif - - /// Creates a new Flatbuffer object that's duplicated from the current one - /// - Parameter removeBytes: the amount of bytes to remove from the current Size - @inline(__always) - public func duplicate(removing removeBytes: Int = 0) -> ByteBuffer { - assert(removeBytes > 0, "Can NOT remove negative bytes") - assert( - removeBytes < _storage.capacity, - "Can NOT remove more bytes than the ones allocated") - return ByteBuffer( - memory: _storage.memory, - count: _storage.capacity, - removing: _writerSize &- removeBytes) - } - - /// Returns the written bytes into the ``ByteBuffer`` - public var underlyingBytes: [UInt8] { - let cp = capacity &- writerIndex - let start = memory.advanced(by: writerIndex) - .bindMemory(to: UInt8.self, capacity: cp) - - let ptr = UnsafeBufferPointer(start: start, count: cp) - return Array(ptr) - } - - /// SkipPrefix Skips the first 4 bytes in case one of the following - /// functions are called `getPrefixedSizeCheckedRoot` & `getPrefixedSizeRoot` - /// which allows us to skip the first 4 bytes instead of recreating the buffer - @discardableResult - @usableFromInline - @inline(__always) - mutating func skipPrefix() -> Int32 { - _writerSize = _writerSize &- MemoryLayout.size - return read(def: Int32.self, position: 0) - } - -} - -extension ByteBuffer: CustomDebugStringConvertible { - - public var debugDescription: String { - """ - buffer located at: \(_storage.memory), with capacity of \(_storage.capacity) - { writerSize: \(_writerSize), readerSize: \(reader), writerIndex: \(writerIndex) } - """ - } -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Constants.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Constants.swift deleted file mode 100644 index 03a9b9f5c..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Constants.swift +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -#if os(Linux) -import CoreFoundation -#else -import Foundation -#endif -#else -import SwiftOverlayShims -#endif - -/// A boolean to see if the system is littleEndian -let isLitteEndian: Bool = { - let number: UInt32 = 0x12345678 - return number == number.littleEndian -}() -/// 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.size * 8 - 1) - 1) - -/// Protocol that All Scalars should conform to -/// -/// Scalar is used to conform 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: Verifiable {} - -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 { - self as! Self.NumericValue - } -} - -extension Double: Scalar, Verifiable { - public typealias NumericValue = UInt64 - - public var convertedEndian: UInt64 { - bitPattern.littleEndian - } -} - -extension Float32: Scalar, Verifiable { - public typealias NumericValue = UInt32 - - public var convertedEndian: UInt32 { - bitPattern.littleEndian - } -} - -extension Bool: Scalar, Verifiable { - public var convertedEndian: UInt8 { - self == true ? 1 : 0 - } - - public typealias NumericValue = UInt8 -} - -extension Int: Scalar, Verifiable { - public typealias NumericValue = Int -} - -extension Int8: Scalar, Verifiable { - public typealias NumericValue = Int8 -} - -extension Int16: Scalar, Verifiable { - public typealias NumericValue = Int16 -} - -extension Int32: Scalar, Verifiable { - public typealias NumericValue = Int32 -} - -extension Int64: Scalar, Verifiable { - public typealias NumericValue = Int64 -} - -extension UInt8: Scalar, Verifiable { - public typealias NumericValue = UInt8 -} - -extension UInt16: Scalar, Verifiable { - public typealias NumericValue = UInt16 -} - -extension UInt32: Scalar, Verifiable { - public typealias NumericValue = UInt32 -} - -extension UInt64: Scalar, Verifiable { - public typealias NumericValue = UInt64 -} - -public func FlatBuffersVersion_24_3_25() {} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Documentation.md b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Documentation.md deleted file mode 100644 index a1510808e..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Documentation.md +++ /dev/null @@ -1,22 +0,0 @@ -# ``FlatBuffers`` - -FlatBuffers: Memory Efficient Serialization Library - -## Overview - -- Access to serialized data without parsing/unpacking - What sets FlatBuffers apart is that it represents hierarchical data in a flat binary buffer in such a way that it can still be accessed directly without parsing/unpacking, while also still supporting data structure evolution (forwards/backwards compatibility). -- Memory efficiency and speed - The only memory needed to access your data is that of the buffer. It requires 0 additional allocations (in C++, other languages may vary). FlatBuffers is also very suitable for use with mmap (or streaming), requiring only part of the buffer to be in memory. Access is close to the speed of raw struct access with only one extra indirection (a kind of vtable) to allow for format evolution and optional fields. It is aimed at projects where spending time and space (many memory allocations) to be able to access or construct serialized data is undesirable, such as in games or any other performance sensitive applications. See the benchmarks for details. -- Flexible - Optional fields means not only do you get great forwards and backwards compatibility (increasingly important for long-lived games: don't have to update all data with each new version!). It also means you have a lot of choice in what data you write and what data you don't, and how you design data structures. -- Tiny code footprint - Small amounts of generated code, and just a single small header as the minimum dependency, which is very easy to integrate. Again, see the benchmark section for details. -- Strongly typed - Errors happen at compile time rather than manually having to write repetitive and error prone run-time checks. Useful code can be generated for you. - -## Topics - -### Read this first - -- - -### Where to start - -- ``FlatBufferBuilder`` -- ``ByteBuffer`` diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_1.fbs b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_1.fbs deleted file mode 100644 index 8b1378917..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_1.fbs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_2.fbs b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_2.fbs deleted file mode 100644 index a43897845..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_2.fbs +++ /dev/null @@ -1 +0,0 @@ -enum Color:byte { red, green, blue } diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_3.fbs b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_3.fbs deleted file mode 100644 index d31a29cd0..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_3.fbs +++ /dev/null @@ -1,6 +0,0 @@ -enum Color:byte { red, green, blue } - -struct Vec3 { - x:float; - y:float; -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_4.fbs b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_4.fbs deleted file mode 100644 index 51f7bb1aa..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_4.fbs +++ /dev/null @@ -1,12 +0,0 @@ -enum Color:byte { red, green, blue } - -struct Vec3 { - x:float; - y:float; -} - -table Monster { - pos:Vec3; - color:Color = Blue; -} - diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_5.fbs b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_5.fbs deleted file mode 100644 index 8d0b72956..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_5.fbs +++ /dev/null @@ -1,18 +0,0 @@ -enum Color:byte { red, green, blue } - -struct Vec3 { - x:float; - y:float; -} - -table Monster { - pos:Vec3; - color:Color = Blue; - - mana:short = 150; - hp:short = 100; - name:string; - equipped:Equipment; - weapons:[Weapon]; - path:[Vec3]; -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_6.fbs b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_6.fbs deleted file mode 100644 index 10c3eaf67..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_6.fbs +++ /dev/null @@ -1,25 +0,0 @@ -enum Color:byte { red, green, blue } - -union Equipment { Weapon } // Optionally add more tables. - -struct Vec3 { - x:float; - y:float; -} - -table Monster { - pos:Vec3; - color:Color = Blue; - - mana:short = 150; - hp:short = 100; - name:string; - equipped:Equipment; - weapons:[Weapon]; - path:[Vec3]; -} - -table Weapon { - name:string; - damage:short; -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_7.fbs b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_7.fbs deleted file mode 100644 index b4dde6ced..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/fbs/monster_step_7.fbs +++ /dev/null @@ -1,27 +0,0 @@ -enum Color:byte { red, green, blue } - -union Equipment { Weapon } // Optionally add more tables. - -struct Vec3 { - x:float; - y:float; -} - -table Monster { - pos:Vec3; - color:Color = Blue; - - mana:short = 150; - hp:short = 100; - name:string; - equipped:Equipment; - weapons:[Weapon]; - path:[Vec3]; -} - -table Weapon { - name:string; - damage:short; -} - -root_type Monster; // flatc --swift monster.fbs diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_1.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_1.swift deleted file mode 100644 index fecc4ab44..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_1.swift +++ /dev/null @@ -1 +0,0 @@ -import Foundation diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_10.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_10.swift deleted file mode 100644 index 51d4fbfcd..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_10.swift +++ /dev/null @@ -1,71 +0,0 @@ -import FlatBuffers -import Foundation - -func run() { - // create a `FlatBufferBuilder`, which will be used to serialize objects - let builder = FlatBufferBuilder(initialSize: 1024) - - let weapon1Name = builder.create(string: "Sword") - let weapon2Name = builder.create(string: "Axe") - - // start creating the weapon by calling startWeapon - let weapon1Start = Weapon.startWeapon(&builder) - Weapon.add(name: weapon1Name, &builder) - Weapon.add(damage: 3, &builder) - // end the object by passing the start point for the weapon 1 - let sword = Weapon.endWeapon(&builder, start: weapon1Start) - - let weapon2Start = Weapon.startWeapon(&builder) - Weapon.add(name: weapon2Name, &builder) - Weapon.add(damage: 5, &builder) - let axe = Weapon.endWeapon(&builder, start: weapon2Start) - - // Create a FlatBuffer `vector` that contains offsets to the sword and axe - // we created above. - let weaponsOffset = builder.createVector(ofOffsets: [sword, axe]) - - // Name of the Monster. - let name = builder.create(string: "Orc") - - let pathOffset = fbb.createVector(ofStructs: [ - Vec3(x: 0, y: 0), - Vec3(x: 5, y: 5), - ]) - - // startVector(len, elementSize: MemoryLayout.size) - // for o in offsets.reversed() { - // push(element: o) - // } - // endVector(len: len) - - let orc = Monster.createMonster( - &builder, - pos: Vec3(x: 1, y: 2), - hp: 300, - nameOffset: name, - color: .red, - weaponsVectorOffset: weaponsOffset, - equippedType: .weapon, - equippedOffset: axe, - pathOffset: pathOffset) - - // let start = Monster.startMonster(&builder) - // Monster.add(pos: Vec3(x: 1, y: 2), &builder) - // Monster.add(hp: 300, &builder) - // Monster.add(name: name, &builder) - // Monster.add(color: .red, &builder) - // Monster.addVectorOf(weapons: weaponsOffset, &builder) - // Monster.add(equippedType: .weapon, &builder) - // Monster.addVectorOf(paths: weaponsOffset, &builder) - // Monster.add(equipped: axe, &builder) - // var orc = Monster.endMonster(&builder, start: start) - - // Call `finish(offset:)` to instruct the builder that this monster is complete. - builder.finish(offset: orc) - // This must be called after `finish()`. - // `sizedByteArray` returns the finished buf of type [UInt8]. - let buf = builder.sizedByteArray - - // or you can use to get an object of type Data - let bufData = ByteBuffer(data: builder.sizedBuffer) -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_11.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_11.swift deleted file mode 100644 index 07d2d8d2b..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_11.swift +++ /dev/null @@ -1,11 +0,0 @@ -import FlatBuffers -import Foundation - -func run() { - // create a ByteBuffer(:) from an [UInt8] or Data() - let buf = [] // Get your data - var byteBuffer = ByteBuffer(bytes: buf) - // Get an accessor to the root object inside the buffer. - let monster: Monster = try! getCheckedRoot(byteBuffer: &byteBuffer) - // let monster: Monster = getRoot(byteBuffer: &byteBuffer) -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_12.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_12.swift deleted file mode 100644 index 0d9ff6943..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_12.swift +++ /dev/null @@ -1,19 +0,0 @@ -import FlatBuffers -import Foundation - -func run() { - // create a ByteBuffer(:) from an [UInt8] or Data() - let buf = [] // Get your data - var byteBuffer = ByteBuffer(bytes: buf) - // Get an accessor to the root object inside the buffer. - let monster: Monster = try! getCheckedRoot(byteBuffer: &byteBuffer) - // let monster: Monster = getRoot(byteBuffer: &byteBuffer) - - let hp = monster.hp - let mana = monster.mana - let name = monster.name // returns an optional string - - let pos = monster.pos - let x = pos.x - let y = pos.y -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_13.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_13.swift deleted file mode 100644 index 1372d6fc0..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_13.swift +++ /dev/null @@ -1,26 +0,0 @@ -import FlatBuffers -import Foundation - -func run() { - // create a ByteBuffer(:) from an [UInt8] or Data() - let buf = [] // Get your data - var byteBuffer = ByteBuffer(bytes: buf) - // Get an accessor to the root object inside the buffer. - let monster: Monster = try! getCheckedRoot(byteBuffer: &byteBuffer) - // let monster: Monster = getRoot(byteBuffer: &byteBuffer) - - let hp = monster.hp - let mana = monster.mana - let name = monster.name // returns an optional string - - let pos = monster.pos - let x = pos.x - let y = pos.y - - // Get and check if the monster has an equipped item - if monster.equippedType == .weapon { - let _weapon = monster.equipped(type: Weapon.self) - let name = _weapon.name // should return "Axe" - let dmg = _weapon.damage // should return 5 - } -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_2.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_2.swift deleted file mode 100644 index ddd066e7a..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_2.swift +++ /dev/null @@ -1,2 +0,0 @@ -import FlatBuffers -import Foundation diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_3.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_3.swift deleted file mode 100644 index bacdaa551..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_3.swift +++ /dev/null @@ -1,7 +0,0 @@ -import FlatBuffers -import Foundation - -func run() { - // create a `FlatBufferBuilder`, which will be used to serialize objects - let builder = FlatBufferBuilder(initialSize: 1024) -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_4.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_4.swift deleted file mode 100644 index 87546993b..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_4.swift +++ /dev/null @@ -1,10 +0,0 @@ -import FlatBuffers -import Foundation - -func run() { - // create a `FlatBufferBuilder`, which will be used to serialize objects - let builder = FlatBufferBuilder(initialSize: 1024) - - let weapon1Name = builder.create(string: "Sword") - let weapon2Name = builder.create(string: "Axe") -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_5.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_5.swift deleted file mode 100644 index 12e0d4ca6..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_5.swift +++ /dev/null @@ -1,22 +0,0 @@ -import FlatBuffers -import Foundation - -func run() { - // create a `FlatBufferBuilder`, which will be used to serialize objects - let builder = FlatBufferBuilder(initialSize: 1024) - - let weapon1Name = builder.create(string: "Sword") - let weapon2Name = builder.create(string: "Axe") - - // start creating the weapon by calling startWeapon - let weapon1Start = Weapon.startWeapon(&builder) - Weapon.add(name: weapon1Name, &builder) - Weapon.add(damage: 3, &builder) - // end the object by passing the start point for the weapon 1 - let sword = Weapon.endWeapon(&builder, start: weapon1Start) - - let weapon2Start = Weapon.startWeapon(&builder) - Weapon.add(name: weapon2Name, &builder) - Weapon.add(damage: 5, &builder) - let axe = Weapon.endWeapon(&builder, start: weapon2Start) -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_6.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_6.swift deleted file mode 100644 index bfb4f7e51..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_6.swift +++ /dev/null @@ -1,26 +0,0 @@ -import FlatBuffers -import Foundation - -func run() { - // create a `FlatBufferBuilder`, which will be used to serialize objects - let builder = FlatBufferBuilder(initialSize: 1024) - - let weapon1Name = builder.create(string: "Sword") - let weapon2Name = builder.create(string: "Axe") - - // start creating the weapon by calling startWeapon - let weapon1Start = Weapon.startWeapon(&builder) - Weapon.add(name: weapon1Name, &builder) - Weapon.add(damage: 3, &builder) - // end the object by passing the start point for the weapon 1 - let sword = Weapon.endWeapon(&builder, start: weapon1Start) - - let weapon2Start = Weapon.startWeapon(&builder) - Weapon.add(name: weapon2Name, &builder) - Weapon.add(damage: 5, &builder) - let axe = Weapon.endWeapon(&builder, start: weapon2Start) - - // Create a FlatBuffer `vector` that contains offsets to the sword and axe - // we created above. - let weaponsOffset = builder.createVector(ofOffsets: [sword, axe]) -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_7.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_7.swift deleted file mode 100644 index 97264b018..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_7.swift +++ /dev/null @@ -1,29 +0,0 @@ -import FlatBuffers -import Foundation - -func run() { - // create a `FlatBufferBuilder`, which will be used to serialize objects - let builder = FlatBufferBuilder(initialSize: 1024) - - let weapon1Name = builder.create(string: "Sword") - let weapon2Name = builder.create(string: "Axe") - - // start creating the weapon by calling startWeapon - let weapon1Start = Weapon.startWeapon(&builder) - Weapon.add(name: weapon1Name, &builder) - Weapon.add(damage: 3, &builder) - // end the object by passing the start point for the weapon 1 - let sword = Weapon.endWeapon(&builder, start: weapon1Start) - - let weapon2Start = Weapon.startWeapon(&builder) - Weapon.add(name: weapon2Name, &builder) - Weapon.add(damage: 5, &builder) - let axe = Weapon.endWeapon(&builder, start: weapon2Start) - - // Create a FlatBuffer `vector` that contains offsets to the sword and axe - // we created above. - let weaponsOffset = builder.createVector(ofOffsets: [sword, axe]) - - // Name of the Monster. - let name = builder.create(string: "Orc") -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_8.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_8.swift deleted file mode 100644 index a0c281980..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_8.swift +++ /dev/null @@ -1,40 +0,0 @@ -import FlatBuffers -import Foundation - -func run() { - // create a `FlatBufferBuilder`, which will be used to serialize objects - let builder = FlatBufferBuilder(initialSize: 1024) - - let weapon1Name = builder.create(string: "Sword") - let weapon2Name = builder.create(string: "Axe") - - // start creating the weapon by calling startWeapon - let weapon1Start = Weapon.startWeapon(&builder) - Weapon.add(name: weapon1Name, &builder) - Weapon.add(damage: 3, &builder) - // end the object by passing the start point for the weapon 1 - let sword = Weapon.endWeapon(&builder, start: weapon1Start) - - let weapon2Start = Weapon.startWeapon(&builder) - Weapon.add(name: weapon2Name, &builder) - Weapon.add(damage: 5, &builder) - let axe = Weapon.endWeapon(&builder, start: weapon2Start) - - // Create a FlatBuffer `vector` that contains offsets to the sword and axe - // we created above. - let weaponsOffset = builder.createVector(ofOffsets: [sword, axe]) - - // Name of the Monster. - let name = builder.create(string: "Orc") - - let pathOffset = fbb.createVector(ofStructs: [ - Vec3(x: 0, y: 0), - Vec3(x: 5, y: 5), - ]) - - // startVector(len, elementSize: MemoryLayout.size) - // for o in offsets.reversed() { - // push(element: o) - // } - // endVector(len: len) -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_9.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_9.swift deleted file mode 100644 index 51ce8fd2c..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/code/swift/swift_code_9.swift +++ /dev/null @@ -1,62 +0,0 @@ -import FlatBuffers -import Foundation - -func run() { - // create a `FlatBufferBuilder`, which will be used to serialize objects - let builder = FlatBufferBuilder(initialSize: 1024) - - let weapon1Name = builder.create(string: "Sword") - let weapon2Name = builder.create(string: "Axe") - - // start creating the weapon by calling startWeapon - let weapon1Start = Weapon.startWeapon(&builder) - Weapon.add(name: weapon1Name, &builder) - Weapon.add(damage: 3, &builder) - // end the object by passing the start point for the weapon 1 - let sword = Weapon.endWeapon(&builder, start: weapon1Start) - - let weapon2Start = Weapon.startWeapon(&builder) - Weapon.add(name: weapon2Name, &builder) - Weapon.add(damage: 5, &builder) - let axe = Weapon.endWeapon(&builder, start: weapon2Start) - - // Create a FlatBuffer `vector` that contains offsets to the sword and axe - // we created above. - let weaponsOffset = builder.createVector(ofOffsets: [sword, axe]) - - // Name of the Monster. - let name = builder.create(string: "Orc") - - let pathOffset = fbb.createVector(ofStructs: [ - Vec3(x: 0, y: 0), - Vec3(x: 5, y: 5), - ]) - - // startVector(len, elementSize: MemoryLayout.size) - // for o in offsets.reversed() { - // push(element: o) - // } - // endVector(len: len) - - let orc = Monster.createMonster( - &builder, - pos: Vec3(x: 1, y: 2), - hp: 300, - nameOffset: name, - color: .red, - weaponsVectorOffset: weaponsOffset, - equippedType: .weapon, - equippedOffset: axe, - pathOffset: pathOffset) - - // let start = Monster.startMonster(&builder) - // Monster.add(pos: Vec3(x: 1, y: 2), &builder) - // Monster.add(hp: 300, &builder) - // Monster.add(name: name, &builder) - // Monster.add(color: .red, &builder) - // Monster.addVectorOf(weapons: weaponsOffset, &builder) - // Monster.add(equippedType: .weapon, &builder) - // Monster.addVectorOf(paths: weaponsOffset, &builder) - // Monster.add(equipped: axe, &builder) - // var orc = Monster.endMonster(&builder, start: start) -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/images/tutorial_cover_image_1.png b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/images/tutorial_cover_image_1.png deleted file mode 100644 index 0e64fe601..000000000 Binary files a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Resources/images/tutorial_cover_image_1.png and /dev/null differ diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Tutorials/Tutorial_Table_of_Contents.tutorial b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Tutorials/Tutorial_Table_of_Contents.tutorial deleted file mode 100644 index 009116fc4..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Tutorials/Tutorial_Table_of_Contents.tutorial +++ /dev/null @@ -1,14 +0,0 @@ -@Tutorials(name: "Starting with FlatBuffers") { - @Intro(title: "Starting with FlatBuffers") { - FlatBuffers is an efficient cross platform serialization library for C++, - C#, C, Go, Java, Kotlin, JavaScript, Lobster, Lua, TypeScript, PHP, Python, Rust and Swift. - It was originally created at Google for game development and other performance-critical applications. - } - @Chapter(name: "Generating your code") { - Start by generating your first FlatBuffers objects. - @Image(source: tutorial_cover_image_1.png, alt: "A code structure for a base struct in flatbuffers") - @TutorialReference(tutorial: "doc:creating_flatbuffer_schema") - @TutorialReference(tutorial: "doc:create_your_first_buffer") - @TutorialReference(tutorial: "doc:reading_bytebuffer") - } -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Tutorials/create_your_first_buffer.tutorial b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Tutorials/create_your_first_buffer.tutorial deleted file mode 100644 index 2f8089f7d..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Tutorials/create_your_first_buffer.tutorial +++ /dev/null @@ -1,72 +0,0 @@ -@Tutorial(time: 5) { - @Intro(title: "After having our code generated") { - After generating the code from the previous section, we will know start creating our monster object. - We will create a monster object called orc. - } - - @Section(title: "Building your first buffer") { - @ContentAndMedia {} - @Steps { - @Step { - Starting with a new file, we will create our very first Flatbuffer. - @Code(name: "ViewController.swift", file: "swift_code_1.swift") - } - @Step { - First, we need to import ``FlatBuffers`` - @Code(name: "ViewController.swift", file: "swift_code_2.swift") - } - @Step { - We need to create an instance of the `FlatBufferBuilder`, which will contain the buffer as it grows. - You can pass an initial size of the buffer (here 1024 bytes), which will grow automatically if needed. - @Code(name: "ViewController.swift", file: "swift_code_3.swift") - } - @Step { - After creating the builder, we can start serializing our data. Before we make our orc Monster, - let's create some Weapons: a Sword and an Axe. However we will start by naming our weapons as `Sword` and `Axe` - @Code(name: "ViewController.swift", file: "swift_code_4.swift") - } - @Step { - After naming the weapons, we will create two weapon objects with the damage that the weapon is going to deal. - That's done by calling the `start` Method on each table you will be creating, in this case its called `startWeapon` - and finished by calling `end`. - @Code(name: "ViewController.swift", file: "swift_code_5.swift") - } - @Step { - We will take our (Sword and Axe) serialized data and serialize their offsets as a vector of tables into our `ByteBuffer`. - So we can reference them later on from our Monster Object - @Code(name: "ViewController.swift", file: "swift_code_6.swift") - } - @Step { - We will add our Monster name as a string value just like we did with the weapons. - @Code(name: "ViewController.swift", file: "swift_code_7.swift") - } - - @Step { - We will create a path that our monster should be using while roaming in its den. To create a vector of paths we would us - `createVector(ofStructs: [])` which will take a Native `Swift` struct that has been padded to fit the `FlatBuffers` standards. - - There are usually two ways of creating vectors in `FlatBuffers` which you can see in commented out code. - And thus there are multiple convenience methods that will cover all the bases - when trying to create a vector so that you dont have to create it with `start` and `end` - @Code(name: "ViewController.swift", file: "swift_code_8.swift") - } - - @Step { - Now to serialize our data into our `Monster` object. Which again there are two ways of doing, by calling the `create` method or - by serializing the objects yourself. What we added to our Monster were the `Equipped Type` and the `Equipped` union itself, which - allows the Monster to have the `Axe` as his equipped weapon. - - Important: Unlike structs, you should not nest tables or other objects, - which is why we created all the `strings/vectors/tables` that this monster refers to before start. - If you try to create any of them between start and end, you will get an `assert`. - @Code(name: "ViewController.swift", file: "swift_code_9.swift") - } - - @Step { - Finally you can just finalize the buffer by calling `builder.finish` and get the Byte array from the buffer. - @Code(name: "ViewController.swift", file: "swift_code_10.swift") - } - - } - } - } diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Tutorials/creating_flatbuffer_schema.tutorial b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Tutorials/creating_flatbuffer_schema.tutorial deleted file mode 100644 index 0fcd362ef..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Tutorials/creating_flatbuffer_schema.tutorial +++ /dev/null @@ -1,47 +0,0 @@ -@Tutorial(time: 2) { - @Intro(title: "Creating a schema") { - You will need to have the FlatBuffer compiler to be installed on your device - } - - @Section(title: "Creating a schema") { - @ContentAndMedia {} - @Steps { - @Step { - Start by creating a new empty folder called `monster.fbs`. We want to create a Monster table, that contains - position, color, and basic information about the monster. - @Code(name: "monster.fbs", file: "monster_step_1.fbs") - } - @Step { - We will start by adding our Color object. We will be using an enumerate, to represent this object - @Code(name: "monster.fbs", file: "monster_step_2.fbs") - } - @Step { - We will add a position object and will use a struct to represent that type of data. Where we will need the monsters - x and y positions. - @Code(name: "monster.fbs", file: "monster_step_3.fbs") - } - @Step { - Then we will be creating our Monster object of type table. This will contain the current position of our - monster and its color - @Code(name: "monster.fbs", file: "monster_step_4.fbs") - } - @Step { - Our Monster is missing a name, mana, hp, name, equipped Weapon, weapons, and path. We will be adding these - fields to our table with a proper data type for each. Example; weapons, and path would be a vector of data. - @Code(name: "monster.fbs", file: "monster_step_5.fbs") - } - @Step { - Now we are missing two data types here, `Weapon` and `Equipment`. And since Equipment can be a weapon, we will be using - a `Union` enumerate that can contain all the equipment that you would want your monster to have. And the weapon can simply - have a name and amount of damage - @Code(name: "monster.fbs", file: "monster_step_6.fbs") - } - @Step { - And to finalize our monster table, we can add a root type of type Monster. - Then run the command `flatc --swift monster.fbs` - Note: Make sure to import the file to your xcode project. - @Code(name: "monster.fbs", file: "monster_step_7.fbs") - } - } - } - } diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Tutorials/reading_bytebuffer.tutorial b/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Tutorials/reading_bytebuffer.tutorial deleted file mode 100644 index 2c4609f7e..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Documentation.docc/Tutorials/reading_bytebuffer.tutorial +++ /dev/null @@ -1,27 +0,0 @@ -@Tutorial(time: 2) { - @Intro(title: "Reading ByteBuffers") { - After getting our ByteBuffer created, we can now read it. - } - - @Section(title: "Reading your first buffer") { - @ContentAndMedia {} - @Steps { - @Step { - After fetching the data from disk or network you need to access that data, and that can be done. - By simply calling `getCheckedRoot`, which checks if the data is valid before enabling you to read from a corrupt buffer. - however, if you are sure that the data is 100% correct you can simply call `getRoot` - @Code(name: "ViewController.swift", file: "swift_code_11.swift") - } - @Step { - Now since we have a Monster object, all the fields can be accessed by simply fetching the data. Note, Deprecated fields will not - show up - @Code(name: "ViewController.swift", file: "swift_code_12.swift") - } - @Step { - And you can access union types as easy as this - @Code(name: "ViewController.swift", file: "swift_code_13.swift") - } - } - } - } - diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Enum.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Enum.swift deleted file mode 100644 index ab5db06c9..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Enum.swift +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// Enum is a protocol that all flatbuffers enums should conform to -/// Since it allows us to get the actual `ByteSize` and `Value` from -/// a swift enum. -public protocol Enum { - /// associatedtype that the type of the enum should conform to - associatedtype T: Scalar & Verifiable - /// Size of the current associatedtype in the enum - static var byteSize: Int { get } - /// The current value the enum hosts - var value: T { get } -} - -extension Enum where Self: Verifiable { - - /// Verifies that the current value is which the bounds of the buffer, and if - /// the current `Value` is aligned properly - /// - Parameters: - /// - verifier: Verifier that hosts the buffer - /// - position: Current position within the buffer - /// - type: The type of the object to be verified - /// - Throws: Errors coming from `inBuffer` function - public static func verify( - _ verifier: inout Verifier, - at position: Int, - of type: T.Type) throws where T: Verifiable - { - try verifier.inBuffer(position: position, of: type.self) - } - -} - -/// UnionEnum is a Protocol that allows us to create Union type of enums -/// and their value initializers. Since an `init` was required by -/// the verifier -public protocol UnionEnum: Enum { - init?(value: T) throws -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/FlatBufferBuilder.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/FlatBufferBuilder.swift deleted file mode 100644 index bf1978e33..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/FlatBufferBuilder.swift +++ /dev/null @@ -1,934 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// ``FlatBufferBuilder`` builds a `FlatBuffer` through manipulating its internal state. -/// -/// This is done by creating a ``ByteBuffer`` that hosts the incoming data and -/// has a hardcoded growth limit of `2GiB` which is set by the Flatbuffers standards. -/// -/// ```swift -/// var builder = FlatBufferBuilder() -/// ``` -/// The builder should be always created as a variable, since it would be passed into the writers -/// -@frozen -public struct FlatBufferBuilder { - - /// Storage for the Vtables used in the buffer are stored in here, so they would be written later in EndTable - @usableFromInline internal var _vtableStorage = VTableStorage() - /// Flatbuffer data will be written into - @usableFromInline internal var _bb: ByteBuffer - - /// Reference Vtables that were already written to the buffer - private var _vtables: [UOffset] = [] - /// A check if the buffer is being written into by a different table - private var isNested = false - /// Dictonary that stores a map of all the strings that were written to the buffer - private var stringOffsetMap: [String: Offset] = [:] - /// A check to see if finish(::) was ever called to retreive data object - private var finished = false - /// A check to see if the buffer should serialize Default values - private var serializeDefaults: Bool - - /// Current alignment for the buffer - var _minAlignment: Int = 0 { - didSet { - _bb.alignment = _minAlignment - } - } - - /// Gives a read access to the buffer's size - public var size: UOffset { _bb.size } - - #if !os(WASI) - /// Data representation of the buffer - /// - /// Should only be used after ``finish(offset:addPrefix:)`` is called - public var data: Data { - assert(finished, "Data shouldn't be called before finish()") - return Data( - bytes: _bb.memory.advanced(by: _bb.writerIndex), - count: _bb.capacity &- _bb.writerIndex) - } - #endif - - /// Returns the underlying bytes in the ``ByteBuffer`` - /// - /// Note: This should be used with caution. - public var fullSizedByteArray: [UInt8] { - let ptr = UnsafeBufferPointer( - start: _bb.memory.assumingMemoryBound(to: UInt8.self), - count: _bb.capacity) - return Array(ptr) - } - - /// Returns the written bytes into the ``ByteBuffer`` - /// - /// Should only be used after ``finish(offset:addPrefix:)`` is called - public var sizedByteArray: [UInt8] { - assert(finished, "Data shouldn't be called before finish()") - return _bb.underlyingBytes - } - - /// Returns the original ``ByteBuffer`` - /// - /// Returns the current buffer that was just created - /// with the offsets, and data written to it. - public var buffer: ByteBuffer { _bb } - - /// Returns a newly created sized ``ByteBuffer`` - /// - /// returns a new buffer that is sized to the data written - /// to the main buffer - public var sizedBuffer: ByteBuffer { - assert(finished, "Data shouldn't be called before finish()") - return ByteBuffer( - memory: _bb.memory.advanced(by: _bb.reader), - count: Int(_bb.size)) - } - - // MARK: - Init - - /// Initialize the buffer with a size - /// - Parameters: - /// - initialSize: Initial size for the buffer - /// - force: Allows default to be serialized into the buffer - /// - /// This initializes a new builder with an initialSize that would initialize - /// a new ``ByteBuffer``. ``FlatBufferBuilder`` by default doesnt serialize defaults - /// however the builder can be force by passing true for `serializeDefaults` - public init( - initialSize: Int32 = 1024, - serializeDefaults force: Bool = false) - { - assert(initialSize > 0, "Size should be greater than zero!") - guard isLitteEndian else { - fatalError( - "Reading/Writing a buffer in big endian machine is not supported on swift") - } - serializeDefaults = force - _bb = ByteBuffer(initialSize: Int(initialSize)) - } - - /// Clears the builder and the buffer from the written data. - mutating public func clear() { - _minAlignment = 0 - isNested = false - stringOffsetMap.removeAll(keepingCapacity: true) - _vtables.removeAll(keepingCapacity: true) - _vtableStorage.clear() - _bb.clear() - } - - // MARK: - Create Tables - - /// Checks if the required fields were serialized into the buffer - /// - Parameters: - /// - table: offset for the table - /// - fields: Array of all the important fields to be serialized - /// - /// *NOTE: Never call this function, this is only supposed to be called - /// by the generated code* - @inline(__always) - mutating public func require(table: Offset, fields: [Int32]) { - for field in fields { - let start = _bb.capacity &- Int(table.o) - let startTable = start &- Int(_bb.read(def: Int32.self, position: start)) - let isOkay = _bb.read( - def: VOffset.self, - position: startTable &+ Int(field)) != 0 - assert(isOkay, "Flatbuffers requires the following field") - } - } - - /// Finished the buffer by adding the file id and then calling finish - /// - Parameters: - /// - offset: Offset of the table - /// - fileId: Takes the fileId - /// - prefix: if false it wont add the size of the buffer - /// - /// ``finish(offset:fileId:addPrefix:)`` should be called at the end of creating - /// a table - /// ```swift - /// var root = SomeObject - /// .createObject(&builder, - /// name: nameOffset) - /// builder.finish( - /// offset: root, - /// fileId: "ax1a", - /// addPrefix: true) - /// ``` - /// File id would append a file id name at the end of the written bytes before, - /// finishing the buffer. - /// - /// Whereas, if `addPrefix` is true, the written bytes would - /// include the size of the current buffer. - mutating public func finish( - offset: Offset, - fileId: String, - addPrefix prefix: Bool = false) - { - let size = MemoryLayout.size - preAlign( - len: size &+ (prefix ? size : 0) &+ FileIdLength, - alignment: _minAlignment) - assert(fileId.count == FileIdLength, "Flatbuffers requires file id to be 4") - _bb.push(string: fileId, len: 4) - finish(offset: offset, addPrefix: prefix) - } - - /// Finished the buffer by adding the file id, offset, and prefix to it. - /// - Parameters: - /// - offset: Offset of the table - /// - prefix: if false it wont add the size of the buffer - /// - /// ``finish(offset:addPrefix:)`` should be called at the end of creating - /// a table - /// ```swift - /// var root = SomeObject - /// .createObject(&builder, - /// name: nameOffset) - /// builder.finish( - /// offset: root, - /// addPrefix: true) - /// ``` - /// If `addPrefix` is true, the written bytes would - /// include the size of the current buffer. - mutating public func finish( - offset: Offset, - addPrefix prefix: Bool = false) - { - notNested() - let size = MemoryLayout.size - preAlign(len: size &+ (prefix ? size : 0), alignment: _minAlignment) - push(element: refer(to: offset.o)) - if prefix { push(element: _bb.size) } - _vtableStorage.clear() - finished = true - } - - /// ``startTable(with:)`` will let the builder know, that a new object is being serialized. - /// - /// The function will fatalerror if called while there is another object being serialized. - /// ```swift - /// let start = Monster - /// .startMonster(&fbb) - /// ``` - /// - Parameter numOfFields: Number of elements to be written to the buffer - /// - Returns: Offset of the newly started table - @inline(__always) - mutating public func startTable(with numOfFields: Int) -> UOffset { - notNested() - isNested = true - _vtableStorage.start(count: numOfFields) - return _bb.size - } - - /// ``endTable(at:)`` will let the ``FlatBufferBuilder`` know that the - /// object that's written to it is completed - /// - /// This would be called after all the elements are serialized, - /// it will add the current vtable into the ``ByteBuffer``. - /// The functions will `fatalError` in case the object is called - /// without ``startTable(with:)``, or the object has exceeded the limit of 2GB. - /// - /// - Parameter startOffset:Start point of the object written - /// - returns: The root of the table - mutating public func endTable(at startOffset: UOffset) -> UOffset { - assert(isNested, "Calling endtable without calling starttable") - let sizeofVoffset = MemoryLayout.size - let vTableOffset = push(element: SOffset(0)) - - let tableObjectSize = vTableOffset &- startOffset - assert(tableObjectSize < 0x10000, "Buffer can't grow beyond 2 Gigabytes") - let _max = Int(_vtableStorage.maxOffset) &+ sizeofVoffset - - _bb.fill(padding: _max) - _bb.write( - value: VOffset(tableObjectSize), - index: _bb.writerIndex &+ sizeofVoffset, - direct: true) - _bb.write(value: VOffset(_max), index: _bb.writerIndex, direct: true) - - var itr = 0 - while itr < _vtableStorage.writtenIndex { - let loaded = _vtableStorage.load(at: itr) - itr = itr &+ _vtableStorage.size - guard loaded.offset != 0 else { continue } - let _index = (_bb.writerIndex &+ Int(loaded.position)) - _bb.write( - value: VOffset(vTableOffset &- loaded.offset), - index: _index, - direct: true) - } - - _vtableStorage.clear() - let vt_use = _bb.size - - var isAlreadyAdded: Int? - - let vt2 = _bb.memory.advanced(by: _bb.writerIndex) - let len2 = vt2.load(fromByteOffset: 0, as: Int16.self) - - for table in _vtables { - let position = _bb.capacity &- Int(table) - let vt1 = _bb.memory.advanced(by: position) - let len1 = _bb.read(def: Int16.self, position: position) - if len2 != len1 || 0 != memcmp(vt1, vt2, Int(len2)) { continue } - - isAlreadyAdded = Int(table) - break - } - - if let offset = isAlreadyAdded { - let vTableOff = Int(vTableOffset) - let space = _bb.capacity &- vTableOff - _bb.write(value: Int32(offset &- vTableOff), index: space, direct: true) - _bb.pop(_bb.capacity &- space) - } else { - _bb.write(value: Int32(vt_use &- vTableOffset), index: Int(vTableOffset)) - _vtables.append(_bb.size) - } - isNested = false - return vTableOffset - } - - // MARK: - Builds Buffer - - /// Asserts to see if the object is not nested - @inline(__always) - @usableFromInline - mutating internal func notNested() { - assert(!isNested, "Object serialization must not be nested") - } - - /// Changes the minimuim alignment of the buffer - /// - Parameter size: size of the current alignment - @inline(__always) - @usableFromInline - mutating internal func minAlignment(size: Int) { - if size > _minAlignment { - _minAlignment = size - } - } - - /// Gets the padding for the current element - /// - Parameters: - /// - bufSize: Current size of the buffer + the offset of the object to be written - /// - elementSize: Element size - @inline(__always) - @usableFromInline - mutating internal func padding( - bufSize: UInt32, - elementSize: UInt32) -> UInt32 - { - ((~bufSize) &+ 1) & (elementSize - 1) - } - - /// Prealigns the buffer before writting a new object into the buffer - /// - Parameters: - /// - len:Length of the object - /// - alignment: Alignment type - @inline(__always) - @usableFromInline - mutating internal func preAlign(len: Int, alignment: Int) { - minAlignment(size: alignment) - _bb.fill(padding: Int(padding( - bufSize: _bb.size &+ UOffset(len), - elementSize: UOffset(alignment)))) - } - - /// Prealigns the buffer before writting a new object into the buffer - /// - Parameters: - /// - len: Length of the object - /// - type: Type of the object to be written - @inline(__always) - @usableFromInline - mutating internal func preAlign(len: Int, type: T.Type) { - preAlign(len: len, alignment: MemoryLayout.size) - } - - /// Refers to an object that's written in the buffer - /// - Parameter off: the objects index value - @inline(__always) - @usableFromInline - mutating internal func refer(to off: UOffset) -> UOffset { - let size = MemoryLayout.size - preAlign(len: size, alignment: size) - return _bb.size &- off &+ UInt32(size) - } - - /// Tracks the elements written into the buffer - /// - Parameters: - /// - offset: The offset of the element witten - /// - position: The position of the element - @inline(__always) - @usableFromInline - mutating internal func track(offset: UOffset, at position: VOffset) { - _vtableStorage.add(loc: FieldLoc(offset: offset, position: position)) - } - - // MARK: - Inserting Vectors - - /// ``startVector(_:elementSize:)`` creates a new vector within buffer - /// - /// The function checks if there is a current object being written, if - /// the check passes it creates a buffer alignment of `length * elementSize` - /// ```swift - /// builder.startVector( - /// int32Values.count, elementSize: 4) - /// ``` - /// - /// - Parameters: - /// - len: Length of vector to be created - /// - elementSize: Size of object type to be written - @inline(__always) - mutating public func startVector(_ len: Int, elementSize: Int) { - notNested() - isNested = true - preAlign(len: len &* elementSize, type: UOffset.self) - preAlign(len: len &* elementSize, alignment: elementSize) - } - - /// ``endVector(len:)`` ends the currently created vector - /// - /// Calling ``endVector(len:)`` requires the length, of the current - /// vector. The length would be pushed to indicate the count of numbers - /// within the vector. If ``endVector(len:)`` is called without - /// ``startVector(_:elementSize:)`` it asserts. - /// - /// ```swift - /// let vectorOffset = builder. - /// endVector(len: int32Values.count) - /// ``` - /// - /// - Parameter len: Length of the buffer - /// - Returns: Returns the current ``Offset`` in the ``ByteBuffer`` - @inline(__always) - mutating public func endVector(len: Int) -> Offset { - assert(isNested, "Calling endVector without calling startVector") - isNested = false - return Offset(offset: push(element: Int32(len))) - } - - /// Creates a vector of type ``Scalar`` into the ``ByteBuffer`` - /// - /// ``createVector(_:)-4swl0`` writes a vector of type Scalars into - /// ``ByteBuffer``. This is a convenient method instead of calling, - /// ``startVector(_:elementSize:)`` and then ``endVector(len:)`` - /// ```swift - /// let vectorOffset = builder. - /// createVector([1, 2, 3, 4]) - /// ``` - /// - /// The underlying implementation simply calls ``createVector(_:size:)-4lhrv`` - /// - /// - Parameter elements: elements to be written into the buffer - /// - returns: ``Offset`` of the vector - @inline(__always) - mutating public func createVector(_ elements: [T]) -> Offset { - createVector(elements, size: elements.count) - } - - /// Creates a vector of type Scalar in the buffer - /// - /// ``createVector(_:)-4swl0`` writes a vector of type Scalars into - /// ``ByteBuffer``. This is a convenient method instead of calling, - /// ``startVector(_:elementSize:)`` and then ``endVector(len:)`` - /// ```swift - /// let vectorOffset = builder. - /// createVector([1, 2, 3, 4], size: 4) - /// ``` - /// - /// - Parameter elements: Elements to be written into the buffer - /// - Parameter size: Count of elements - /// - returns: ``Offset`` of the vector - @inline(__always) - mutating public func createVector( - _ elements: [T], - size: Int) -> Offset - { - let size = size - startVector(size, elementSize: MemoryLayout.size) - _bb.push(elements: elements) - return endVector(len: size) - } - - #if swift(>=5.0) && !os(WASI) - @inline(__always) - /// Creates a vector of bytes in the buffer. - /// - /// Allows creating a vector from `Data` without copying to a `[UInt8]` - /// - /// - Parameter bytes: bytes to be written into the buffer - /// - Returns: ``Offset`` of the vector - mutating public func createVector(bytes: ContiguousBytes) -> Offset { - let size = bytes.withUnsafeBytes { ptr in ptr.count } - startVector(size, elementSize: MemoryLayout.size) - _bb.push(bytes: bytes) - return endVector(len: size) - } - #endif - - /// Creates a vector of type ``Enum`` into the ``ByteBuffer`` - /// - /// ``createVector(_:)-9h189`` writes a vector of type ``Enum`` into - /// ``ByteBuffer``. This is a convenient method instead of calling, - /// ``startVector(_:elementSize:)`` and then ``endVector(len:)`` - /// ```swift - /// let vectorOffset = builder. - /// createVector([.swift, .cpp]) - /// ``` - /// - /// The underlying implementation simply calls ``createVector(_:size:)-7cx6z`` - /// - /// - Parameter elements: elements to be written into the buffer - /// - returns: ``Offset`` of the vector - @inline(__always) - mutating public func createVector(_ elements: [T]) -> Offset { - createVector(elements, size: elements.count) - } - - /// Creates a vector of type ``Enum`` into the ``ByteBuffer`` - /// - /// ``createVector(_:)-9h189`` writes a vector of type ``Enum`` into - /// ``ByteBuffer``. This is a convenient method instead of calling, - /// ``startVector(_:elementSize:)`` and then ``endVector(len:)`` - /// ```swift - /// let vectorOffset = builder. - /// createVector([.swift, .cpp]) - /// ``` - /// - /// - Parameter elements: Elements to be written into the buffer - /// - Parameter size: Count of elements - /// - returns: ``Offset`` of the vector - @inline(__always) - mutating public func createVector( - _ elements: [T], - size: Int) -> Offset - { - let size = size - startVector(size, elementSize: T.byteSize) - for e in elements.reversed() { - _bb.push(value: e.value, len: T.byteSize) - } - return endVector(len: size) - } - - /// Creates a vector of already written offsets - /// - /// ``createVector(ofOffsets:)`` creates a vector of ``Offset`` into - /// ``ByteBuffer``. This is a convenient method instead of calling, - /// ``startVector(_:elementSize:)`` and then ``endVector(len:)``. - /// - /// The underlying implementation simply calls ``createVector(ofOffsets:len:)`` - /// - /// ```swift - /// let namesOffsets = builder. - /// createVector(ofOffsets: [name1, name2]) - /// ``` - /// - Parameter offsets: Array of offsets of type ``Offset`` - /// - returns: ``Offset`` of the vector - @inline(__always) - mutating public func createVector(ofOffsets offsets: [Offset]) -> Offset { - createVector(ofOffsets: offsets, len: offsets.count) - } - - /// Creates a vector of already written offsets - /// - /// ``createVector(ofOffsets:)`` creates a vector of ``Offset`` into - /// ``ByteBuffer``. This is a convenient method instead of calling, - /// ``startVector(_:elementSize:)`` and then ``endVector(len:)`` - /// - /// ```swift - /// let namesOffsets = builder. - /// createVector(ofOffsets: [name1, name2]) - /// ``` - /// - /// - Parameter offsets: Array of offsets of type ``Offset`` - /// - Parameter size: Count of elements - /// - returns: ``Offset`` of the vector - @inline(__always) - mutating public func createVector( - ofOffsets offsets: [Offset], - len: Int) -> Offset - { - startVector(len, elementSize: MemoryLayout.size) - for o in offsets.reversed() { - push(element: o) - } - return endVector(len: len) - } - - /// Creates a vector of strings - /// - /// ``createVector(ofStrings:)`` creates a vector of `String` into - /// ``ByteBuffer``. This is a convenient method instead of manually - /// creating the string offsets, you simply pass it to this function - /// and it would write the strings into the ``ByteBuffer``. - /// After that it calls ``createVector(ofOffsets:)`` - /// - /// ```swift - /// let namesOffsets = builder. - /// createVector(ofStrings: ["Name", "surname"]) - /// ``` - /// - /// - Parameter str: Array of string - /// - returns: ``Offset`` of the vector - @inline(__always) - mutating public func createVector(ofStrings str: [String]) -> Offset { - var offsets: [Offset] = [] - for s in str { - offsets.append(create(string: s)) - } - return createVector(ofOffsets: offsets) - } - - /// Creates a vector of type ``NativeStruct``. - /// - /// Any swift struct in the generated code, should confirm to - /// ``NativeStruct``. Since the generated swift structs are padded - /// to the `FlatBuffers` standards. - /// - /// ```swift - /// let offsets = builder. - /// createVector(ofStructs: [NativeStr(num: 1), NativeStr(num: 2)]) - /// ``` - /// - /// - Parameter structs: A vector of ``NativeStruct`` - /// - Returns: ``Offset`` of the vector - @inline(__always) - mutating public func createVector(ofStructs structs: [T]) - -> Offset - { - startVector( - structs.count * MemoryLayout.size, - elementSize: MemoryLayout.alignment) - _bb.push(elements: structs) - return endVector(len: structs.count) - } - - // MARK: - Inserting Structs - - /// Writes a ``NativeStruct`` into the ``ByteBuffer`` - /// - /// Adds a native struct that's build and padded according - /// to `FlatBuffers` standards. with a predefined position. - /// - /// ```swift - /// let offset = builder.create( - /// struct: NativeStr(num: 1), - /// position: 10) - /// ``` - /// - /// - Parameters: - /// - s: ``NativeStruct`` to be inserted into the ``ByteBuffer`` - /// - position: The predefined position of the object - /// - Returns: ``Offset`` of written struct - @inline(__always) - @discardableResult - mutating public func create( - struct s: T, position: VOffset) -> Offset - { - let offset = create(struct: s) - _vtableStorage.add(loc: FieldLoc( - offset: _bb.size, - position: VOffset(position))) - return offset - } - - /// Writes a ``NativeStruct`` into the ``ByteBuffer`` - /// - /// Adds a native struct that's build and padded according - /// to `FlatBuffers` standards, directly into the buffer without - /// a predefined position. - /// - /// ```swift - /// let offset = builder.create( - /// struct: NativeStr(num: 1)) - /// ``` - /// - /// - Parameters: - /// - s: ``NativeStruct`` to be inserted into the ``ByteBuffer`` - /// - Returns: ``Offset`` of written struct - @inline(__always) - @discardableResult - mutating public func create( - struct s: T) -> Offset - { - let size = MemoryLayout.size - preAlign(len: size, alignment: MemoryLayout.alignment) - _bb.push(struct: s, size: size) - return Offset(offset: _bb.size) - } - - // MARK: - Inserting Strings - - /// Insets a string into the buffer of type `UTF8` - /// - /// Adds a swift string into ``ByteBuffer`` by encoding it - /// using `UTF8` - /// - /// ```swift - /// let nameOffset = builder - /// .create(string: "welcome") - /// ``` - /// - /// - Parameter str: String to be serialized - /// - returns: ``Offset`` of inserted string - @inline(__always) - mutating public func create(string str: String?) -> Offset { - guard let str = str else { return Offset() } - let len = str.utf8.count - notNested() - preAlign(len: len &+ 1, type: UOffset.self) - _bb.fill(padding: 1) - _bb.push(string: str, len: len) - push(element: UOffset(len)) - return Offset(offset: _bb.size) - } - - /// Insets a shared string into the buffer of type `UTF8` - /// - /// Adds a swift string into ``ByteBuffer`` by encoding it - /// using `UTF8`. The function will check if the string, - /// is already written to the ``ByteBuffer`` - /// - /// ```swift - /// let nameOffset = builder - /// .createShared(string: "welcome") - /// - /// - /// let secondOffset = builder - /// .createShared(string: "welcome") - /// - /// assert(nameOffset.o == secondOffset.o) - /// ``` - /// - /// - Parameter str: String to be serialized - /// - returns: ``Offset`` of inserted string - @inline(__always) - mutating public func createShared(string str: String?) -> Offset { - guard let str = str else { return Offset() } - if let offset = stringOffsetMap[str] { - return offset - } - let offset = create(string: str) - stringOffsetMap[str] = offset - return offset - } - - // MARK: - Inseting offsets - - /// Writes the ``Offset`` of an already written table - /// - /// Writes the ``Offset`` of a table if not empty into the - /// ``ByteBuffer`` - /// - /// - Parameters: - /// - offset: ``Offset`` of another object to be written - /// - position: The predefined position of the object - @inline(__always) - mutating public func add(offset: Offset, at position: VOffset) { - if offset.isEmpty { return } - add(element: refer(to: offset.o), def: 0, at: position) - } - - /// Pushes a value of type ``Offset`` into the ``ByteBuffer`` - /// - Parameter o: ``Offset`` - /// - returns: Current position of the ``Offset`` - @inline(__always) - @discardableResult - mutating public func push(element o: Offset) -> UOffset { - push(element: refer(to: o.o)) - } - - // MARK: - Inserting Scalars to Buffer - - /// Writes a ``Scalar`` value into ``ByteBuffer`` - /// - /// ``add(element:def:at:)`` takes in a default value, and current value - /// and the position within the `VTable`. The default value would not - /// be serialized if the value is the same as the current value or - /// `serializeDefaults` is equal to false. - /// - /// If serializing defaults is important ``init(initialSize:serializeDefaults:)``, - /// passing true for `serializeDefaults` would do the job. - /// - /// ```swift - /// // Adds 10 to the buffer - /// builder.add(element: Int(10), def: 1, position 12) - /// ``` - /// - /// *NOTE: Never call this manually* - /// - /// - Parameters: - /// - element: Element to insert - /// - def: Default value for that element - /// - position: The predefined position of the element - @inline(__always) - mutating public func add( - element: T, - def: T, - at position: VOffset) - { - if element == def && !serializeDefaults { return } - track(offset: push(element: element), at: position) - } - - /// Writes a optional ``Scalar`` value into ``ByteBuffer`` - /// - /// Takes an optional value to be written into the ``ByteBuffer`` - /// - /// *NOTE: Never call this manually* - /// - /// - Parameters: - /// - element: Optional element of type scalar - /// - position: The predefined position of the element - @inline(__always) - mutating public func add(element: T?, at position: VOffset) { - guard let element = element else { return } - track(offset: push(element: element), at: position) - } - - /// Pushes a values of type ``Scalar`` into the ``ByteBuffer`` - /// - /// *NOTE: Never call this manually* - /// - /// - Parameter element: Element to insert - /// - returns: Postion of the Element - @inline(__always) - @discardableResult - mutating public func push(element: T) -> UOffset { - let size = MemoryLayout.size - preAlign( - len: size, - alignment: size) - _bb.push(value: element, len: size) - return _bb.size - } - -} - -extension FlatBufferBuilder: CustomDebugStringConvertible { - - public var debugDescription: String { - """ - buffer debug: - \(_bb) - builder debug: - { finished: \(finished), serializeDefaults: \(serializeDefaults), isNested: \(isNested) } - """ - } - - /// VTableStorage is a class to contain the VTable buffer that would be serialized into buffer - @usableFromInline - internal class VTableStorage { - /// Memory check since deallocating each time we want to clear would be expensive - /// and memory leaks would happen if we dont deallocate the first allocated memory. - /// memory is promised to be available before adding `FieldLoc` - private var memoryInUse = false - /// Size of FieldLoc in memory - let size = MemoryLayout.stride - /// Memeory buffer - var memory: UnsafeMutableRawBufferPointer! - /// Capacity of the current buffer - var capacity: Int = 0 - /// Maximuim offset written to the class - var maxOffset: VOffset = 0 - /// number of fields written into the buffer - var numOfFields: Int = 0 - /// Last written Index - var writtenIndex: Int = 0 - - /// Creates the memory to store the buffer in - @usableFromInline - @inline(__always) - init() { - memory = UnsafeMutableRawBufferPointer.allocate( - byteCount: 0, - alignment: 0) - } - - @inline(__always) - deinit { - memory.deallocate() - } - - /// Builds a buffer with byte count of fieldloc.size * count of field numbers - /// - Parameter count: number of fields to be written - @inline(__always) - func start(count: Int) { - assert(count >= 0, "number of fields should NOT be negative") - let capacity = count &* size - ensure(space: capacity) - } - - /// Adds a FieldLoc into the buffer, which would track how many have been written, - /// and max offset - /// - Parameter loc: Location of encoded element - @inline(__always) - func add(loc: FieldLoc) { - memory.baseAddress?.advanced(by: writtenIndex).storeBytes( - of: loc, - as: FieldLoc.self) - writtenIndex = writtenIndex &+ size - numOfFields = numOfFields &+ 1 - maxOffset = max(loc.position, maxOffset) - } - - /// Clears the data stored related to the encoded buffer - @inline(__always) - func clear() { - maxOffset = 0 - numOfFields = 0 - writtenIndex = 0 - } - - /// Ensure that the buffer has enough space instead of recreating the buffer each time. - /// - Parameter space: space required for the new vtable - @inline(__always) - func ensure(space: Int) { - guard space &+ writtenIndex > capacity else { return } - memory.deallocate() - memory = UnsafeMutableRawBufferPointer.allocate( - byteCount: space, - alignment: size) - capacity = space - } - - /// Loads an object of type `FieldLoc` from buffer memory - /// - Parameter index: index of element - /// - Returns: a FieldLoc at index - @inline(__always) - func load(at index: Int) -> FieldLoc { - memory.load(fromByteOffset: index, as: FieldLoc.self) - } - - } - - internal struct FieldLoc { - var offset: UOffset - var position: VOffset - } - -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/FlatBufferObject.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/FlatBufferObject.swift deleted file mode 100644 index 705c93463..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/FlatBufferObject.swift +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// NativeStruct is a protocol that indicates if the struct is a native `swift` struct -/// since now we will be serializing native structs into the buffer. -public protocol NativeStruct {} - -/// FlatbuffersInitializable is a protocol that allows any object to be -/// Initialized from a ByteBuffer -public protocol FlatbuffersInitializable { - /// Any flatbuffers object that confirms to this protocol is going to be - /// initializable through this initializer - init(_ bb: ByteBuffer, o: Int32) -} - -/// FlatbufferObject structures all the Flatbuffers objects -public protocol FlatBufferObject: FlatbuffersInitializable { - var __buffer: ByteBuffer! { get } -} - -/// ``ObjectAPIPacker`` is a protocol that allows object to pack and unpack from a -/// ``NativeObject`` to a flatbuffers Object and vice versa. -public protocol ObjectAPIPacker { - /// associatedtype to the object that should be unpacked. - associatedtype T - - /// ``pack(_:obj:)-3ptws`` tries to pacs the variables of a native Object into the `ByteBuffer` by using - /// a FlatBufferBuilder - /// - Parameters: - /// - builder: FlatBufferBuilder that will host incoming data - /// - obj: Object of associatedtype to the current implementer - /// - /// ``pack(_:obj:)-3ptws`` can be called by passing through an already initialized ``FlatBufferBuilder`` - /// or it can be called by using the public API that will create a new ``FlatBufferBuilder`` - static func pack(_ builder: inout FlatBufferBuilder, obj: inout T?) -> Offset - - /// ``pack(_:obj:)-20ipk`` packs the variables of a native Object into the `ByteBuffer` by using - /// the FlatBufferBuilder - /// - Parameters: - /// - builder: FlatBufferBuilder that will host incoming data - /// - obj: Object of associatedtype to the current implementer - /// - /// ``pack(_:obj:)-20ipk`` can be called by passing through an already initialized ``FlatBufferBuilder`` - /// or it can be called by using the public API that will create a new ``FlatBufferBuilder`` - static func pack(_ builder: inout FlatBufferBuilder, obj: inout T) -> Offset - - /// ``unpack()`` unpacks a ``FlatBuffers`` object into a Native swift object. - mutating func unpack() -> T -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/FlatBuffersUtils.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/FlatBuffersUtils.swift deleted file mode 100644 index 338988df7..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/FlatBuffersUtils.swift +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// FlatBuffersUtils hosts some utility functions that might be useful -public enum FlatBuffersUtils { - - /// Gets the size of the prefix - /// - Parameter bb: Flatbuffer object - public static func getSizePrefix(bb: ByteBuffer) -> Int32 { - bb.read(def: Int32.self, position: bb.reader) - } - - /// Removes the prefix by duplicating the Flatbuffer this call is expensive since its - /// creates a new buffer use `readPrefixedSizeCheckedRoot` instead - /// unless a completely new buffer is required - /// - Parameter bb: Flatbuffer object - /// - /// - public static func removeSizePrefix(bb: ByteBuffer) -> ByteBuffer { - bb.duplicate(removing: MemoryLayout.size) - } -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/FlatbuffersErrors.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/FlatbuffersErrors.swift deleted file mode 100644 index 1a9284eba..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/FlatbuffersErrors.swift +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// Collection of thrown from the Flatbuffer verifier -public enum FlatbuffersErrors: Error, Equatable { - - /// Thrown when verifying a file id that doesnt match buffer id - case bufferIdDidntMatchPassedId - /// Prefixed size doesnt match the current (readable) buffer size - case prefixedSizeNotEqualToBufferSize - /// Thrown when buffer is bigger than the allowed 2GiB - case exceedsMaxSizeAllowed - /// Thrown when there is an missaligned pointer at position - /// of type - case missAlignedPointer(position: Int, type: String) - /// Thrown when trying to read a value that goes out of the - /// current buffer bounds - case outOfBounds(position: UInt, end: Int) - /// Thrown when the signed offset is out of the bounds of the - /// current buffer - case signedOffsetOutOfBounds(offset: Int, position: Int) - /// Thrown when a required field doesnt exist within the buffer - case requiredFieldDoesntExist(position: VOffset, name: String) - /// Thrown when a string is missing its NULL Terminator `\0`, - /// this can be disabled in the `VerifierOptions` - case missingNullTerminator(position: Int, str: String?) - /// Thrown when the verifier has reached the maximum tables allowed, - /// this can be disabled in the `VerifierOptions` - case maximumTables - /// Thrown when the verifier has reached the maximum depth allowed, - /// this can be disabled in the `VerifierOptions` - case maximumDepth - /// Thrown when the verifier is presented with an unknown union case - case unknownUnionCase - /// thrown when a value for a union is not found within the buffer - case valueNotFound(key: Int?, keyName: String, field: Int?, fieldName: String) - /// thrown when the size of the keys vector doesnt match fields vector - case unionVectorSize( - keyVectorSize: Int, - fieldVectorSize: Int, - unionKeyName: String, - fieldName: String) - case apparentSizeTooLarge - -} - -#if !os(WASI) - -extension FlatbuffersErrors { - public static func == ( - lhs: FlatbuffersErrors, - rhs: FlatbuffersErrors) -> Bool - { - lhs.localizedDescription == rhs.localizedDescription - } -} - -#endif diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Int+extension.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Int+extension.swift deleted file mode 100644 index c8cd0e364..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Int+extension.swift +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -extension Int { - - /// Moves the current int into the nearest power of two - /// - /// This is used since the UnsafeMutableRawPointer will face issues when writing/reading - /// if the buffer alignment exceeds that actual size of the buffer - var convertToPowerofTwo: Int { - guard self > 0 else { return 1 } - var n = UOffset(self) - - #if arch(arm) || arch(i386) - let max = UInt32(Int.max) - #else - let max = UInt32.max - #endif - - n -= 1 - n |= n >> 1 - n |= n >> 2 - n |= n >> 4 - n |= n >> 8 - n |= n >> 16 - if n != max { - n += 1 - } - - return Int(n) - } -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Message.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Message.swift deleted file mode 100644 index 172a339db..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Message.swift +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// FlatBufferGRPCMessage protocol that should allow us to invoke -/// initializers directly from the GRPC generated code -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 struct Message: 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 { - buffer.memory.advanced(by: buffer.reader) } - - public var size: Int { 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() - } -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Mutable.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Mutable.swift deleted file mode 100644 index 7a1a3d5bc..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Mutable.swift +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// Mutable is a protocol that allows us to mutate Scalar values within a ``ByteBuffer`` -public protocol Mutable { - /// makes Flatbuffer accessed within the Protocol - var bb: ByteBuffer { get } - /// makes position of the ``Table``/``struct`` accessed within the Protocol - var postion: Int32 { get } -} - -extension Mutable { - - /// Mutates the memory in the buffer, this is only called from the access function of ``Table`` and ``struct`` - /// - Parameters: - /// - value: New value to be inserted to the buffer - /// - index: index of the Element - func mutate(value: T, o: Int32) -> Bool { - guard o != 0 else { return false } - bb.write(value: value, index: Int(o), direct: true) - return true - } -} - -extension Mutable where Self == Table { - - /// Mutates a value by calling mutate with respect to the position in a ``Table`` - /// - Parameters: - /// - value: New value to be inserted to the buffer - /// - index: index of the Element - public func mutate(_ value: T, index: Int32) -> Bool { - guard index != 0 else { return false } - return mutate(value: value, o: index + postion) - } - - /// Directly mutates the element by calling mutate - /// - /// Mutates the Element at index ignoring the current position by calling mutate - /// - Parameters: - /// - value: New value to be inserted to the buffer - /// - index: index of the Element - public func directMutate(_ value: T, index: Int32) -> Bool { - mutate(value: value, o: index) - } -} - -extension Mutable where Self == Struct { - - /// Mutates a value by calling mutate with respect to the position in the struct - /// - Parameters: - /// - value: New value to be inserted to the buffer - /// - index: index of the Element - public func mutate(_ value: T, index: Int32) -> Bool { - mutate(value: value, o: index + postion) - } - - /// Directly mutates the element by calling mutate - /// - /// Mutates the Element at index ignoring the current position by calling mutate - /// - Parameters: - /// - value: New value to be inserted to the buffer - /// - index: index of the Element - public func directMutate(_ value: T, index: Int32) -> Bool { - mutate(value: value, o: index) - } -} - -extension Struct: Mutable {} -extension Table: Mutable {} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/NativeObject.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/NativeObject.swift deleted file mode 100644 index 9c72b50b7..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/NativeObject.swift +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// NativeObject is a protocol that all of the `Object-API` generated code should be -/// conforming to since it allows developers the ease of use to pack and unpack their -/// Flatbuffers objects -public protocol NativeObject {} - -extension NativeObject { - - /// Serialize is a helper function that serailizes the data from the Object API to a bytebuffer directly th - /// - Parameter type: Type of the Flatbuffer object - /// - Returns: returns the encoded sized ByteBuffer - public func serialize(type: T.Type) -> ByteBuffer - where T.T == Self - { - var builder = FlatBufferBuilder(initialSize: 1024) - return serialize(builder: &builder, type: type.self) - } - - /// Serialize is a helper function that serailizes the data from the Object API to a bytebuffer directly. - /// - /// - Parameters: - /// - builder: A FlatBufferBuilder - /// - type: Type of the Flatbuffer object - /// - Returns: returns the encoded sized ByteBuffer - /// - Note: The `serialize(builder:type)` can be considered as a function that allows you to create smaller builder instead of the default `1024`. - /// It can be considered less expensive in terms of memory allocation - public func serialize( - builder: inout FlatBufferBuilder, - type: T.Type) -> ByteBuffer where T.T == Self - { - var s = self - let root = type.pack(&builder, obj: &s) - builder.finish(offset: root) - return builder.sizedBuffer - } -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Offset.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Offset.swift deleted file mode 100644 index e433f35a2..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Offset.swift +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// Offset object for all the Objects that are written into the buffer -public struct Offset { - /// Offset of the object in the buffer - public var o: UOffset - /// Returns false if the offset is equal to zero - public var isEmpty: Bool { o == 0 } - - public init(offset: UOffset) { o = offset } - public init() { o = 0 } -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Root.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Root.swift deleted file mode 100644 index 6269148bb..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Root.swift +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// Takes in a prefixed sized buffer, where the prefixed size would be skipped. -/// And would verify that the buffer passed is a valid `Flatbuffers` Object. -/// - Parameters: -/// - byteBuffer: Buffer that needs to be checked and read -/// - options: Verifier options -/// - Throws: FlatbuffersErrors -/// - Returns: Returns a valid, checked Flatbuffers object -/// -/// ``getPrefixedSizeCheckedRoot(byteBuffer:options:)`` would skip the first Bytes in -/// the ``ByteBuffer`` and verifies the buffer by calling ``getCheckedRoot(byteBuffer:options:)`` -public func getPrefixedSizeCheckedRoot( - byteBuffer: inout ByteBuffer, - fileId: String? = nil, - options: VerifierOptions = .init()) throws -> T -{ - byteBuffer.skipPrefix() - return try getCheckedRoot( - byteBuffer: &byteBuffer, - fileId: fileId, - options: options) -} - -/// Takes in a prefixed sized buffer, where we check if the sized buffer is equal to prefix size. -/// And would verify that the buffer passed is a valid `Flatbuffers` Object. -/// - Parameters: -/// - byteBuffer: Buffer that needs to be checked and read -/// - options: Verifier options -/// - Throws: FlatbuffersErrors -/// - Returns: Returns a valid, checked Flatbuffers object -/// -/// ``getPrefixedSizeCheckedRoot(byteBuffer:options:)`` would skip the first Bytes in -/// the ``ByteBuffer`` and verifies the buffer by calling ``getCheckedRoot(byteBuffer:options:)`` -public func getCheckedPrefixedSizeRoot( - byteBuffer: inout ByteBuffer, - fileId: String? = nil, - options: VerifierOptions = .init()) throws -> T -{ - let prefix = byteBuffer.skipPrefix() - if prefix != byteBuffer.size { - throw FlatbuffersErrors.prefixedSizeNotEqualToBufferSize - } - return try getCheckedRoot( - byteBuffer: &byteBuffer, - fileId: fileId, - options: options) -} - -/// Takes in a prefixed sized buffer, where the prefixed size would be skipped. -/// Returns a `NON-Checked` flatbuffers object -/// - Parameter byteBuffer: Buffer that contains data -/// - Returns: Returns a Flatbuffers object -/// -/// ``getPrefixedSizeCheckedRoot(byteBuffer:options:)`` would skip the first Bytes in -/// the ``ByteBuffer`` and then calls ``getRoot(byteBuffer:)`` -public func getPrefixedSizeRoot(byteBuffer: inout ByteBuffer) - -> T -{ - byteBuffer.skipPrefix() - return getRoot(byteBuffer: &byteBuffer) - -} - -/// Verifies that the buffer passed is a valid `Flatbuffers` Object. -/// - Parameters: -/// - byteBuffer: Buffer that needs to be checked and read -/// - options: Verifier options -/// - Throws: FlatbuffersErrors -/// - Returns: Returns a valid, checked Flatbuffers object -/// -/// ``getCheckedRoot(byteBuffer:options:)`` Takes in a ``ByteBuffer`` and verifies -/// that by creating a ``Verifier`` and checkes if all the `Bytes` and correctly aligned -/// and within the ``ByteBuffer`` range. -public func getCheckedRoot( - byteBuffer: inout ByteBuffer, - fileId: String? = nil, - options: VerifierOptions = .init()) throws -> T -{ - var verifier = try Verifier(buffer: &byteBuffer, options: options) - if let fileId = fileId { - try verifier.verify(id: fileId) - } - try ForwardOffset.verify(&verifier, at: 0, of: T.self) - return T.init( - byteBuffer, - o: Int32(byteBuffer.read(def: UOffset.self, position: byteBuffer.reader)) + - Int32(byteBuffer.reader)) -} - -/// Returns a `NON-Checked` flatbuffers object -/// - Parameter byteBuffer: Buffer that contains data -/// - Returns: Returns a Flatbuffers object -public func getRoot(byteBuffer: inout ByteBuffer) -> T { - T.init( - byteBuffer, - o: Int32(byteBuffer.read(def: UOffset.self, position: byteBuffer.reader)) + - Int32(byteBuffer.reader)) -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/String+extension.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/String+extension.swift deleted file mode 100644 index 35c83cbdb..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/String+extension.swift +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -extension String: Verifiable { - - /// Verifies that the current value is which the bounds of the buffer, and if - /// the current `Value` is aligned properly - /// - Parameters: - /// - verifier: Verifier that hosts the buffer - /// - position: Current position within the buffer - /// - type: The type of the object to be verified - /// - Throws: Errors coming from `inBuffer`, `missingNullTerminator` and `outOfBounds` - public static func verify( - _ verifier: inout Verifier, - at position: Int, - of type: T.Type) throws where T: Verifiable - { - - let range = try String.verifyRange(&verifier, at: position, of: UInt8.self) - /// Safe &+ since we already check for overflow in verify range - let stringLen = range.start &+ range.count - - if stringLen >= verifier.capacity { - throw FlatbuffersErrors.outOfBounds( - position: UInt(clamping: stringLen.magnitude), - end: verifier.capacity) - } - - let isNullTerminated = verifier._buffer.read( - def: UInt8.self, - position: stringLen) == 0 - - if !verifier._options._ignoreMissingNullTerminators && !isNullTerminated { - let str = verifier._buffer.readString(at: range.start, count: range.count) - throw FlatbuffersErrors.missingNullTerminator( - position: position, - str: str) - } - } -} - -extension String: FlatbuffersInitializable { - - /// Initailizes a string from a Flatbuffers ByteBuffer - /// - Parameters: - /// - bb: ByteBuffer containing the readable string - /// - o: Current position - public init(_ bb: ByteBuffer, o: Int32) { - let v = Int(o) - let count = bb.read(def: Int32.self, position: v) - self = bb.readString( - at: MemoryLayout.size + v, - count: Int(count)) ?? "" - } -} - -extension String: ObjectAPIPacker { - - public static func pack( - _ builder: inout FlatBufferBuilder, - obj: inout String?) -> Offset - { - guard var obj = obj else { return Offset() } - return pack(&builder, obj: &obj) - } - - public static func pack( - _ builder: inout FlatBufferBuilder, - obj: inout String) -> Offset - { - builder.create(string: obj) - } - - public mutating func unpack() -> String { - self - } - -} - -extension String: NativeObject { - - public func serialize(type: T.Type) -> ByteBuffer - where T.T == Self - { - fatalError("serialize should never be called from string directly") - } - - public func serialize( - builder: inout FlatBufferBuilder, - type: T.Type) -> ByteBuffer where T.T == Self - { - fatalError("serialize should never be called from string directly") - } -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Struct.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Struct.swift deleted file mode 100644 index 04cfba092..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Struct.swift +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// Struct is a representation of a mutable `Flatbuffers` struct -/// since native structs are value types and cant be mutated -@frozen -public struct Struct { - - /// Hosting Bytebuffer - public private(set) var bb: ByteBuffer - /// Current position of the struct - public private(set) var postion: Int32 - - /// Initializer for a mutable flatbuffers struct - /// - Parameters: - /// - bb: Current hosting Bytebuffer - /// - position: Current position for the struct in the ByteBuffer - public init(bb: ByteBuffer, position: Int32 = 0) { - self.bb = bb - postion = position - } - - /// Reads data from the buffer directly at offset O - /// - Parameters: - /// - type: Type of data to be read - /// - o: Current offset of the data - /// - Returns: Data of Type T that conforms to type Scalar - public func readBuffer(of type: T.Type, at o: Int32) -> T { - let r = bb.read(def: T.self, position: Int(o + postion)) - return r - } -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Table.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Table.swift deleted file mode 100644 index 0da5919a8..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Table.swift +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// `Table` is a Flatbuffers object that can read, -/// mutate scalar fields within a valid flatbuffers buffer -@frozen -public struct Table { - - /// Hosting Bytebuffer - public private(set) var bb: ByteBuffer - /// Current position of the table within the buffer - public private(set) var postion: Int32 - - /// Initializer for the table interface to allow generated code to read - /// data from memory - /// - Parameters: - /// - bb: ByteBuffer that stores data - /// - position: Current table position - /// - Note: This will `CRASH` if read on a big endian machine - public init(bb: ByteBuffer, position: Int32 = 0) { - guard isLitteEndian else { - fatalError( - "Reading/Writing a buffer in big endian machine is not supported on swift") - } - self.bb = bb - postion = position - } - - /// Gets the offset of the current field within the buffer by reading - /// the vtable - /// - Parameter o: current offset - /// - Returns: offset of field within buffer - public func offset(_ o: Int32) -> Int32 { - let vtable = postion - bb.read(def: Int32.self, position: Int(postion)) - return o < bb - .read(def: VOffset.self, position: Int(vtable)) ? Int32(bb.read( - def: Int16.self, - position: Int(vtable + o))) : 0 - } - - /// Gets the indirect offset of the current stored object - /// (applicable only for object arrays) - /// - Parameter o: current offset - /// - Returns: offset of field within buffer - public func indirect(_ o: Int32) -> Int32 { - o + bb.read(def: Int32.self, position: Int(o)) - } - - /// String reads from the buffer with respect to position of the current table. - /// - Parameter offset: Offset of the string - public func string(at offset: Int32) -> String? { - directString(at: offset + postion) - } - - /// Direct string reads from the buffer disregarding the position of the table. - /// It would be preferable to use string unless the current position of the table - /// is not needed - /// - Parameter offset: Offset of the string - public func directString(at offset: Int32) -> String? { - var offset = offset - offset += bb.read(def: Int32.self, position: Int(offset)) - let count = bb.read(def: Int32.self, position: Int(offset)) - let position = Int(offset) + MemoryLayout.size - return bb.readString(at: position, count: Int(count)) - } - - /// Reads from the buffer with respect to the position in the table. - /// - Parameters: - /// - type: Type of Element that needs to be read from the buffer - /// - o: Offset of the Element - public func readBuffer(of type: T.Type, at o: Int32) -> T { - directRead(of: T.self, offset: o + postion) - } - - /// Reads from the buffer disregarding the position of the table. - /// It would be used when reading from an - /// ``` - /// let offset = __t.offset(10) - /// //Only used when the we already know what is the - /// // position in the table since __t.vector(at:) - /// // returns the index with respect to the position - /// __t.directRead(of: Byte.self, - /// offset: __t.vector(at: offset) + index * 1) - /// ``` - /// - Parameters: - /// - type: Type of Element that needs to be read from the buffer - /// - o: Offset of the Element - public func directRead(of type: T.Type, offset o: Int32) -> T { - let r = bb.read(def: T.self, position: Int(o)) - return r - } - - /// Returns that current `Union` object at a specific offset - /// by adding offset to the current position of table - /// - Parameter o: offset - /// - Returns: A flatbuffers object - public func union(_ o: Int32) -> T { - let o = o + postion - return directUnion(o) - } - - /// Returns a direct `Union` object at a specific offset - /// - Parameter o: offset - /// - Returns: A flatbuffers object - public func directUnion(_ o: Int32) -> T { - T.init(bb, o: o + bb.read(def: Int32.self, position: Int(o))) - } - - /// Returns a vector of type T at a specific offset - /// This should only be used by `Scalars` - /// - Parameter off: Readable offset - /// - Returns: Returns a vector of type [T] - public func getVector(at off: Int32) -> [T]? { - let o = offset(off) - guard o != 0 else { return nil } - return bb.readSlice(index: Int(vector(at: o)), count: Int(vector(count: o))) - } - - /// Vector count gets the count of Elements within the array - /// - Parameter o: start offset of the vector - /// - returns: Count of elements - public func vector(count o: Int32) -> Int32 { - var o = o - o += postion - o += bb.read(def: Int32.self, position: Int(o)) - return bb.read(def: Int32.self, position: Int(o)) - } - - /// Vector start index in the buffer - /// - Parameter o:start offset of the vector - /// - returns: the start index of the vector - public func vector(at o: Int32) -> Int32 { - var o = o - o += postion - return o + bb.read(def: Int32.self, position: Int(o)) + 4 - } - - /// Reading an indirect offset of a table. - /// - Parameters: - /// - o: position within the buffer - /// - fbb: ByteBuffer - /// - Returns: table offset - static public func indirect(_ o: Int32, _ fbb: ByteBuffer) -> Int32 { - o + fbb.read(def: Int32.self, position: Int(o)) - } - - /// Gets a vtable value according to an table Offset and a field offset - /// - Parameters: - /// - o: offset relative to entire buffer - /// - vOffset: Field offset within a vtable - /// - fbb: ByteBuffer - /// - Returns: an position of a field - static public func offset( - _ o: Int32, - vOffset: Int32, - fbb: ByteBuffer) -> Int32 - { - let vTable = Int32(fbb.capacity) - o - return vTable + Int32(fbb.read( - def: Int16.self, - position: Int(vTable + vOffset - fbb.read( - def: Int32.self, - position: Int(vTable))))) - } - - /// Compares two objects at offset A and offset B within a ByteBuffer - /// - Parameters: - /// - off1: first offset to compare - /// - off2: second offset to compare - /// - fbb: Bytebuffer - /// - Returns: returns the difference between - static public func compare( - _ off1: Int32, - _ off2: Int32, - fbb: ByteBuffer) -> Int32 - { - let memorySize = Int32(MemoryLayout.size) - let _off1 = off1 + fbb.read(def: Int32.self, position: Int(off1)) - let _off2 = off2 + fbb.read(def: Int32.self, position: Int(off2)) - let len1 = fbb.read(def: Int32.self, position: Int(_off1)) - let len2 = fbb.read(def: Int32.self, position: Int(_off2)) - let startPos1 = _off1 + memorySize - let startPos2 = _off2 + memorySize - let minValue = min(len1, len2) - for i in 0...minValue { - let b1 = fbb.read(def: Int8.self, position: Int(i + startPos1)) - let b2 = fbb.read(def: Int8.self, position: Int(i + startPos2)) - if b1 != b2 { - return Int32(b2 - b1) - } - } - return len1 - len2 - } - - /// Compares two objects at offset A and array of `Bytes` within a ByteBuffer - /// - Parameters: - /// - off1: Offset to compare to - /// - key: bytes array to compare to - /// - fbb: Bytebuffer - /// - Returns: returns the difference between - static public func compare( - _ off1: Int32, - _ key: [Byte], - fbb: ByteBuffer) -> Int32 - { - let memorySize = Int32(MemoryLayout.size) - let _off1 = off1 + fbb.read(def: Int32.self, position: Int(off1)) - let len1 = fbb.read(def: Int32.self, position: Int(_off1)) - let len2 = Int32(key.count) - let startPos1 = _off1 + memorySize - let minValue = min(len1, len2) - for i in 0.. Int? { - if field >= _vtableLength { - return nil - } - - /// Reading the offset for the field needs to be read. - let offset: VOffset = try _verifier.getValue( - at: Int(clamping: _vtable &+ Int(field))) - - if offset > 0 { - return Int(clamping: _position &+ Int(offset)) - } - return nil - } - - /// Visits all the fields within the table to validate the integrity - /// of the data - /// - Parameters: - /// - field: voffset of the current field to be read - /// - fieldName: fieldname to report data Errors. - /// - required: If the field has to be available in the buffer - /// - type: Type of field to be read - /// - Throws: A `FlatbuffersErrors` where the field is corrupt - public mutating func visit( - field: VOffset, - fieldName: String, - required: Bool, - type: T.Type) throws where T: Verifiable - { - let derefValue = try dereference(field) - - if let value = derefValue { - try T.verify(&_verifier, at: value, of: T.self) - return - } - if required { - throw FlatbuffersErrors.requiredFieldDoesntExist( - position: field, - name: fieldName) - } - } - - /// Visits all the fields for a union object within the table to - /// validate the integrity of the data - /// - Parameters: - /// - key: Current Key Voffset - /// - field: Current field Voffset - /// - unionKeyName: Union key name - /// - fieldName: Field key name - /// - required: indicates if an object is required to be present - /// - completion: Completion is a handler that WILL be called in the generated - /// - Throws: A `FlatbuffersErrors` where the field is corrupt - public mutating func visit( - unionKey key: VOffset, - unionField field: VOffset, - unionKeyName: String, - fieldName: String, - required: Bool, - completion: @escaping (inout Verifier, T, Int) throws -> Void) throws - where T: UnionEnum - { - let keyPos = try dereference(key) - let valPos = try dereference(field) - - if keyPos == nil && valPos == nil { - if required { - throw FlatbuffersErrors.requiredFieldDoesntExist( - position: key, - name: unionKeyName) - } - return - } - - if let _key = keyPos, - let _val = valPos - { - /// verifiying that the key is within the buffer - try T.T.verify(&_verifier, at: _key, of: T.T.self) - guard let _enum = try T.init(value: _verifier._buffer.read( - def: T.T.self, - position: _key)) else - { - throw FlatbuffersErrors.unknownUnionCase - } - /// we are assuming that Unions will always be of type Uint8 - try completion( - &_verifier, - _enum, - _val) - return - } - throw FlatbuffersErrors.valueNotFound( - key: keyPos, - keyName: unionKeyName, - field: valPos, - fieldName: fieldName) - } - - /// Visits and validates all the objects within a union vector - /// - Parameters: - /// - key: Current Key Voffset - /// - field: Current field Voffset - /// - unionKeyName: Union key name - /// - fieldName: Field key name - /// - required: indicates if an object is required to be present - /// - completion: Completion is a handler that WILL be called in the generated - /// - Throws: A `FlatbuffersErrors` where the field is corrupt - public mutating func visitUnionVector( - unionKey key: VOffset, - unionField field: VOffset, - unionKeyName: String, - fieldName: String, - required: Bool, - completion: @escaping (inout Verifier, T, Int) throws -> Void) throws - where T: UnionEnum - { - let keyVectorPosition = try dereference(key) - let offsetVectorPosition = try dereference(field) - - if let keyPos = keyVectorPosition, - let valPos = offsetVectorPosition - { - try UnionVector.verify( - &_verifier, - keyPosition: keyPos, - fieldPosition: valPos, - unionKeyName: unionKeyName, - fieldName: fieldName, - completion: completion) - return - } - if required { - throw FlatbuffersErrors.requiredFieldDoesntExist( - position: field, - name: fieldName) - } - } - - /// Finishs the current Table verifier, and subtracts the current - /// table from the incremented depth. - public mutating func finish() { - _verifier.finish() - } -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/VeriferOptions.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/VeriferOptions.swift deleted file mode 100644 index a760ffbab..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/VeriferOptions.swift +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// `VerifierOptions` is a set of options to verify a flatbuffer -public struct VerifierOptions { - - /// Maximum `Apparent` size if the buffer can be expanded into a DAG tree - internal var _maxApparentSize: UOffset - - /// Maximum table count allowed in a buffer - internal var _maxTableCount: UOffset - - /// Maximum depth allowed in a buffer - internal var _maxDepth: UOffset - - /// Ignoring missing null terminals in strings - internal var _ignoreMissingNullTerminators: Bool - - /// initializes the set of options for the verifier - /// - Parameters: - /// - maxDepth: Maximum depth allowed in a buffer - /// - maxTableCount: Maximum table count allowed in a buffer - /// - maxApparentSize: Maximum `Apparent` size if the buffer can be expanded into a DAG tree - /// - ignoreMissingNullTerminators: Ignoring missing null terminals in strings *Currently not supported in swift* - public init( - maxDepth: UOffset = 64, - maxTableCount: UOffset = 1000000, - maxApparentSize: UOffset = 1 << 31, - ignoreMissingNullTerminators: Bool = false) - { - _maxDepth = maxDepth - _maxTableCount = maxTableCount - _maxApparentSize = maxApparentSize - _ignoreMissingNullTerminators = ignoreMissingNullTerminators - } - -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Verifiable.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Verifiable.swift deleted file mode 100644 index f16d42172..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Verifiable.swift +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// Verifiable is a protocol all swift flatbuffers object should conform to, -/// since swift is similar to `cpp` and `rust` where the data is read directly -/// from `unsafeMemory` thus the need to verify if the buffer received is a valid one -public protocol Verifiable { - - /// Verifies that the current value is which the bounds of the buffer, and if - /// the current `Value` is aligned properly - /// - Parameters: - /// - verifier: Verifier that hosts the buffer - /// - position: Current position within the buffer - /// - type: The type of the object to be verified - /// - Throws: Errors coming from `inBuffer` function - static func verify( - _ verifier: inout Verifier, - at position: Int, - of type: T.Type) throws where T: Verifiable -} - -extension Verifiable { - - /// Verifies if the current range to be read is within the bounds of the buffer, - /// and if the range is properly aligned - /// - Parameters: - /// - verifier: Verifier that hosts the buffer - /// - position: Current position within the buffer - /// - type: The type of the object to be verified - /// - Throws: Erros thrown from `isAligned` & `rangeInBuffer` - /// - Returns: a tuple of the start position and the count of objects within the range - @discardableResult - public static func verifyRange( - _ verifier: inout Verifier, - at position: Int, of type: T.Type) throws -> (start: Int, count: Int) - { - let len: UOffset = try verifier.getValue(at: position) - let intLen = Int(len) - let start = Int(clamping: (position &+ MemoryLayout.size).magnitude) - try verifier.isAligned(position: start, type: type.self) - try verifier.rangeInBuffer(position: start, size: intLen) - return (start, intLen) - } -} - -extension Verifiable where Self: Scalar { - - /// Verifies that the current value is which the bounds of the buffer, and if - /// the current `Value` is aligned properly - /// - Parameters: - /// - verifier: Verifier that hosts the buffer - /// - position: Current position within the buffer - /// - type: The type of the object to be verified - /// - Throws: Errors coming from `inBuffer` function - public static func verify( - _ verifier: inout Verifier, - at position: Int, - of type: T.Type) throws where T: Verifiable - { - try verifier.inBuffer(position: position, of: type.self) - } -} - -// MARK: - ForwardOffset - -/// ForwardOffset is a container to wrap around the Generic type to be verified -/// from the flatbuffers object. -public enum ForwardOffset: Verifiable where U: Verifiable { - - /// Verifies that the current value is which the bounds of the buffer, and if - /// the current `Value` is aligned properly - /// - Parameters: - /// - verifier: Verifier that hosts the buffer - /// - position: Current position within the buffer - /// - type: The type of the object to be verified - /// - Throws: Errors coming from `inBuffer` function - public static func verify( - _ verifier: inout Verifier, - at position: Int, - of type: T.Type) throws where T: Verifiable - { - let offset: UOffset = try verifier.getValue(at: position) - let nextOffset = Int(clamping: (Int(offset) &+ position).magnitude) - try U.verify(&verifier, at: nextOffset, of: U.self) - } -} - -// MARK: - Vector - -/// Vector is a container to wrap around the Generic type to be verified -/// from the flatbuffers object. -public enum Vector: Verifiable where U: Verifiable, S: Verifiable { - - /// Verifies that the current value is which the bounds of the buffer, and if - /// the current `Value` is aligned properly - /// - Parameters: - /// - verifier: Verifier that hosts the buffer - /// - position: Current position within the buffer - /// - type: The type of the object to be verified - /// - Throws: Errors coming from `inBuffer` function - public static func verify( - _ verifier: inout Verifier, - at position: Int, - of type: T.Type) throws where T: Verifiable - { - /// checks if the next verification type S is equal to U of type forwardOffset - /// This had to be done since I couldnt find a solution for duplicate call functions - /// A fix will be appreciated - if U.self is ForwardOffset.Type { - let range = try verifyRange(&verifier, at: position, of: UOffset.self) - for index in stride( - from: range.start, - to: Int( - clamping: range - .start &+ (range.count &* MemoryLayout.size)), - by: MemoryLayout.size) - { - try U.verify(&verifier, at: index, of: U.self) - } - } else { - try S.verifyRange(&verifier, at: position, of: S.self) - } - } -} - -// MARK: - UnionVector - -/// UnionVector is a container to wrap around the Generic type to be verified -/// from the flatbuffers object. -public enum UnionVector where S: UnionEnum { - - /// Completion handler for the function Verify, that passes the verifier - /// enum type and position of union field - public typealias Completion = (inout Verifier, S, Int) throws -> Void - - /// Verifies if the current range to be read is within the bounds of the buffer, - /// and if the range is properly aligned. It also verifies if the union type is a - /// *valid/supported* union type. - /// - Parameters: - /// - verifier: Verifier that hosts the buffer - /// - keyPosition: Current union key position within the buffer - /// - fieldPosition: Current union field position within the buffer - /// - unionKeyName: Name of key to written if error is presented - /// - fieldName: Name of field to written if error is presented - /// - completion: Completion is a handler that WILL be called in the generated - /// code to verify the actual objects - /// - Throws: FlatbuffersErrors - public static func verify( - _ verifier: inout Verifier, - keyPosition: Int, - fieldPosition: Int, - unionKeyName: String, - fieldName: String, - completion: @escaping Completion) throws - { - /// Get offset for union key vectors and offset vectors - let keyOffset: UOffset = try verifier.getValue(at: keyPosition) - let fieldOffset: UOffset = try verifier.getValue(at: fieldPosition) - - /// Check if values are within the buffer, returns the start position of vectors, and vector counts - /// Using &+ is safe since we already verified that the value is within the buffer, where the max is - /// going to be 2Gib and swift supports Int64 by default - let keysRange = try S.T.verifyRange( - &verifier, - at: Int(keyOffset) &+ keyPosition, - of: S.T.self) - let offsetsRange = try UOffset.verifyRange( - &verifier, - at: Int(fieldOffset) &+ fieldPosition, - of: UOffset.self) - - guard keysRange.count == offsetsRange.count else { - throw FlatbuffersErrors.unionVectorSize( - keyVectorSize: keysRange.count, - fieldVectorSize: offsetsRange.count, - unionKeyName: unionKeyName, - fieldName: fieldName) - } - - var count = 0 - /// Iterate over the vector of keys and offsets. - while count < keysRange.count { - - /// index of readable enum value in array - let keysIndex = MemoryLayout.size * count - guard let _enum = try S.init(value: verifier._buffer.read( - def: S.T.self, - position: keysRange.start + keysIndex)) else - { - throw FlatbuffersErrors.unknownUnionCase - } - /// index of readable offset value in array - let fieldIndex = MemoryLayout.size * count - try completion(&verifier, _enum, offsetsRange.start + fieldIndex) - count += 1 - } - } -} diff --git a/third_party/flatbuffers/swift/Sources/FlatBuffers/Verifier.swift b/third_party/flatbuffers/swift/Sources/FlatBuffers/Verifier.swift deleted file mode 100644 index 6daf6f50c..000000000 --- a/third_party/flatbuffers/swift/Sources/FlatBuffers/Verifier.swift +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright 2023 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !os(WASI) -import Foundation -#else -import SwiftOverlayShims -#endif - -/// Verifier that check if the buffer passed into it is a valid, -/// safe, aligned Flatbuffers object since swift read from `unsafeMemory` -public struct Verifier { - - /// Flag to check for alignment if true - fileprivate let _checkAlignment: Bool - /// Capacity of the current buffer - fileprivate var _capacity: Int - /// Current ApparentSize - fileprivate var _apparentSize: UOffset = 0 - /// Amount of tables present within a buffer - fileprivate var _tableCount = 0 - - /// Capacity of the buffer - internal var capacity: Int { _capacity } - /// Current reached depth within the buffer - internal var _depth = 0 - /// Current verifiable ByteBuffer - internal var _buffer: ByteBuffer - /// Options for verification - internal let _options: VerifierOptions - - /// Initializer for the verifier - /// - Parameters: - /// - buffer: Bytebuffer that is required to be verified - /// - options: `VerifierOptions` that set the rule for some of the verification done - /// - checkAlignment: If alignment check is required to be preformed - /// - Throws: `exceedsMaxSizeAllowed` if capacity of the buffer is more than 2GiB - public init( - buffer: inout ByteBuffer, - options: VerifierOptions = .init(), - checkAlignment: Bool = true) throws - { - guard buffer.capacity < FlatBufferMaxSize else { - throw FlatbuffersErrors.exceedsMaxSizeAllowed - } - - _buffer = buffer - _capacity = buffer.capacity - _checkAlignment = checkAlignment - _options = options - } - - /// Resets the verifier to initial state - public mutating func reset() { - _depth = 0 - _tableCount = 0 - } - - /// Checks if the value of type `T` is aligned properly in the buffer - /// - Parameters: - /// - position: Current position - /// - type: Type of value to check - /// - Throws: `missAlignedPointer` if the pointer is not aligned properly - public mutating func isAligned(position: Int, type: T.Type) throws { - - /// If check alignment is false this mutating function doesnt continue - if !_checkAlignment { return } - - /// advance pointer to position X - let ptr = _buffer._storage.memory.advanced(by: position) - /// Check if the pointer is aligned - if Int(bitPattern: ptr) & (MemoryLayout.alignment &- 1) == 0 { - return - } - - throw FlatbuffersErrors.missAlignedPointer( - position: position, - type: String(describing: T.self)) - } - - /// Checks if the value of Size "X" is within the range of the buffer - /// - Parameters: - /// - position: Current postion to be read - /// - size: `Byte` Size of readable object within the buffer - /// - Throws: `outOfBounds` if the value is out of the bounds of the buffer - /// and `apparentSizeTooLarge` if the apparent size is bigger than the one specified - /// in `VerifierOptions` - public mutating func rangeInBuffer(position: Int, size: Int) throws { - let end = UInt(clamping: (position &+ size).magnitude) - if end > _buffer.capacity { - throw FlatbuffersErrors.outOfBounds(position: end, end: capacity) - } - _apparentSize = _apparentSize &+ UInt32(size) - if _apparentSize > _options._maxApparentSize { - throw FlatbuffersErrors.apparentSizeTooLarge - } - } - - /// Validates if a value of type `T` is aligned and within the bounds of - /// the buffer - /// - Parameters: - /// - position: Current readable position - /// - type: Type of value to check - /// - Throws: FlatbuffersErrors - public mutating func inBuffer(position: Int, of type: T.Type) throws { - try isAligned(position: position, type: type) - try rangeInBuffer(position: position, size: MemoryLayout.size) - } - - /// Visits a table at the current position and validates if the table meets - /// the rules specified in the `VerifierOptions` - /// - Parameter position: Current position to be read - /// - Throws: FlatbuffersErrors - /// - Returns: A `TableVerifier` at the current readable table - public mutating func visitTable(at position: Int) throws -> TableVerifier { - let vtablePosition = try derefOffset(position: position) - let vtableLength: VOffset = try getValue(at: vtablePosition) - - let length = Int(vtableLength) - try isAligned( - position: Int(clamping: (vtablePosition + length).magnitude), - type: VOffset.self) - try rangeInBuffer(position: vtablePosition, size: length) - - _tableCount += 1 - - if _tableCount > _options._maxTableCount { - throw FlatbuffersErrors.maximumTables - } - - _depth += 1 - - if _depth > _options._maxDepth { - throw FlatbuffersErrors.maximumDepth - } - - return TableVerifier( - position: position, - vtable: vtablePosition, - vtableLength: length, - verifier: &self) - } - - /// Validates if a value of type `T` is within the buffer and returns it - /// - Parameter position: Current position to be read - /// - Throws: `inBuffer` errors - /// - Returns: a value of type `T` usually a `VTable` or a table offset - internal mutating func getValue(at position: Int) throws -> T { - try inBuffer(position: position, of: T.self) - return _buffer.read(def: T.self, position: position) - } - - /// derefrences an offset within a vtable to get the position of the field - /// in the bytebuffer - /// - Parameter position: Current readable position - /// - Throws: `inBuffer` errors & `signedOffsetOutOfBounds` - /// - Returns: Current readable position for a field - @inline(__always) - internal mutating func derefOffset(position: Int) throws -> Int { - try inBuffer(position: position, of: Int32.self) - - let offset = _buffer.read(def: Int32.self, position: position) - // switching to int32 since swift's default Int is int64 - // this should be safe since we already checked if its within - // the buffer - let _int32Position = UInt32(position) - - let reportedOverflow: (partialValue: UInt32, overflow: Bool) - if offset > 0 { - reportedOverflow = _int32Position - .subtractingReportingOverflow(offset.magnitude) - } else { - reportedOverflow = _int32Position - .addingReportingOverflow(offset.magnitude) - } - - /// since `subtractingReportingOverflow` & `addingReportingOverflow` returns true, - /// if there is overflow we return failure - if reportedOverflow.overflow || reportedOverflow.partialValue > _buffer - .capacity - { - throw FlatbuffersErrors.signedOffsetOutOfBounds( - offset: Int(offset), - position: position) - } - - return Int(reportedOverflow.partialValue) - } - - /// finishes the current iteration of verification on an object - internal mutating func finish() { - _depth -= 1 - } - - mutating func verify(id: String) throws { - let size = MemoryLayout.size - let str = _buffer.readString(at: size, count: size) - if id == str { - return - } - throw FlatbuffersErrors.bufferIdDidntMatchPassedId - } - -}