Compare commits

..

1 Commits

Author SHA1 Message Date
derekbailey
8a37f22f47 Remove generated .h files from repo 2025-12-22 05:42:15 +00:00
292 changed files with 17146 additions and 35857 deletions

View File

@@ -1,6 +0,0 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"

View File

@@ -42,7 +42,7 @@ jobs:
chmod +x flatc chmod +x flatc
./flatc --version ./flatc --version
- name: upload build artifacts - name: upload build artifacts
uses: actions/upload-artifact@v7 uses: actions/upload-artifact@v4
with: with:
name: Linux flatc binary ${{ matrix.cxx }} name: Linux flatc binary ${{ matrix.cxx }}
path: flatc path: flatc
@@ -170,7 +170,7 @@ jobs:
- name: test - name: test
run: Release\flattests.exe run: Release\flattests.exe
- name: upload build artifacts - name: upload build artifacts
uses: actions/upload-artifact@v7 uses: actions/upload-artifact@v4
with: with:
name: Windows flatc binary name: Windows flatc binary
path: Release\flatc.exe path: Release\flatc.exe
@@ -191,13 +191,14 @@ jobs:
build-dotnet-windows: build-dotnet-windows:
name: Build .NET Windows name: Build .NET Windows
runs-on: windows-2022 runs-on: windows-2022-64core
strategy: strategy:
matrix: matrix:
configuration: [ configuration: [
'', '',
'-p:UnsafeByteBuffer=true', '-p:UnsafeByteBuffer=true',
'-p:EnableSpanT=true,UnsafeByteBuffer=true' # Fails two tests currently.
#'-p:EnableSpanT=true,UnsafeByteBuffer=true'
] ]
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v6
@@ -208,7 +209,7 @@ jobs:
- name: Build - name: Build
run: | run: |
cd tests\FlatBuffers.Test cd tests\FlatBuffers.Test
dotnet new sln --force --name FlatBuffers.Test --format sln dotnet new sln --force --name FlatBuffers.Test
dotnet sln FlatBuffers.Test.sln add FlatBuffers.Test.csproj dotnet sln FlatBuffers.Test.sln add FlatBuffers.Test.csproj
dotnet build -c Release ${{matrix.configuration}} FlatBuffers.Test.sln dotnet build -c Release ${{matrix.configuration}} FlatBuffers.Test.sln
- name: Run net6.0 - name: Run net6.0
@@ -246,7 +247,7 @@ jobs:
chmod +x Release/flatc chmod +x Release/flatc
Release/flatc --version Release/flatc --version
- name: upload build artifacts - name: upload build artifacts
uses: actions/upload-artifact@v7 uses: actions/upload-artifact@v4
with: with:
name: Mac flatc binary Intel name: Mac flatc binary Intel
path: Release/flatc path: Release/flatc
@@ -289,7 +290,7 @@ jobs:
chmod +x Release/flatc chmod +x Release/flatc
Release/flatc --version Release/flatc --version
- name: upload build artifacts - name: upload build artifacts
uses: actions/upload-artifact@v7 uses: actions/upload-artifact@v4
with: with:
name: Mac flatc binary Universal name: Mac flatc binary Universal
path: Release/flatc path: Release/flatc
@@ -314,12 +315,12 @@ jobs:
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v6
- name: set up Java - name: set up Java
uses: actions/setup-java@v5 uses: actions/setup-java@v4
with: with:
distribution: temurin distribution: temurin
java-version: 17 java-version: 17
- name: set up Gradle - name: set up Gradle
uses: gradle/actions/setup-gradle@v6 uses: gradle/actions/setup-gradle@v5
- name: set up flatc - name: set up flatc
run: | run: |
cmake -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_STRICT_MODE=ON . cmake -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_STRICT_MODE=ON .
@@ -373,7 +374,7 @@ jobs:
- name: Run benchmarks - name: Run benchmarks
run: ./flatbenchmark --benchmark_repetitions=5 --benchmark_display_aggregates_only=true --benchmark_out_format=console --benchmark_out=benchmarks/results_${{matrix.cxx}} run: ./flatbenchmark --benchmark_repetitions=5 --benchmark_display_aggregates_only=true --benchmark_out_format=console --benchmark_out=benchmarks/results_${{matrix.cxx}}
- name: Upload benchmarks results - name: Upload benchmarks results
uses: actions/upload-artifact@v7 uses: actions/upload-artifact@v4
with: with:
name: Linux flatbenchmark results ${{matrix.cxx}} name: Linux flatbenchmark results ${{matrix.cxx}}
path: benchmarks/results_${{matrix.cxx}} path: benchmarks/results_${{matrix.cxx}}
@@ -394,12 +395,12 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v6 uses: actions/checkout@v6
- name: set up Java - name: set up Java
uses: actions/setup-java@v5 uses: actions/setup-java@v4
with: with:
distribution: temurin distribution: temurin
java-version: 17 java-version: 17
- name: set up Gradle - name: set up Gradle
uses: gradle/actions/setup-gradle@v6 uses: gradle/actions/setup-gradle@v5
- name: Build flatc - name: Build flatc
run: | run: |
cmake -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF . cmake -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF .
@@ -417,12 +418,12 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v6 uses: actions/checkout@v6
- name: set up Java - name: set up Java
uses: actions/setup-java@v5 uses: actions/setup-java@v4
with: with:
distribution: temurin distribution: temurin
java-version: 17 java-version: 17
- name: set up Gradle - name: set up Gradle
uses: gradle/actions/setup-gradle@v6 uses: gradle/actions/setup-gradle@v5
- name: Build flatc - name: Build flatc
run: | run: |
cmake -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF . cmake -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF .
@@ -446,7 +447,7 @@ jobs:
build-rust-windows: build-rust-windows:
name: Build Rust Windows name: Build Rust Windows
runs-on: windows-2022 runs-on: windows-2022-64core
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v6
- name: test - name: test
@@ -545,7 +546,7 @@ jobs:
# FIXME: make test script not rely on flatc # FIXME: make test script not rely on flatc
run: cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF . && make -j run: cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF . && make -j
- name: pnpm - name: pnpm
run: npm install -g pnpm run: npm install -g pnpm esbuild
- name: deps - name: deps
run: pnpm i run: pnpm i
- name: compile - name: compile
@@ -591,16 +592,11 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v6
# Explicitly use 8.5.1 until we can update or https://github.com/actions/runner-images/issues/13564 is fixed.
- name: Set env
run: >
echo "USE_BAZEL_VERSION=8.5.1" >> $GITHUB_ENV
- name: bazel build - name: bazel build
run: > run: >
bazel build bazel build
//:flatc //:flatc
//:flatbuffers //:flatbuffers
//tests:flatbuffers_test
- name: bazel test - name: bazel test
run: > run: >
bazel test bazel test

View File

@@ -21,11 +21,11 @@ jobs:
run: | run: |
git config user.name github-actions[bot] git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com git config user.email 41898282+github-actions[bot]@users.noreply.github.com
- uses: actions/setup-python@v6 - uses: actions/setup-python@v5
with: with:
python-version: 3.x python-version: 3.x
- run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
- uses: actions/cache@v5 - uses: actions/cache@v4
with: with:
key: mkdocs-material-${{ env.cache_id }} key: mkdocs-material-${{ env.cache_id }}
path: .cache path: .cache

View File

@@ -27,7 +27,7 @@ jobs:
language: c++ language: c++
fuzz-seconds: 60 fuzz-seconds: 60
- name: Upload Crash - name: Upload Crash
uses: actions/upload-artifact@v7 uses: actions/upload-artifact@v4
if: failure() && steps.build.outcome == 'success' if: failure() && steps.build.outcome == 'success'
with: with:
name: artifacts name: artifacts

View File

@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v6
- uses: actions/setup-node@v6 - uses: actions/setup-node@v3
with: with:
node-version: '20.x' node-version: '20.x'
registry-url: 'https://registry.npmjs.org' registry-url: 'https://registry.npmjs.org'
@@ -30,7 +30,7 @@ jobs:
working-directory: ./python working-directory: ./python
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v6
- uses: actions/setup-python@v6 - uses: actions/setup-python@v4
with: with:
python-version: '3.10' python-version: '3.10'

View File

@@ -515,13 +515,13 @@ function(compile_schema SRC_FBS OPT SUFFIX OUT_GEN_FILE)
endfunction() endfunction()
function(compile_schema_for_test SRC_FBS OPT) function(compile_schema_for_test SRC_FBS OPT)
compile_schema("${SRC_FBS}" "${OPT}" "_generated" GEN_FILE) compile_schema("${SRC_FBS}" "${OPT}" ".fbs" GEN_FILE)
target_sources(flattests PRIVATE ${GEN_FILE}) target_sources(flattests PRIVATE ${GEN_FILE})
endfunction() endfunction()
function(compile_schema_for_test_fbsh SRC_FBS OPT) function(compile_schema_for_test_17 SRC_FBS OPT)
compile_schema("${SRC_FBS}" "${OPT}" ".fbs" GEN_FILE) compile_schema("${SRC_FBS}" "${OPT}" ".fbs" GEN_FILE)
target_sources(flattests PRIVATE ${GEN_FILE}) target_sources(flattests_cpp17 PRIVATE ${GEN_FILE})
endfunction() endfunction()
function(compile_schema_for_samples SRC_FBS OPT) function(compile_schema_for_samples SRC_FBS OPT)
@@ -548,18 +548,26 @@ if(FLATBUFFERS_BUILD_TESTS)
# The flattest target needs some generated files # The flattest target needs some generated files
SET(FLATC_OPT_COMP --cpp --gen-compare --gen-mutable --gen-object-api --reflect-names) SET(FLATC_OPT_COMP --cpp --gen-compare --gen-mutable --gen-object-api --reflect-names)
SET(FLATC_OPT_SCOPED_ENUMS ${FLATC_OPT_COMP};--scoped-enums) SET(FLATC_OPT_SCOPED_ENUMS ${FLATC_OPT_COMP};--scoped-enums)
SET(FLATC_OPT_NAKED_PTR ${FLATC_OPT_COMP} --cpp-ptr-type naked)
compile_schema_for_test(tests/alignment_test.fbs "${FLATC_OPT_COMP}") compile_schema_for_test(tests/alignment_test.fbs "${FLATC_OPT_COMP}")
compile_schema_for_test_fbsh(tests/default_vectors_strings_test.fbs "${FLATC_OPT_COMP}") compile_schema_for_test(tests/default_vectors_strings_test.fbs "${FLATC_OPT_COMP}")
compile_schema_for_test(tests/monster_extra.fbs "${FLATC_OPT_COMP}")
compile_schema_for_test(tests/arrays_test.fbs "${FLATC_OPT_SCOPED_ENUMS}") compile_schema_for_test(tests/arrays_test.fbs "${FLATC_OPT_SCOPED_ENUMS}")
compile_schema_for_test(tests/native_inline_table_test.fbs "${FLATC_OPT_COMP}") compile_schema_for_test(tests/native_inline_table_test.fbs "${FLATC_OPT_COMP}")
compile_schema_for_test(tests/native_type_test.fbs "${FLATC_OPT_COMP}") compile_schema_for_test(tests/native_type_test.fbs "${FLATC_OPT_COMP}")
compile_schema_for_test(tests/optional_scalars.fbs "${FLATC_OPT_COMP}")
compile_schema_for_test(tests/key_field/key_field_sample.fbs "${FLATC_OPT_COMP}") compile_schema_for_test(tests/key_field/key_field_sample.fbs "${FLATC_OPT_COMP}")
compile_schema_for_test(tests/64bit/test_64bit.fbs "${FLATC_OPT_COMP};--bfbs-gen-embed") compile_schema_for_test(tests/64bit/test_64bit.fbs "${FLATC_OPT_COMP};--bfbs-gen-embed")
compile_schema_for_test(tests/64bit/evolution/v1.fbs "${FLATC_OPT_COMP}") compile_schema_for_test(tests/64bit/evolution/v1.fbs "${FLATC_OPT_COMP}")
compile_schema_for_test(tests/64bit/evolution/v2.fbs "${FLATC_OPT_COMP}") compile_schema_for_test(tests/64bit/evolution/v2.fbs "${FLATC_OPT_COMP}")
compile_schema_for_test(tests/union_underlying_type_test.fbs "${FLATC_OPT_SCOPED_ENUMS}") compile_schema_for_test(tests/union_underlying_type_test.fbs "${FLATC_OPT_SCOPED_ENUMS}")
compile_schema_for_test(tests/cross_namespace_pack_test.fbs "${FLATC_OPT_COMP}") compile_schema_for_test(tests/evolution_test/evolution_v1.fbs "${FLATC_OPT_SCOPED_ENUMS}")
compile_schema_for_test(tests/evolution_test/evolution_v2.fbs "${FLATC_OPT_SCOPED_ENUMS}")
compile_schema_for_test(tests/vector_table_naked_ptr.fbs "${FLATC_OPT_NAKED_PTR}")
compile_schema_for_test(tests/namespace_test/namespace_test1.fbs "${FLATC_OPT_SCOPED_ENUMS}")
compile_schema_for_test(tests/namespace_test/namespace_test2.fbs "${FLATC_OPT_SCOPED_ENUMS}")
compile_schema_for_test(tests/union_vector/union_vector.fbs "${FLATC_OPT_COMP}")
if(FLATBUFFERS_CODE_SANITIZE) if(FLATBUFFERS_CODE_SANITIZE)
add_fsanitize_to_target(flattests ${FLATBUFFERS_CODE_SANITIZE}) add_fsanitize_to_target(flattests ${FLATBUFFERS_CODE_SANITIZE})
@@ -589,9 +597,19 @@ if(FLATBUFFERS_BUILD_TESTS)
if(FLATBUFFERS_BUILD_CPP17) if(FLATBUFFERS_BUILD_CPP17)
add_executable(flattests_cpp17 ${FlatBuffers_Tests_CPP17_SRCS}) add_executable(flattests_cpp17 ${FlatBuffers_Tests_CPP17_SRCS})
target_link_libraries(flattests_cpp17 PRIVATE $<BUILD_INTERFACE:ProjectConfig>) target_link_libraries(flattests_cpp17 PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
target_include_directories(flattests_cpp17 PUBLIC src tests) target_include_directories(flattests_cpp17 PUBLIC
# Ideally everything is fully qualified from the root directories
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
# TODO(derekbailey): update includes to fully qualify src/ and tests/
src
tests
${CMAKE_CURRENT_BINARY_DIR}/tests
)
target_compile_features(flattests_cpp17 PRIVATE cxx_std_17) # requires cmake 3.8 target_compile_features(flattests_cpp17 PRIVATE cxx_std_17) # requires cmake 3.8
compile_schema_for_test_17(tests/optional_scalars.fbs "${FLATC_OPT_COMP}")
if(FLATBUFFERS_CODE_SANITIZE) if(FLATBUFFERS_CODE_SANITIZE)
add_fsanitize_to_target(flattests_cpp17 ${FLATBUFFERS_CODE_SANITIZE}) add_fsanitize_to_target(flattests_cpp17 ${FLATBUFFERS_CODE_SANITIZE})
endif() endif()

View File

@@ -7,7 +7,7 @@ module(
bazel_dep( bazel_dep(
name = "aspect_bazel_lib", name = "aspect_bazel_lib",
version = "2.14.0", version = "2.11.0",
) )
bazel_dep( bazel_dep(
name = "aspect_rules_esbuild", name = "aspect_rules_esbuild",
@@ -23,16 +23,16 @@ bazel_dep(
) )
bazel_dep( bazel_dep(
name = "grpc", name = "grpc",
version = "1.76.0", version = "1.70.1",
repo_name = "com_github_grpc_grpc", repo_name = "com_github_grpc_grpc",
) )
bazel_dep( bazel_dep(
name = "platforms", name = "platforms",
version = "0.0.11", version = "0.0.10",
) )
bazel_dep( bazel_dep(
name = "rules_cc", name = "rules_cc",
version = "0.1.1", version = "0.0.16",
) )
bazel_dep( bazel_dep(
name = "rules_go", name = "rules_go",
@@ -49,8 +49,7 @@ bazel_dep(
) )
bazel_dep( bazel_dep(
name = "rules_swift", name = "rules_swift",
version = "3.1.2", version = "2.1.1",
max_compatibility_level = 3,
repo_name = "build_bazel_rules_swift", repo_name = "build_bazel_rules_swift",
) )
bazel_dep( bazel_dep(
@@ -63,6 +62,9 @@ npm.npm_translate_lock(
name = "flatbuffers_npm", name = "flatbuffers_npm",
npmrc = "//:.npmrc", npmrc = "//:.npmrc",
pnpm_lock = "//ts:pnpm-lock.yaml", pnpm_lock = "//ts:pnpm-lock.yaml",
# Override the Bazel package where pnpm-lock.yaml is located and link
# to the specified package instead.
root_package = "ts",
verify_node_modules_ignored = "//:.bazelignore", verify_node_modules_ignored = "//:.bazelignore",
) )
use_repo(npm, "flatbuffers_npm") use_repo(npm, "flatbuffers_npm")

View File

@@ -5,7 +5,7 @@ import 'types.dart';
/// The main builder class for creation of a FlexBuffer. /// The main builder class for creation of a FlexBuffer.
class Builder { class Builder {
ByteData _buffer; final ByteData _buffer;
List<_StackValue> _stack = []; List<_StackValue> _stack = [];
List<_StackPointer> _stackPointers = []; List<_StackPointer> _stackPointers = [];
int _offset = 0; int _offset = 0;
@@ -506,7 +506,6 @@ class Builder {
if (prevSize < size) { if (prevSize < size) {
final newBuf = ByteData(size); final newBuf = ByteData(size);
newBuf.buffer.asUint8List().setAll(0, _buffer.buffer.asUint8List()); newBuf.buffer.asUint8List().setAll(0, _buffer.buffer.asUint8List());
_buffer = newBuf;
} }
return newOffset; return newOffset;
} }

View File

@@ -318,21 +318,6 @@ void main() {
1, 1,
]); ]);
} }
{
// Default buffer is 2048 bytes, add 2300 bytes of strings that force it
// to grow.
final s1 = 'A' * 1000;
final s2 = 'B' * 800;
final s3 = 'C' * 500;
var flx = Builder()
..startVector()
..addString(s1)
..addString(s2)
..addString(s3)
..end();
expect(flx.finish().length, 2323);
}
}); });
test('build map', () { test('build map', () {

View File

@@ -79,12 +79,11 @@ list of `FILES...`.
`myschema.fbs` to JSON: `myschema.fbs` to JSON:
```sh ```sh
flatc --json myschema.fbs -- mydata.bin flatc --json myschema.fbs mydata.bin
``` ```
This will generate a `mydata.json` file. If there is no This will generate a `mydata.json` file.
[`file_identifier`](schema.md/#file-identification-and-extension) defined
for this schema, you will need to use the `--raw-binary` option.
### Additional options ### Additional options

View File

@@ -205,47 +205,6 @@ And example of usage, for the time being, can be found in
- Safe getters in [SafeBuffer](https://docs.rs/flatbuffers-reflection/latest/flatbuffers_reflection/struct.SafeBuffer.html), - Safe getters in [SafeBuffer](https://docs.rs/flatbuffers-reflection/latest/flatbuffers_reflection/struct.SafeBuffer.html),
which does verification when constructed so you can use it for any data source which does verification when constructed so you can use it for any data source
## Buffer pre allocation in a latency-sensitive context
In latency-sensitive applications, dynamic memory allocations can introduce unpredictable latency spikes. The `FlatBufferBuilder` internally uses several `Vec`s that may reallocate during serialization:
- The backing buffer for the FlatBuffer data
- `field_locs` for tracking field locations within tables
- `written_vtable_revpos` for deduplicating vtables
- `strings_pool` for shared string interning
To avoid allocations during serialization, you can preallocate all internal vectors upfront using the `with_internal_capacity` constructor:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.rs}
// Preallocate: 1KB buffer, 8 field locations, 16 vtables, 32 shared strings
let mut builder = FlatBufferBuilder::with_internal_capacity(1024, 8, 16, 32);
// All subsequent operations will not allocate (if capacities are sufficient)
let name = builder.create_shared_string("MyMonster");
// ... build your FlatBuffer ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
There are three variants available:
- `with_internal_capacity(size, field_locs, vtables, strings)` - Creates a new builder with all capacities preallocated
- `from_vec_with_internal_capacity(buffer, field_locs, vtables, strings)` - Reuses an existing `Vec<u8>` as the backing buffer
- `new_in_with_internal_capacity(allocator, field_locs, vtables, strings)` - Uses a custom `Allocator` with preallocated internal vecs
When combined with `reset()`, you can reuse the same builder across multiple serializations without any allocations after the initial setup:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.rs}
let mut builder = FlatBufferBuilder::with_internal_capacity(1024, 8, 16, 32);
loop {
// Build a FlatBuffer (allocation-free if capacities are sufficient)
let data = build_message(&mut builder);
send(data);
// Reset for reuse - clears state but retains allocated capacity
builder.reset();
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## Useful tools created by others ## Useful tools created by others
* [flatc-rust](https://github.com/frol/flatc-rust) - FlatBuffers compiler * [flatc-rust](https://github.com/frol/flatc-rust) - FlatBuffers compiler

View File

@@ -427,6 +427,9 @@ Current understood attributes:
it won't be accessible anymore by newer code. Note that if you deprecate a it won't be accessible anymore by newer code. Note that if you deprecate a
field that was previous required, old code may fail to validate new data (when field that was previous required, old code may fail to validate new data (when
using the optional verifier). using the optional verifier).
### `required`
- `required` (on a non-scalar table field): this field must always be set. By - `required` (on a non-scalar table field): this field must always be set. By
default, fields do not need to be present in the binary. This is desirable, as default, fields do not need to be present in the binary. This is desirable, as
it helps with forwards/backwards compatibility, and flexibility of data it helps with forwards/backwards compatibility, and flexibility of data

View File

@@ -26,7 +26,7 @@ Simple mutation | Yes | Yes | Yes | Yes | No | No
Reflection | Yes | No | No | No | No | No | No | Basic | No | No | No | No | No Reflection | Yes | No | No | No | No | No | No | Basic | No | No | No | No | No
Buffer verifier | Yes | No | No | No | No | No | No | Yes | No | No | No | No | Yes Buffer verifier | Yes | No | No | No | No | No | No | Yes | No | No | No | No | Yes
Native Object API | Yes | No | Yes | Yes | Yes | Yes | Yes | No | No | Yes | No | No | Yes Native Object API | Yes | No | Yes | Yes | Yes | Yes | Yes | No | No | Yes | No | No | Yes
Optional Scalars | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | No | No | Yes | Yes | Yes Optional Scalars | Yes | Yes | Yes | No | No | Yes | Yes | Yes | No | No | Yes | Yes | Yes
Flexbuffers | Yes | Yes | ? | ? | ? | ? | ? | ? | ? | ? | ? | Yes | Yes Flexbuffers | Yes | Yes | ? | ? | ? | ? | ? | ? | ? | ? | ? | Yes | Yes
Testing: basic | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ? | Yes | Yes | Yes | Yes Testing: basic | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ? | Yes | Yes | Yes | Yes
Testing: fuzz | Yes | No | No | Yes | Yes | No | No | No | ? | No | No | Yes | No Testing: fuzz | Yes | No | No | Yes | Yes | No | No | No | ? | No | No | Yes | No

View File

@@ -1134,8 +1134,12 @@ The Builder provides multiple ways to create `vectors`.
=== "Python" === "Python"
```py ```py
# Use the generated helper to create the weapons vector from offsets. # Create a FlatBuffer vector and prepend the weapons.
weapons = MyGame.Sample.Monster.CreateWeaponsVector(builder, [sword, axe]) # Note: Since we prepend the data, prepend them in reverse order.
MyGame.Sample.Monster.StartWeaponsVector(builder, 2)
builder.PrependUOffsetTRelative(axe)
builder.PrependUOffsetTRelative(sword)
weapons = builder.EndVector()
``` ```
=== "Rust" === "Rust"
@@ -1348,13 +1352,16 @@ bit more directly.
```py ```py
# Create a `vector` representing the inventory of the Orc. Each number # Create a `vector` representing the inventory of the Orc. Each number
# could correspond to an item that can be claimed after he is slain. # could correspond to an item that can be claimed after he is slain.
inv = MyGame.Sample.Monster.CreateInventoryVector(builder, range(0, 10)) # Note: Since we prepend the bytes, this loop iterates in reverse.
MyGame.Sample.Monster.StartInventoryVector(builder, 10)
for i in reversed(range(0, 10)):
builder.PrependByte(i)
inv = builder.EndVector()
path_points = [ MyGame.Sample.Monster.StartPathVector(builder, 2)
MyGame.Sample.Vec3T(x=1.0, y=2.0, z=3.0), MyGame.Sample.Vec3.CreateVec3(builder, 1.0, 2.0, 3.0)
MyGame.Sample.Vec3T(x=4.0, y=5.0, z=6.0), MyGame.Sample.Vec3.CreateVec3(builder, 4.0, 5.0, 6.0)
] path = builder.EndVector()
path = MyGame.Sample.Monster.CreatePathVector(builder, path_points)
``` ```
=== "Rust" === "Rust"

View File

@@ -80,12 +80,6 @@ def UniverseStartGalaxiesVector(builder, numElems):
def StartGalaxiesVector(builder, numElems): def StartGalaxiesVector(builder, numElems):
return UniverseStartGalaxiesVector(builder, numElems) return UniverseStartGalaxiesVector(builder, numElems)
def UniverseCreateGalaxiesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateGalaxiesVector(builder, data):
UniverseCreateGalaxiesVector(builder, data)
def UniverseEnd(builder): def UniverseEnd(builder):
return builder.EndObject() return builder.EndObject()

View File

@@ -2,24 +2,23 @@
// @generated // @generated
extern crate alloc; extern crate alloc;
#[allow(unused_imports, dead_code)] #[allow(unused_imports, dead_code)]
pub mod flatbuffers { pub mod flatbuffers {
extern crate alloc;
#[allow(unused_imports, dead_code)] #[allow(unused_imports, dead_code)]
pub mod goldens { pub mod goldens {
extern crate alloc;
pub enum GalaxyOffset {} pub enum GalaxyOffset {}
#[derive(Copy, Clone, PartialEq)] #[derive(Copy, Clone, PartialEq)]
pub struct Galaxy<'a> { pub struct Galaxy<'a> {
pub _tab: ::flatbuffers::Table<'a>, pub _tab: ::flatbuffers::Table<'a>,
} }
impl<'a> ::flatbuffers::Follow<'a> for Galaxy<'a> { impl<'a> ::flatbuffers::Follow<'a> for Galaxy<'a> {
type Inner = Galaxy<'a>; type Inner = Galaxy<'a>;
#[inline] #[inline]
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } } Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }
@@ -33,7 +32,6 @@ pub mod flatbuffers {
pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self { pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {
Galaxy { _tab: table } Galaxy { _tab: table }
} }
#[allow(unused_mut)] #[allow(unused_mut)]
pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>( pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(
_fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>, _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,
@@ -65,11 +63,9 @@ pub mod flatbuffers {
Ok(()) Ok(())
} }
} }
pub struct GalaxyArgs { pub struct GalaxyArgs {
pub num_stars: i64, pub num_stars: i64,
} }
impl<'a> Default for GalaxyArgs { impl<'a> Default for GalaxyArgs {
#[inline] #[inline]
fn default() -> Self { fn default() -> Self {
@@ -83,13 +79,11 @@ pub mod flatbuffers {
fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>, fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,
start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>, start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,
} }
impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> GalaxyBuilder<'a, 'b, A> { impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> GalaxyBuilder<'a, 'b, A> {
#[inline] #[inline]
pub fn add_num_stars(&mut self, num_stars: i64) { pub fn add_num_stars(&mut self, num_stars: i64) {
self.fbb_.push_slot::<i64>(Galaxy::VT_NUM_STARS, num_stars, 0); self.fbb_.push_slot::<i64>(Galaxy::VT_NUM_STARS, num_stars, 0);
} }
#[inline] #[inline]
pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> GalaxyBuilder<'a, 'b, A> { pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> GalaxyBuilder<'a, 'b, A> {
let start = _fbb.start_table(); let start = _fbb.start_table();
@@ -98,7 +92,6 @@ pub mod flatbuffers {
start_: start, start_: start,
} }
} }
#[inline] #[inline]
pub fn finish(self) -> ::flatbuffers::WIPOffset<Galaxy<'a>> { pub fn finish(self) -> ::flatbuffers::WIPOffset<Galaxy<'a>> {
let o = self.fbb_.end_table(self.start_); let o = self.fbb_.end_table(self.start_);
@@ -113,17 +106,15 @@ pub mod flatbuffers {
ds.finish() ds.finish()
} }
} }
pub enum UniverseOffset {} pub enum UniverseOffset {}
#[derive(Copy, Clone, PartialEq)] #[derive(Copy, Clone, PartialEq)]
pub struct Universe<'a> { pub struct Universe<'a> {
pub _tab: ::flatbuffers::Table<'a>, pub _tab: ::flatbuffers::Table<'a>,
} }
impl<'a> ::flatbuffers::Follow<'a> for Universe<'a> { impl<'a> ::flatbuffers::Follow<'a> for Universe<'a> {
type Inner = Universe<'a>; type Inner = Universe<'a>;
#[inline] #[inline]
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } } Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }
@@ -138,7 +129,6 @@ pub mod flatbuffers {
pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self { pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {
Universe { _tab: table } Universe { _tab: table }
} }
#[allow(unused_mut)] #[allow(unused_mut)]
pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>( pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(
_fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>, _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,
@@ -158,7 +148,6 @@ pub mod flatbuffers {
// which contains a valid value in this slot // which contains a valid value in this slot
unsafe { self._tab.get::<f64>(Universe::VT_AGE, Some(0.0)).unwrap()} unsafe { self._tab.get::<f64>(Universe::VT_AGE, Some(0.0)).unwrap()}
} }
#[inline] #[inline]
pub fn galaxies(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Galaxy<'a>>>> { pub fn galaxies(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Galaxy<'a>>>> {
// Safety: // Safety:
@@ -180,12 +169,10 @@ pub mod flatbuffers {
Ok(()) Ok(())
} }
} }
pub struct UniverseArgs<'a> { pub struct UniverseArgs<'a> {
pub age: f64, pub age: f64,
pub galaxies: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Galaxy<'a>>>>>, pub galaxies: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Galaxy<'a>>>>>,
} }
impl<'a> Default for UniverseArgs<'a> { impl<'a> Default for UniverseArgs<'a> {
#[inline] #[inline]
fn default() -> Self { fn default() -> Self {
@@ -200,18 +187,15 @@ pub mod flatbuffers {
fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>, fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,
start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>, start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,
} }
impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> UniverseBuilder<'a, 'b, A> { impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> UniverseBuilder<'a, 'b, A> {
#[inline] #[inline]
pub fn add_age(&mut self, age: f64) { pub fn add_age(&mut self, age: f64) {
self.fbb_.push_slot::<f64>(Universe::VT_AGE, age, 0.0); self.fbb_.push_slot::<f64>(Universe::VT_AGE, age, 0.0);
} }
#[inline] #[inline]
pub fn add_galaxies(&mut self, galaxies: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Galaxy<'b >>>>) { pub fn add_galaxies(&mut self, galaxies: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Galaxy<'b >>>>) {
self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Universe::VT_GALAXIES, galaxies); self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Universe::VT_GALAXIES, galaxies);
} }
#[inline] #[inline]
pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> UniverseBuilder<'a, 'b, A> { pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> UniverseBuilder<'a, 'b, A> {
let start = _fbb.start_table(); let start = _fbb.start_table();
@@ -220,7 +204,6 @@ pub mod flatbuffers {
start_: start, start_: start,
} }
} }
#[inline] #[inline]
pub fn finish(self) -> ::flatbuffers::WIPOffset<Universe<'a>> { pub fn finish(self) -> ::flatbuffers::WIPOffset<Universe<'a>> {
let o = self.fbb_.end_table(self.start_); let o = self.fbb_.end_table(self.start_);
@@ -236,87 +219,77 @@ pub mod flatbuffers {
ds.finish() ds.finish()
} }
} }
#[inline]
/// Verifies that a buffer of bytes contains a `Universe` /// Verifies that a buffer of bytes contains a `Universe`
/// and returns it. /// and returns it.
/// Note that verification is still experimental and may not /// Note that verification is still experimental and may not
/// catch every error, or be maximally performant. For the /// catch every error, or be maximally performant. For the
/// previous, unchecked, behavior use /// previous, unchecked, behavior use
/// `root_as_universe_unchecked`. /// `root_as_universe_unchecked`.
#[inline]
pub fn root_as_universe(buf: &[u8]) -> Result<Universe<'_>, ::flatbuffers::InvalidFlatbuffer> { pub fn root_as_universe(buf: &[u8]) -> Result<Universe<'_>, ::flatbuffers::InvalidFlatbuffer> {
::flatbuffers::root::<Universe>(buf) ::flatbuffers::root::<Universe>(buf)
} }
#[inline]
/// Verifies that a buffer of bytes contains a size prefixed /// Verifies that a buffer of bytes contains a size prefixed
/// `Universe` and returns it. /// `Universe` and returns it.
/// Note that verification is still experimental and may not /// Note that verification is still experimental and may not
/// catch every error, or be maximally performant. For the /// catch every error, or be maximally performant. For the
/// previous, unchecked, behavior use /// previous, unchecked, behavior use
/// `size_prefixed_root_as_universe_unchecked`. /// `size_prefixed_root_as_universe_unchecked`.
#[inline]
pub fn size_prefixed_root_as_universe(buf: &[u8]) -> Result<Universe<'_>, ::flatbuffers::InvalidFlatbuffer> { pub fn size_prefixed_root_as_universe(buf: &[u8]) -> Result<Universe<'_>, ::flatbuffers::InvalidFlatbuffer> {
::flatbuffers::size_prefixed_root::<Universe>(buf) ::flatbuffers::size_prefixed_root::<Universe>(buf)
} }
#[inline]
/// Verifies, with the given options, that a buffer of bytes /// Verifies, with the given options, that a buffer of bytes
/// contains a `Universe` and returns it. /// contains a `Universe` and returns it.
/// Note that verification is still experimental and may not /// Note that verification is still experimental and may not
/// catch every error, or be maximally performant. For the /// catch every error, or be maximally performant. For the
/// previous, unchecked, behavior use /// previous, unchecked, behavior use
/// `root_as_universe_unchecked`. /// `root_as_universe_unchecked`.
#[inline]
pub fn root_as_universe_with_opts<'b, 'o>( pub fn root_as_universe_with_opts<'b, 'o>(
opts: &'o ::flatbuffers::VerifierOptions, opts: &'o ::flatbuffers::VerifierOptions,
buf: &'b [u8], buf: &'b [u8],
) -> Result<Universe<'b>, ::flatbuffers::InvalidFlatbuffer> { ) -> Result<Universe<'b>, ::flatbuffers::InvalidFlatbuffer> {
::flatbuffers::root_with_opts::<Universe<'b>>(opts, buf) ::flatbuffers::root_with_opts::<Universe<'b>>(opts, buf)
} }
#[inline]
/// Verifies, with the given verifier options, that a buffer of /// Verifies, with the given verifier options, that a buffer of
/// bytes contains a size prefixed `Universe` and returns /// bytes contains a size prefixed `Universe` and returns
/// it. Note that verification is still experimental and may not /// it. Note that verification is still experimental and may not
/// catch every error, or be maximally performant. For the /// catch every error, or be maximally performant. For the
/// previous, unchecked, behavior use /// previous, unchecked, behavior use
/// `root_as_universe_unchecked`. /// `root_as_universe_unchecked`.
#[inline]
pub fn size_prefixed_root_as_universe_with_opts<'b, 'o>( pub fn size_prefixed_root_as_universe_with_opts<'b, 'o>(
opts: &'o ::flatbuffers::VerifierOptions, opts: &'o ::flatbuffers::VerifierOptions,
buf: &'b [u8], buf: &'b [u8],
) -> Result<Universe<'b>, ::flatbuffers::InvalidFlatbuffer> { ) -> Result<Universe<'b>, ::flatbuffers::InvalidFlatbuffer> {
::flatbuffers::size_prefixed_root_with_opts::<Universe<'b>>(opts, buf) ::flatbuffers::size_prefixed_root_with_opts::<Universe<'b>>(opts, buf)
} }
#[inline]
/// Assumes, without verification, that a buffer of bytes contains a Universe and returns it. /// Assumes, without verification, that a buffer of bytes contains a Universe and returns it.
/// # Safety /// # Safety
/// Callers must trust the given bytes do indeed contain a valid `Universe`. /// Callers must trust the given bytes do indeed contain a valid `Universe`.
#[inline]
pub unsafe fn root_as_universe_unchecked(buf: &[u8]) -> Universe<'_> { pub unsafe fn root_as_universe_unchecked(buf: &[u8]) -> Universe<'_> {
unsafe { ::flatbuffers::root_unchecked::<Universe>(buf) } unsafe { ::flatbuffers::root_unchecked::<Universe>(buf) }
} }
#[inline]
/// Assumes, without verification, that a buffer of bytes contains a size prefixed Universe and returns it. /// Assumes, without verification, that a buffer of bytes contains a size prefixed Universe and returns it.
/// # Safety /// # Safety
/// Callers must trust the given bytes do indeed contain a valid size prefixed `Universe`. /// Callers must trust the given bytes do indeed contain a valid size prefixed `Universe`.
#[inline]
pub unsafe fn size_prefixed_root_as_universe_unchecked(buf: &[u8]) -> Universe<'_> { pub unsafe fn size_prefixed_root_as_universe_unchecked(buf: &[u8]) -> Universe<'_> {
unsafe { ::flatbuffers::size_prefixed_root_unchecked::<Universe>(buf) } unsafe { ::flatbuffers::size_prefixed_root_unchecked::<Universe>(buf) }
} }
#[inline] #[inline]
pub fn finish_universe_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>( pub fn finish_universe_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(
fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>, fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,
root: ::flatbuffers::WIPOffset<Universe<'a>> root: ::flatbuffers::WIPOffset<Universe<'a>>) {
) {
fbb.finish(root, None); fbb.finish(root, None);
} }
#[inline] #[inline]
pub fn finish_size_prefixed_universe_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>( pub fn finish_size_prefixed_universe_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>, root: ::flatbuffers::WIPOffset<Universe<'a>>) {
fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,
root: ::flatbuffers::WIPOffset<Universe<'a>>
) {
fbb.finish_size_prefixed(root, None); fbb.finish_size_prefixed(root, None);
} }
} // pub mod goldens } // pub mod goldens
} // pub mod flatbuffers } // pub mod flatbuffers

View File

@@ -4,7 +4,7 @@
import * as flatbuffers from 'flatbuffers'; import * as flatbuffers from 'flatbuffers';
import { Galaxy } from './galaxy.js'; import { Galaxy } from '../../flatbuffers/goldens/galaxy.js';
export class Universe { export class Universe {

View File

@@ -17,14 +17,16 @@ public struct models_HelloReply: FlatBufferTable, FlatbuffersVectorInitializable
private init(_ t: Table) { _accessor = t } private init(_ t: Table) { _accessor = t }
public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) } public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
private struct VT { private enum VTOFFSET: VOffset {
static let message: VOffset = 4 case message = 4
var v: Int32 { Int32(self.rawValue) }
var p: VOffset { self.rawValue }
} }
public var message: String? { let o = _accessor.offset(VT.message); return o == 0 ? nil : _accessor.string(at: o) } public var message: String? { let o = _accessor.offset(VTOFFSET.message.v); return o == 0 ? nil : _accessor.string(at: o) }
public var messageSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.message) } public var messageSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.message.v) }
public static func startHelloReply(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) } public static func startHelloReply(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
public static func add(message: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: message, at: VT.message) } public static func add(message: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: message, at: VTOFFSET.message.p) }
public static func endHelloReply(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end } public static func endHelloReply(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }
public static func createHelloReply( public static func createHelloReply(
_ fbb: inout FlatBufferBuilder, _ fbb: inout FlatBufferBuilder,
@@ -37,16 +39,16 @@ public struct models_HelloReply: FlatBufferTable, FlatbuffersVectorInitializable
public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable { public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
var _v = try verifier.visitTable(at: position) var _v = try verifier.visitTable(at: position)
try _v.visit(field: VT.message, fieldName: "message", required: false, type: ForwardOffset<String>.self) try _v.visit(field: VTOFFSET.message.p, fieldName: "message", required: false, type: ForwardOffset<String>.self)
_v.finish() _v.finish()
} }
} }
extension models_HelloReply: Encodable { extension models_HelloReply: Encodable {
enum CodingKeys: String, CodingKey { enum CodingKeys: String, CodingKey {
case message = "message" case message = "message"
} }
public func encode(to encoder: Encoder) throws { public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encodeIfPresent(message, forKey: .message) try container.encodeIfPresent(message, forKey: .message)
@@ -62,14 +64,16 @@ public struct models_HelloRequest: FlatBufferTable, FlatbuffersVectorInitializab
private init(_ t: Table) { _accessor = t } private init(_ t: Table) { _accessor = t }
public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) } public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
private struct VT { private enum VTOFFSET: VOffset {
static let name: VOffset = 4 case name = 4
var v: Int32 { Int32(self.rawValue) }
var p: VOffset { self.rawValue }
} }
public var name: String? { let o = _accessor.offset(VT.name); return o == 0 ? nil : _accessor.string(at: o) } public var name: String? { let o = _accessor.offset(VTOFFSET.name.v); return o == 0 ? nil : _accessor.string(at: o) }
public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.name) } public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.name.v) }
public static func startHelloRequest(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) } public static func startHelloRequest(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VT.name) } public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VTOFFSET.name.p) }
public static func endHelloRequest(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end } public static func endHelloRequest(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }
public static func createHelloRequest( public static func createHelloRequest(
_ fbb: inout FlatBufferBuilder, _ fbb: inout FlatBufferBuilder,
@@ -82,16 +86,16 @@ public struct models_HelloRequest: FlatBufferTable, FlatbuffersVectorInitializab
public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable { public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
var _v = try verifier.visitTable(at: position) var _v = try verifier.visitTable(at: position)
try _v.visit(field: VT.name, fieldName: "name", required: false, type: ForwardOffset<String>.self) try _v.visit(field: VTOFFSET.name.p, fieldName: "name", required: false, type: ForwardOffset<String>.self)
_v.finish() _v.finish()
} }
} }
extension models_HelloRequest: Encodable { extension models_HelloRequest: Encodable {
enum CodingKeys: String, CodingKey { enum CodingKeys: String, CodingKey {
case name = "name" case name = "name"
} }
public func encode(to encoder: Encoder) throws { public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encodeIfPresent(name, forKey: .name) try container.encodeIfPresent(name, forKey: .name)

View File

@@ -91,14 +91,6 @@ class Namer {
std::string keyword_prefix; std::string keyword_prefix;
// Suffix used to escape keywords. It is usually "_". // Suffix used to escape keywords. It is usually "_".
std::string keyword_suffix; std::string keyword_suffix;
// The casing used for keywords when escaping. For most languages, keywords
// are case sensitive. PHP is an instance where some keywords are case
// insensitive.
enum class KeywordsCasing {
CaseSensitive,
CaseInsensitive,
};
KeywordsCasing keywords_casing;
// Files. // Files.
@@ -212,16 +204,8 @@ class Namer {
return result; return result;
} }
virtual std::string NormalizeKeywordCase(const std::string& name) const {
if (config_.keywords_casing == Config::KeywordsCasing::CaseInsensitive) {
return ConvertCase(name, Case::kAllLower);
} else {
return name;
}
}
virtual std::string EscapeKeyword(const std::string& name) const { virtual std::string EscapeKeyword(const std::string& name) const {
if (keywords_.find(NormalizeKeywordCase(name)) == keywords_.end()) { if (keywords_.find(name) == keywords_.end()) {
return name; return name;
} else { } else {
return config_.keyword_prefix + name + config_.keyword_suffix; return config_.keyword_prefix + name + config_.keyword_suffix;

View File

@@ -26,7 +26,6 @@ static const Namer::Config kConfig = {
/*object_suffix=*/"T", /*object_suffix=*/"T",
/*keyword_prefix=*/"", /*keyword_prefix=*/"",
/*keyword_suffix=*/"_", /*keyword_suffix=*/"_",
/*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,
/*filenames=*/Case::kKeep, /*filenames=*/Case::kKeep,
/*directories=*/Case::kKeep, /*directories=*/Case::kKeep,
/*output_path=*/"", /*output_path=*/"",
@@ -50,7 +49,6 @@ static const Namer::Config kStubConfig = {
/*object_suffix=*/"T", /*object_suffix=*/"T",
/*keyword_prefix=*/"", /*keyword_prefix=*/"",
/*keyword_suffix=*/"_", /*keyword_suffix=*/"_",
/*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,
/*filenames=*/Case::kKeep, /*filenames=*/Case::kKeep,
/*directories=*/Case::kKeep, /*directories=*/Case::kKeep,
/*output_path=*/"", /*output_path=*/"",

View File

@@ -260,15 +260,15 @@ inline const char* flatbuffers_version_string() {
inline FLATBUFFERS_CONSTEXPR_CPP11 E operator ~ (E lhs){\ inline FLATBUFFERS_CONSTEXPR_CPP11 E operator ~ (E lhs){\
return E(~T(lhs));\ return E(~T(lhs));\
}\ }\
inline FLATBUFFERS_CONSTEXPR_CPP14 E operator |= (E &lhs, E rhs){\ inline FLATBUFFERS_CONSTEXPR_CPP11 E operator |= (E &lhs, E rhs){\
lhs = lhs | rhs;\ lhs = lhs | rhs;\
return lhs;\ return lhs;\
}\ }\
inline FLATBUFFERS_CONSTEXPR_CPP14 E operator &= (E &lhs, E rhs){\ inline FLATBUFFERS_CONSTEXPR_CPP11 E operator &= (E &lhs, E rhs){\
lhs = lhs & rhs;\ lhs = lhs & rhs;\
return lhs;\ return lhs;\
}\ }\
inline FLATBUFFERS_CONSTEXPR_CPP14 E operator ^= (E &lhs, E rhs){\ inline FLATBUFFERS_CONSTEXPR_CPP11 E operator ^= (E &lhs, E rhs){\
lhs = lhs ^ rhs;\ lhs = lhs ^ rhs;\
return lhs;\ return lhs;\
}\ }\

View File

@@ -1207,20 +1207,11 @@ class Builder FLATBUFFERS_FINAL_CLASS {
String(str); String(str);
} }
size_t AlignedBlob(const void* data, size_t len, BitWidth alignment) {
// The requested alignment must not be smaller than the one required to
// store the length.
return CreateAlignedBlob(data, len, 0, FBT_BLOB,
std::max(alignment, WidthU(len)));
}
size_t AlignedBlob(const std::vector<uint8_t>& v, BitWidth alignment) {
return AlignedBlob(v.data(), v.size(), alignment);
}
size_t Blob(const void* data, size_t len) { size_t Blob(const void* data, size_t len) {
return CreateBlob(data, len, 0, FBT_BLOB); return CreateBlob(data, len, 0, FBT_BLOB);
} }
size_t Blob(const std::vector<uint8_t>& v) { size_t Blob(const std::vector<uint8_t>& v) {
return Blob(v.data(), v.size()); return CreateBlob(v.data(), v.size(), 0, FBT_BLOB);
} }
void Blob(const char* key, const void* data, size_t len) { void Blob(const char* key, const void* data, size_t len) {
@@ -1702,16 +1693,11 @@ class Builder FLATBUFFERS_FINAL_CLASS {
size_t CreateBlob(const void* data, size_t len, size_t trailing, Type type) { size_t CreateBlob(const void* data, size_t len, size_t trailing, Type type) {
auto bit_width = WidthU(len); auto bit_width = WidthU(len);
return CreateAlignedBlob(data, len, trailing, type, bit_width); auto byte_width = Align(bit_width);
}
size_t CreateAlignedBlob(const void* data, size_t len, size_t trailing,
Type type, BitWidth alignment) {
auto byte_width = Align(alignment);
Write<uint64_t>(len, byte_width); Write<uint64_t>(len, byte_width);
auto sloc = buf_.size(); auto sloc = buf_.size();
WriteBytes(data, len + trailing); WriteBytes(data, len + trailing);
stack_.push_back(Value(static_cast<uint64_t>(sloc), type, alignment)); stack_.push_back(Value(static_cast<uint64_t>(sloc), type, bit_width));
return sloc; return sloc;
} }

View File

@@ -223,7 +223,7 @@ struct Type {
uint16_t fixed_length; // only set if t == BASE_TYPE_ARRAY uint16_t fixed_length; // only set if t == BASE_TYPE_ARRAY
}; };
// Represents a parsed scalar value, its type, and field offset. // Represents a parsed scalar value, it's type, and field offset.
struct Value { struct Value {
Value() Value()
: constant("0"), : constant("0"),
@@ -395,20 +395,13 @@ struct FieldDef : public Definition {
}; };
struct StructDef : public Definition { struct StructDef : public Definition {
enum class CycleStatus {
NotChecked,
InProgress,
Checked,
};
StructDef() StructDef()
: fixed(false), : fixed(false),
predecl(true), predecl(true),
sortbysize(true), sortbysize(true),
has_key(false), has_key(false),
minalign(1), minalign(1),
bytesize(0), bytesize(0) {}
cycle_status{CycleStatus::NotChecked} {}
void PadLastField(size_t min_align) { void PadLastField(size_t min_align) {
auto padding = PaddingBytes(bytesize, min_align); auto padding = PaddingBytes(bytesize, min_align);
@@ -430,8 +423,6 @@ struct StructDef : public Definition {
size_t minalign; // What the whole object needs to be aligned to. size_t minalign; // What the whole object needs to be aligned to.
size_t bytesize; // Size if fixed. size_t bytesize; // Size if fixed.
CycleStatus cycle_status; // used for determining if we have circular references
flatbuffers::unique_ptr<std::string> original_location; flatbuffers::unique_ptr<std::string> original_location;
std::vector<voffset_t> reserved_ids; std::vector<voffset_t> reserved_ids;
}; };
@@ -743,7 +734,6 @@ struct IDLOptions {
bool python_gen_numpy; bool python_gen_numpy;
bool ts_omit_entrypoint; bool ts_omit_entrypoint;
bool ts_undefined_for_optionals;
ProtoIdGapAction proto_id_gap_action; ProtoIdGapAction proto_id_gap_action;
// Possible options for the more general generator below. // Possible options for the more general generator below.
@@ -870,7 +860,6 @@ struct IDLOptions {
python_typing(false), python_typing(false),
python_gen_numpy(true), python_gen_numpy(true),
ts_omit_entrypoint(false), ts_omit_entrypoint(false),
ts_undefined_for_optionals(false),
proto_id_gap_action(ProtoIdGapAction::WARNING), proto_id_gap_action(ProtoIdGapAction::WARNING),
mini_reflect(IDLOptions::kNone), mini_reflect(IDLOptions::kNone),
require_explicit_ids(false), require_explicit_ids(false),
@@ -1110,8 +1099,6 @@ class Parser : public ParserState {
// others includes. // others includes.
std::vector<IncludedFile> GetIncludedFiles() const; std::vector<IncludedFile> GetIncludedFiles() const;
bool HasCircularStructDependency();
private: private:
class ParseDepthGuard; class ParseDepthGuard;

View File

@@ -30,21 +30,23 @@ namespace flatbuffers {
// ------------------------- GETTERS ------------------------- // ------------------------- GETTERS -------------------------
constexpr bool IsScalar(reflection::BaseType t) { inline bool IsScalar(reflection::BaseType t) {
return t >= reflection::UType && t <= reflection::Double; return t >= reflection::UType && t <= reflection::Double;
} }
constexpr bool IsInteger(reflection::BaseType t) { inline bool IsInteger(reflection::BaseType t) {
return t >= reflection::UType && t <= reflection::ULong; return t >= reflection::UType && t <= reflection::ULong;
} }
constexpr bool IsFloat(reflection::BaseType t) { inline bool IsFloat(reflection::BaseType t) {
return t == reflection::Float || t == reflection::Double; return t == reflection::Float || t == reflection::Double;
} }
constexpr bool IsLong(reflection::BaseType t) { inline bool IsLong(reflection::BaseType t) {
return t == reflection::Long || t == reflection::ULong; return t == reflection::Long || t == reflection::ULong;
} }
// Size of a basic type, don't use with structs.
inline size_t GetTypeSize(reflection::BaseType base_type) {
// This needs to correspond to the BaseType enum. // This needs to correspond to the BaseType enum.
constexpr size_t kBaseTypeSize[] = { static size_t sizes[] = {
0, // None 0, // None
1, // UType 1, // UType
1, // Bool 1, // Bool
@@ -68,14 +70,10 @@ constexpr size_t kBaseTypeSize[] = {
0 // MaxBaseType. This must be kept the last entry in this array. 0 // MaxBaseType. This must be kept the last entry in this array.
}; };
static_assert(sizeof(kBaseTypeSize) / sizeof(size_t) == static_assert(sizeof(sizes) / sizeof(size_t) == reflection::MaxBaseType + 1,
reflection::MaxBaseType + 1,
"Size of sizes[] array does not match the count of BaseType " "Size of sizes[] array does not match the count of BaseType "
"enum values."); "enum values.");
return sizes[base_type];
// Size of a basic type, don't use with structs.
constexpr size_t GetTypeSize(reflection::BaseType base_type) {
return kBaseTypeSize[base_type];
} }
// Same as above, but now correctly returns the size of a struct if // Same as above, but now correctly returns the size of a struct if
@@ -422,7 +420,7 @@ pointer_inside_vector<T, U> piv(T* ptr, std::vector<U>& vec) {
return pointer_inside_vector<T, U>(ptr, vec); return pointer_inside_vector<T, U>(ptr, vec);
} }
constexpr const char* UnionTypeFieldSuffix() { return "_type"; } inline const char* UnionTypeFieldSuffix() { return "_type"; }
// Helper to figure out the actual table type a union refers to. // Helper to figure out the actual table type a union refers to.
inline const reflection::Object& GetUnionType( inline const reflection::Object& GetUnionType(

View File

@@ -14,12 +14,9 @@
* limitations under the License. * limitations under the License.
*/ */
@file:Suppress("NOTHING_TO_INLINE") @file:Suppress("NOTHING_TO_INLINE")
@file:OptIn(ExperimentalNativeApi::class)
package com.google.flatbuffers.kotlin package com.google.flatbuffers.kotlin
import kotlin.experimental.ExperimentalNativeApi
/** /**
* This implementation assumes that of native macOSX64 the byte order of the implementation is * This implementation assumes that of native macOSX64 the byte order of the implementation is
* Little Endian. * Little Endian.

View File

@@ -296,62 +296,25 @@ function mt:Slot(slotnum)
self.currentVTable[slotnum + 1] = self:Offset() self.currentVTable[slotnum + 1] = self:Offset()
end end
local function finish(self, rootTable, sizePrefix, fileIdentifier) local function finish(self, rootTable, sizePrefix)
UOffsetT:EnforceNumber(rootTable) UOffsetT:EnforceNumber(rootTable)
local hasFid = fileIdentifier ~= nil self:Prep(self.minalign, sizePrefix and 8 or 4)
if hasFid then self:PrependUOffsetTRelative(rootTable)
assert(#fileIdentifier == 4, "File identifier must be exactly 4 bytes")
end
local fid_byte_count = (hasFid and 4 or 0)
-- alignment:
-- root offset (4)
-- optional file id (4)
-- optional size prefix (4)
self:Prep(
self.minalign,
(sizePrefix and 4 or 0) +
4 +
fid_byte_count
)
-- root offset (points past file identifier if present)
self:PrependUOffsetTRelative(rootTable + fid_byte_count)
-- file identifier
if hasFid then
for i = 4, 1, -1 do
self:PrependByte(string.byte(fileIdentifier, i))
end
end
-- size prefix
if sizePrefix then if sizePrefix then
local size = self.bytes.size - self.head local size = self.bytes.size - self.head
Int32:EnforceNumber(size) Int32:EnforceNumber(size)
self:PrependInt32(size) self:PrependInt32(size)
end end
self.finished = true self.finished = true
return self.head return self.head
end end
function mt:Finish(rootTable) function mt:Finish(rootTable)
return finish(self, rootTable, false, nil) return finish(self, rootTable, false)
end end
function mt:FinishSizePrefixed(rootTable) function mt:FinishSizePrefixed(rootTable)
return finish(self, rootTable, true, nil) return finish(self, rootTable, true)
end
function mt:FinishWithIdentifier(rootTable, fileIdentifier)
return finish(self, rootTable, false, fileIdentifier)
end
function mt:FinishSizePrefixedWithIdentifier(rootTable, fileIdentifier)
return finish(self, rootTable, true, fileIdentifier)
end end
function mt:Prepend(flags, off) function mt:Prepend(flags, off)

View File

@@ -438,6 +438,7 @@ namespace Google.FlatBuffers
if (off > Offset) if (off > Offset)
throw new ArgumentException(); throw new ArgumentException();
if (off != 0)
off = Offset - off + sizeof(int); off = Offset - off + sizeof(int);
PutInt(off); PutInt(off);
} }

View File

@@ -65,7 +65,11 @@ namespace Google.FlatBuffers
// Create a .NET String from UTF-8 data stored inside the flatbuffer. // Create a .NET String from UTF-8 data stored inside the flatbuffer.
public string __string(int offset) public string __string(int offset)
{ {
offset += bb.GetInt(offset); int stringOffset = bb.GetInt(offset);
if (stringOffset == 0)
return null;
offset += stringOffset;
var len = bb.GetInt(offset); var len = bb.GetInt(offset);
var startPos = offset + sizeof(int); var startPos = offset + sizeof(int);
return bb.GetStringUTF8(startPos, len); return bb.GetStringUTF8(startPos, len);
@@ -146,7 +150,7 @@ namespace Google.FlatBuffers
var pos = this.__vector(o); var pos = this.__vector(o);
var len = this.__vector_len(o); var len = this.__vector_len(o);
return bb.ToArray<T>(pos, len * ByteBuffer.SizeOf<T>()); return bb.ToArray<T>(pos, len);
} }
// Initialize any Table-derived type to point to the union at the given offset. // Initialize any Table-derived type to point to the union at the given offset.

44
pnpm-lock.yaml generated
View File

@@ -33,12 +33,6 @@ importers:
specifier: ^8.34.1 specifier: ^8.34.1
version: 8.34.1(eslint@9.29.0)(typescript@5.8.3) version: 8.34.1(eslint@9.29.0)(typescript@5.8.3)
tests/ts:
dependencies:
flatbuffers:
specifier: workspace:*
version: link:../..
packages: packages:
'@esbuild/aix-ppc64@0.25.5': '@esbuild/aix-ppc64@0.25.5':
@@ -349,8 +343,8 @@ packages:
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
hasBin: true hasBin: true
ajv@6.14.0: ajv@6.12.6:
resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
ansi-styles@4.3.0: ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
@@ -489,8 +483,8 @@ packages:
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
engines: {node: '>=16'} engines: {node: '>=16'}
flatted@3.4.2: flatted@3.3.1:
resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
glob-parent@5.1.2: glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
@@ -577,11 +571,11 @@ packages:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'} engines: {node: '>=8.6'}
minimatch@3.1.5: minimatch@3.1.2:
resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
minimatch@9.0.9: minimatch@9.0.5:
resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'} engines: {node: '>=16 || 14 >=14.17'}
ms@2.1.3: ms@2.1.3:
@@ -799,7 +793,7 @@ snapshots:
dependencies: dependencies:
'@eslint/object-schema': 2.1.6 '@eslint/object-schema': 2.1.6
debug: 4.3.7 debug: 4.3.7
minimatch: 3.1.5 minimatch: 3.1.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -815,14 +809,14 @@ snapshots:
'@eslint/eslintrc@3.3.1': '@eslint/eslintrc@3.3.1':
dependencies: dependencies:
ajv: 6.14.0 ajv: 6.12.6
debug: 4.3.7 debug: 4.3.7
espree: 10.4.0 espree: 10.4.0
globals: 14.0.0 globals: 14.0.0
ignore: 5.3.2 ignore: 5.3.2
import-fresh: 3.3.0 import-fresh: 3.3.0
js-yaml: 4.1.1 js-yaml: 4.1.1
minimatch: 3.1.5 minimatch: 3.1.2
strip-json-comments: 3.1.1 strip-json-comments: 3.1.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -938,7 +932,7 @@ snapshots:
debug: 4.3.7 debug: 4.3.7
fast-glob: 3.3.2 fast-glob: 3.3.2
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.9 minimatch: 9.0.5
semver: 7.6.3 semver: 7.6.3
ts-api-utils: 2.1.0(typescript@5.8.3) ts-api-utils: 2.1.0(typescript@5.8.3)
typescript: 5.8.3 typescript: 5.8.3
@@ -967,7 +961,7 @@ snapshots:
acorn@8.15.0: {} acorn@8.15.0: {}
ajv@6.14.0: ajv@6.12.6:
dependencies: dependencies:
fast-deep-equal: 3.1.3 fast-deep-equal: 3.1.3
fast-json-stable-stringify: 2.1.0 fast-json-stable-stringify: 2.1.0
@@ -1076,7 +1070,7 @@ snapshots:
'@humanwhocodes/retry': 0.4.3 '@humanwhocodes/retry': 0.4.3
'@types/estree': 1.0.8 '@types/estree': 1.0.8
'@types/json-schema': 7.0.15 '@types/json-schema': 7.0.15
ajv: 6.14.0 ajv: 6.12.6
chalk: 4.1.2 chalk: 4.1.2
cross-spawn: 7.0.6 cross-spawn: 7.0.6
debug: 4.3.7 debug: 4.3.7
@@ -1095,7 +1089,7 @@ snapshots:
is-glob: 4.0.3 is-glob: 4.0.3
json-stable-stringify-without-jsonify: 1.0.1 json-stable-stringify-without-jsonify: 1.0.1
lodash.merge: 4.6.2 lodash.merge: 4.6.2
minimatch: 3.1.5 minimatch: 3.1.2
natural-compare: 1.4.0 natural-compare: 1.4.0
optionator: 0.9.4 optionator: 0.9.4
transitivePeerDependencies: transitivePeerDependencies:
@@ -1152,10 +1146,10 @@ snapshots:
flat-cache@4.0.1: flat-cache@4.0.1:
dependencies: dependencies:
flatted: 3.4.2 flatted: 3.3.1
keyv: 4.5.4 keyv: 4.5.4
flatted@3.4.2: {} flatted@3.3.1: {}
glob-parent@5.1.2: glob-parent@5.1.2:
dependencies: dependencies:
@@ -1224,11 +1218,11 @@ snapshots:
braces: 3.0.3 braces: 3.0.3
picomatch: 2.3.1 picomatch: 2.3.1
minimatch@3.1.5: minimatch@3.1.2:
dependencies: dependencies:
brace-expansion: 1.1.12 brace-expansion: 1.1.12
minimatch@9.0.9: minimatch@9.0.5:
dependencies: dependencies:
brace-expansion: 2.0.2 brace-expansion: 2.0.2

View File

@@ -1,2 +0,0 @@
packages:
- tests/ts

View File

@@ -422,6 +422,7 @@ class Builder(object):
off2 = self.Offset() - off + N.UOffsetTFlags.bytewidth off2 = self.Offset() - off + N.UOffsetTFlags.bytewidth
self.PlaceUOffsetT(off2) self.PlaceUOffsetT(off2)
## @cond FLATBUFFERS_INTERNAL
def StartVector(self, elemSize, numElems, alignment): def StartVector(self, elemSize, numElems, alignment):
"""StartVector initializes bookkeeping for writing a new vector. """StartVector initializes bookkeeping for writing a new vector.
@@ -437,6 +438,8 @@ class Builder(object):
self.Prep(alignment, elemSize * numElems) # In case alignment > int. self.Prep(alignment, elemSize * numElems) # In case alignment > int.
return self.Offset() return self.Offset()
## @endcond
def EndVector(self, numElems=None): def EndVector(self, numElems=None):
"""EndVector writes data necessary to finish vector construction.""" """EndVector writes data necessary to finish vector construction."""
@@ -553,21 +556,6 @@ class Builder(object):
self.vectorNumElems = x.size self.vectorNumElems = x.size
return self.EndVector() return self.EndVector()
def CreateVectorOfTables(self, offsets):
"""CreateVectorOfTables writes a vector of offsets such as tables or strings.
Args:
offsets: Iterable of offsets returned from previous builder operations.
Each element should be an integer compatible with UOffsetT.
"""
offsets = list(offsets)
self.StartVector(N.UOffsetTFlags.bytewidth, len(offsets),
N.UOffsetTFlags.bytewidth)
for off in reversed(offsets):
self.PrependUOffsetTRelative(off)
return self.EndVector()
## @cond FLATBUFFERS_INTERNAL ## @cond FLATBUFFERS_INTERNAL
def assertNested(self): def assertNested(self):
"""Check that we are in the process of building an object.""" """Check that we are in the process of building an object."""

View File

@@ -155,12 +155,6 @@ def EnumStartValuesVector(builder, numElems):
def StartValuesVector(builder, numElems): def StartValuesVector(builder, numElems):
return EnumStartValuesVector(builder, numElems) return EnumStartValuesVector(builder, numElems)
def EnumCreateValuesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateValuesVector(builder, data):
return EnumCreateValuesVector(builder, data)
def EnumAddIsUnion(builder, isUnion): def EnumAddIsUnion(builder, isUnion):
builder.PrependBoolSlot(2, isUnion, 0) builder.PrependBoolSlot(2, isUnion, 0)
@@ -185,12 +179,6 @@ def EnumStartAttributesVector(builder, numElems):
def StartAttributesVector(builder, numElems): def StartAttributesVector(builder, numElems):
return EnumStartAttributesVector(builder, numElems) return EnumStartAttributesVector(builder, numElems)
def EnumCreateAttributesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateAttributesVector(builder, data):
return EnumCreateAttributesVector(builder, data)
def EnumAddDocumentation(builder, documentation): def EnumAddDocumentation(builder, documentation):
builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0) builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)
@@ -203,12 +191,6 @@ def EnumStartDocumentationVector(builder, numElems):
def StartDocumentationVector(builder, numElems): def StartDocumentationVector(builder, numElems):
return EnumStartDocumentationVector(builder, numElems) return EnumStartDocumentationVector(builder, numElems)
def EnumCreateDocumentationVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateDocumentationVector(builder, data):
return EnumCreateDocumentationVector(builder, data)
def EnumAddDeclarationFile(builder, declarationFile): def EnumAddDeclarationFile(builder, declarationFile):
builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(declarationFile), 0) builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(declarationFile), 0)

View File

@@ -134,12 +134,6 @@ def EnumValStartDocumentationVector(builder, numElems):
def StartDocumentationVector(builder, numElems): def StartDocumentationVector(builder, numElems):
return EnumValStartDocumentationVector(builder, numElems) return EnumValStartDocumentationVector(builder, numElems)
def EnumValCreateDocumentationVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateDocumentationVector(builder, data):
return EnumValCreateDocumentationVector(builder, data)
def EnumValAddAttributes(builder, attributes): def EnumValAddAttributes(builder, attributes):
builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(attributes), 0) builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(attributes), 0)
@@ -152,12 +146,6 @@ def EnumValStartAttributesVector(builder, numElems):
def StartAttributesVector(builder, numElems): def StartAttributesVector(builder, numElems):
return EnumValStartAttributesVector(builder, numElems) return EnumValStartAttributesVector(builder, numElems)
def EnumValCreateAttributesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateAttributesVector(builder, data):
return EnumValCreateAttributesVector(builder, data)
def EnumValEnd(builder): def EnumValEnd(builder):
return builder.EndObject() return builder.EndObject()

View File

@@ -235,12 +235,6 @@ def FieldStartAttributesVector(builder, numElems):
def StartAttributesVector(builder, numElems): def StartAttributesVector(builder, numElems):
return FieldStartAttributesVector(builder, numElems) return FieldStartAttributesVector(builder, numElems)
def FieldCreateAttributesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateAttributesVector(builder, data):
return FieldCreateAttributesVector(builder, data)
def FieldAddDocumentation(builder, documentation): def FieldAddDocumentation(builder, documentation):
builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0) builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)
@@ -253,12 +247,6 @@ def FieldStartDocumentationVector(builder, numElems):
def StartDocumentationVector(builder, numElems): def StartDocumentationVector(builder, numElems):
return FieldStartDocumentationVector(builder, numElems) return FieldStartDocumentationVector(builder, numElems)
def FieldCreateDocumentationVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateDocumentationVector(builder, data):
return FieldCreateDocumentationVector(builder, data)
def FieldAddOptional(builder, optional): def FieldAddOptional(builder, optional):
builder.PrependBoolSlot(11, optional, 0) builder.PrependBoolSlot(11, optional, 0)

View File

@@ -158,12 +158,6 @@ def ObjectStartFieldsVector(builder, numElems):
def StartFieldsVector(builder, numElems): def StartFieldsVector(builder, numElems):
return ObjectStartFieldsVector(builder, numElems) return ObjectStartFieldsVector(builder, numElems)
def ObjectCreateFieldsVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateFieldsVector(builder, data):
return ObjectCreateFieldsVector(builder, data)
def ObjectAddIsStruct(builder, isStruct): def ObjectAddIsStruct(builder, isStruct):
builder.PrependBoolSlot(2, isStruct, 0) builder.PrependBoolSlot(2, isStruct, 0)
@@ -194,12 +188,6 @@ def ObjectStartAttributesVector(builder, numElems):
def StartAttributesVector(builder, numElems): def StartAttributesVector(builder, numElems):
return ObjectStartAttributesVector(builder, numElems) return ObjectStartAttributesVector(builder, numElems)
def ObjectCreateAttributesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateAttributesVector(builder, data):
return ObjectCreateAttributesVector(builder, data)
def ObjectAddDocumentation(builder, documentation): def ObjectAddDocumentation(builder, documentation):
builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0) builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)
@@ -212,12 +200,6 @@ def ObjectStartDocumentationVector(builder, numElems):
def StartDocumentationVector(builder, numElems): def StartDocumentationVector(builder, numElems):
return ObjectStartDocumentationVector(builder, numElems) return ObjectStartDocumentationVector(builder, numElems)
def ObjectCreateDocumentationVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateDocumentationVector(builder, data):
return ObjectCreateDocumentationVector(builder, data)
def ObjectAddDeclarationFile(builder, declarationFile): def ObjectAddDeclarationFile(builder, declarationFile):
builder.PrependUOffsetTRelativeSlot(7, flatbuffers.number_types.UOffsetTFlags.py_type(declarationFile), 0) builder.PrependUOffsetTRelativeSlot(7, flatbuffers.number_types.UOffsetTFlags.py_type(declarationFile), 0)

View File

@@ -138,12 +138,6 @@ def RPCCallStartAttributesVector(builder, numElems):
def StartAttributesVector(builder, numElems): def StartAttributesVector(builder, numElems):
return RPCCallStartAttributesVector(builder, numElems) return RPCCallStartAttributesVector(builder, numElems)
def RPCCallCreateAttributesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateAttributesVector(builder, data):
return RPCCallCreateAttributesVector(builder, data)
def RPCCallAddDocumentation(builder, documentation): def RPCCallAddDocumentation(builder, documentation):
builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0) builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)
@@ -156,12 +150,6 @@ def RPCCallStartDocumentationVector(builder, numElems):
def StartDocumentationVector(builder, numElems): def StartDocumentationVector(builder, numElems):
return RPCCallStartDocumentationVector(builder, numElems) return RPCCallStartDocumentationVector(builder, numElems)
def RPCCallCreateDocumentationVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateDocumentationVector(builder, data):
return RPCCallCreateDocumentationVector(builder, data)
def RPCCallEnd(builder): def RPCCallEnd(builder):
return builder.EndObject() return builder.EndObject()

View File

@@ -180,12 +180,6 @@ def SchemaStartObjectsVector(builder, numElems):
def StartObjectsVector(builder, numElems): def StartObjectsVector(builder, numElems):
return SchemaStartObjectsVector(builder, numElems) return SchemaStartObjectsVector(builder, numElems)
def SchemaCreateObjectsVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateObjectsVector(builder, data):
return SchemaCreateObjectsVector(builder, data)
def SchemaAddEnums(builder, enums): def SchemaAddEnums(builder, enums):
builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(enums), 0) builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(enums), 0)
@@ -198,12 +192,6 @@ def SchemaStartEnumsVector(builder, numElems):
def StartEnumsVector(builder, numElems): def StartEnumsVector(builder, numElems):
return SchemaStartEnumsVector(builder, numElems) return SchemaStartEnumsVector(builder, numElems)
def SchemaCreateEnumsVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateEnumsVector(builder, data):
return SchemaCreateEnumsVector(builder, data)
def SchemaAddFileIdent(builder, fileIdent): def SchemaAddFileIdent(builder, fileIdent):
builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(fileIdent), 0) builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(fileIdent), 0)
@@ -234,12 +222,6 @@ def SchemaStartServicesVector(builder, numElems):
def StartServicesVector(builder, numElems): def StartServicesVector(builder, numElems):
return SchemaStartServicesVector(builder, numElems) return SchemaStartServicesVector(builder, numElems)
def SchemaCreateServicesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateServicesVector(builder, data):
return SchemaCreateServicesVector(builder, data)
def SchemaAddAdvancedFeatures(builder, advancedFeatures): def SchemaAddAdvancedFeatures(builder, advancedFeatures):
builder.PrependUint64Slot(6, advancedFeatures, 0) builder.PrependUint64Slot(6, advancedFeatures, 0)
@@ -258,12 +240,6 @@ def SchemaStartFbsFilesVector(builder, numElems):
def StartFbsFilesVector(builder, numElems): def StartFbsFilesVector(builder, numElems):
return SchemaStartFbsFilesVector(builder, numElems) return SchemaStartFbsFilesVector(builder, numElems)
def SchemaCreateFbsFilesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateFbsFilesVector(builder, data):
return SchemaCreateFbsFilesVector(builder, data)
def SchemaEnd(builder): def SchemaEnd(builder):
return builder.EndObject() return builder.EndObject()

View File

@@ -84,12 +84,6 @@ def SchemaFileStartIncludedFilenamesVector(builder, numElems):
def StartIncludedFilenamesVector(builder, numElems): def StartIncludedFilenamesVector(builder, numElems):
return SchemaFileStartIncludedFilenamesVector(builder, numElems) return SchemaFileStartIncludedFilenamesVector(builder, numElems)
def SchemaFileCreateIncludedFilenamesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateIncludedFilenamesVector(builder, data):
return SchemaFileCreateIncludedFilenamesVector(builder, data)
def SchemaFileEnd(builder): def SchemaFileEnd(builder):
return builder.EndObject() return builder.EndObject()

View File

@@ -137,12 +137,6 @@ def ServiceStartCallsVector(builder, numElems):
def StartCallsVector(builder, numElems): def StartCallsVector(builder, numElems):
return ServiceStartCallsVector(builder, numElems) return ServiceStartCallsVector(builder, numElems)
def ServiceCreateCallsVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateCallsVector(builder, data):
return ServiceCreateCallsVector(builder, data)
def ServiceAddAttributes(builder, attributes): def ServiceAddAttributes(builder, attributes):
builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(attributes), 0) builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(attributes), 0)
@@ -155,12 +149,6 @@ def ServiceStartAttributesVector(builder, numElems):
def StartAttributesVector(builder, numElems): def StartAttributesVector(builder, numElems):
return ServiceStartAttributesVector(builder, numElems) return ServiceStartAttributesVector(builder, numElems)
def ServiceCreateAttributesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateAttributesVector(builder, data):
return ServiceCreateAttributesVector(builder, data)
def ServiceAddDocumentation(builder, documentation): def ServiceAddDocumentation(builder, documentation):
builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0) builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(documentation), 0)
@@ -173,12 +161,6 @@ def ServiceStartDocumentationVector(builder, numElems):
def StartDocumentationVector(builder, numElems): def StartDocumentationVector(builder, numElems):
return ServiceStartDocumentationVector(builder, numElems) return ServiceStartDocumentationVector(builder, numElems)
def ServiceCreateDocumentationVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateDocumentationVector(builder, data):
return ServiceCreateDocumentationVector(builder, data)
def ServiceAddDeclarationFile(builder, declarationFile): def ServiceAddDeclarationFile(builder, declarationFile):
builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(declarationFile), 0) builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(declarationFile), 0)

View File

@@ -1,2 +1,6 @@
[bdist_wheel]
universal=1
[metadata] [metadata]
license_files = LICENSE license_files =
../LICENSE

View File

@@ -32,8 +32,10 @@ setup(
description='The FlatBuffers serialization format for Python', description='The FlatBuffers serialization format for Python',
classifiers=[ classifiers=[
'Intended Audience :: Developers', 'Intended Audience :: Developers',
'License :: OSI Approved :: Apache Software License',
'Operating System :: OS Independent', 'Operating System :: OS Independent',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: Software Development :: Libraries :: Python Modules',
], ],

View File

@@ -24,9 +24,6 @@ use core::marker::PhantomData;
use core::ops::{Add, AddAssign, Deref, DerefMut, Index, IndexMut, Sub, SubAssign}; use core::ops::{Add, AddAssign, Deref, DerefMut, Index, IndexMut, Sub, SubAssign};
use core::ptr::write_bytes; use core::ptr::write_bytes;
#[cfg(feature = "std")]
use std::collections::HashMap;
use crate::endian_scalar::emplace_scalar; use crate::endian_scalar::emplace_scalar;
use crate::primitives::*; use crate::primitives::*;
use crate::push::{Push, PushAlignment}; use crate::push::{Push, PushAlignment};
@@ -142,9 +139,6 @@ pub struct FlatBufferBuilder<'fbb, A: Allocator = DefaultAllocator> {
min_align: usize, min_align: usize,
force_defaults: bool, force_defaults: bool,
#[cfg(feature = "std")]
strings_pool: HashMap<String, WIPOffset<&'fbb str>>,
#[cfg(not(feature = "std"))]
strings_pool: Vec<WIPOffset<&'fbb str>>, strings_pool: Vec<WIPOffset<&'fbb str>>,
_phantom: PhantomData<&'fbb ()>, _phantom: PhantomData<&'fbb ()>,
@@ -166,60 +160,6 @@ impl<'fbb> FlatBufferBuilder<'fbb, DefaultAllocator> {
pub fn with_capacity(size: usize) -> Self { pub fn with_capacity(size: usize) -> Self {
Self::from_vec(vec![0; size]) Self::from_vec(vec![0; size])
} }
/// Create a FlatBufferBuilder that is ready for writing, with a
/// ready-to-use capacity of the provided size and preallocated internal vecs.
///
/// The maximum valid value for `size` is `FLATBUFFERS_MAX_BUFFER_SIZE`.
///
/// # Arguments
///
/// * `size` - The initial capacity of the backing buffer in bytes.
/// * `field_locs_capacity` - Preallocated capacity for the field locations vec.
/// * `written_vtable_revpos_capacity` - Preallocated capacity for the written vtable reverse positions vec.
/// * `strings_pool_capacity` - Preallocated capacity for the shared strings pool vec.
pub fn with_internal_capacity(
size: usize,
field_locs_capacity: usize,
written_vtable_revpos_capacity: usize,
strings_pool_capacity: usize,
) -> Self {
Self::from_vec_with_internal_capacity(
vec![0; size],
field_locs_capacity,
written_vtable_revpos_capacity,
strings_pool_capacity,
)
}
/// Create a FlatBufferBuilder that is ready for writing, reusing
/// an existing vector and preallocated internal vecs.
///
/// # Arguments
///
/// * `buffer` - An existing `Vec<u8>` to reuse as the backing buffer.
/// * `field_locs_capacity` - Preallocated capacity for the field locations vec.
/// * `written_vtable_revpos_capacity` - Preallocated capacity for the written vtable reverse positions vec.
/// * `strings_pool_capacity` - Preallocated capacity for the shared strings pool vec.
pub fn from_vec_with_internal_capacity(
buffer: Vec<u8>,
field_locs_capacity: usize,
written_vtable_revpos_capacity: usize,
strings_pool_capacity: usize,
) -> Self {
// we need to check the size here because we create the backing buffer
// directly, bypassing the typical way of using grow_allocator:
assert!(
buffer.len() <= FLATBUFFERS_MAX_BUFFER_SIZE,
"cannot initialize buffer bigger than 2 gigabytes"
);
let allocator = DefaultAllocator::from_vec(buffer);
Self::new_in_with_internal_capacity(
allocator,
field_locs_capacity,
written_vtable_revpos_capacity,
strings_pool_capacity,
)
}
/// Create a FlatBufferBuilder that is ready for writing, reusing /// Create a FlatBufferBuilder that is ready for writing, reusing
/// an existing vector. /// an existing vector.
pub fn from_vec(buffer: Vec<u8>) -> Self { pub fn from_vec(buffer: Vec<u8>) -> Self {
@@ -257,52 +197,12 @@ impl<'fbb, A: Allocator> FlatBufferBuilder<'fbb, A> {
min_align: 0, min_align: 0,
force_defaults: false, force_defaults: false,
#[cfg(feature = "std")]
strings_pool: HashMap::new(),
#[cfg(not(feature = "std"))]
strings_pool: Vec::new(), strings_pool: Vec::new(),
_phantom: PhantomData, _phantom: PhantomData,
} }
} }
/// Create a [`FlatBufferBuilder`] that is ready for writing with a custom [`Allocator`]
/// and preallocated internal vecs.
///
/// # Arguments
///
/// * `allocator` - A custom [`Allocator`] to use as the backing buffer.
/// * `field_locs_capacity` - Preallocated capacity for the field locations vec.
/// * `written_vtable_revpos_capacity` - Preallocated capacity for the written vtable reverse positions vec.
/// * `strings_pool_capacity` - Preallocated capacity for the shared strings pool vec.
pub fn new_in_with_internal_capacity(
allocator: A,
field_locs_capacity: usize,
written_vtable_revpos_capacity: usize,
strings_pool_capacity: usize,
) -> Self {
let head = ReverseIndex::end();
FlatBufferBuilder {
allocator,
head,
field_locs: Vec::with_capacity(field_locs_capacity),
written_vtable_revpos: Vec::with_capacity(written_vtable_revpos_capacity),
nested: false,
finished: false,
min_align: 0,
force_defaults: false,
#[cfg(feature = "std")]
strings_pool: HashMap::with_capacity(strings_pool_capacity),
#[cfg(not(feature = "std"))]
strings_pool: Vec::with_capacity(strings_pool_capacity),
_phantom: PhantomData,
}
}
/// Destroy the [`FlatBufferBuilder`], returning its [`Allocator`] and the index /// Destroy the [`FlatBufferBuilder`], returning its [`Allocator`] and the index
/// into it that represents the start of valid data. /// into it that represents the start of valid data.
pub fn collapse_in(self) -> (A, usize) { pub fn collapse_in(self) -> (A, usize) {
@@ -323,9 +223,7 @@ impl<'fbb, A: Allocator> FlatBufferBuilder<'fbb, A> {
/// new object. /// new object.
pub fn reset(&mut self) { pub fn reset(&mut self) {
// memset only the part of the buffer that could be dirty: // memset only the part of the buffer that could be dirty:
self.allocator[self.head.range_to_end()] self.allocator[self.head.range_to_end()].iter_mut().for_each(|x| *x = 0);
.iter_mut()
.for_each(|x| *x = 0);
self.head = ReverseIndex::end(); self.head = ReverseIndex::end();
self.written_vtable_revpos.clear(); self.written_vtable_revpos.clear();
@@ -445,31 +343,6 @@ impl<'fbb, A: Allocator> FlatBufferBuilder<'fbb, A> {
WIPOffset::new(o.value()) WIPOffset::new(o.value())
} }
/// Create a utf8 string, and de-duplicate if already created.
///
/// Uses a HashMap to track previously written strings, providing O(1)
/// amortized lookup and insertion.
#[cfg(feature = "std")]
#[inline]
pub fn create_shared_string<'a: 'b, 'b>(&'a mut self, s: &'b str) -> WIPOffset<&'fbb str> {
self.assert_not_nested(
"create_shared_string can not be called when a table or vector is under construction",
);
if let Some(&offset) = self.strings_pool.get(s) {
return offset;
}
let address = WIPOffset::new(self.create_byte_string(s.as_bytes()).value());
self.strings_pool.insert(s.to_owned(), address);
address
}
/// Create a utf8 string, and de-duplicate if already created.
///
/// Uses a sorted Vec with binary search to track previously written
/// strings when in `no_std` mode.
#[cfg(not(feature = "std"))]
#[inline] #[inline]
pub fn create_shared_string<'a: 'b, 'b>(&'a mut self, s: &'b str) -> WIPOffset<&'fbb str> { pub fn create_shared_string<'a: 'b, 'b>(&'a mut self, s: &'b str) -> WIPOffset<&'fbb str> {
self.assert_not_nested( self.assert_not_nested(
@@ -482,15 +355,19 @@ impl<'fbb, A: Allocator> FlatBufferBuilder<'fbb, A> {
let found = self.strings_pool.binary_search_by(|offset| { let found = self.strings_pool.binary_search_by(|offset| {
let ptr = offset.value() as usize; let ptr = offset.value() as usize;
// Gets The pointer to the size of the string
let str_memory = &buf[buf.len() - ptr..]; let str_memory = &buf[buf.len() - ptr..];
let size = u32::from_le_bytes([ // Gets the size of the written string from buffer
str_memory[0], let size =
str_memory[1], u32::from_le_bytes([str_memory[0], str_memory[1], str_memory[2], str_memory[3]])
str_memory[2], as usize;
str_memory[3], // Size of the string size
]) as usize; let string_size: usize = 4;
let stored = &str_memory[4..4 + size]; // Fetches actual string bytes from index of string after string size
stored.cmp(s.as_bytes()) // to the size of string plus string size
let iter = str_memory[string_size..size + string_size].iter();
// Compares bytes of fetched string and current writable string
iter.cloned().cmp(s.bytes())
}); });
match found { match found {
@@ -734,8 +611,6 @@ impl<'fbb, A: Allocator> FlatBufferBuilder<'fbb, A> {
// Write the VTable (we may delete it afterwards, if it is a duplicate): // Write the VTable (we may delete it afterwards, if it is a duplicate):
let vt_start_pos = self.head; let vt_start_pos = self.head;
let vt_end_pos = self.head + vtable_byte_len; let vt_end_pos = self.head + vtable_byte_len;
// Zero out the vtable space - make_space only reserves but doesn't initialize
self.allocator[vt_start_pos.range_to(vt_end_pos)].fill(0);
{ {
// write the vtable header: // write the vtable header:
let vtfw = let vtfw =
@@ -1054,33 +929,6 @@ impl<T> IndexMut<ReverseIndexRange> for [T] {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use core::sync::atomic::{AtomicUsize, Ordering};
use std::alloc::{GlobalAlloc, Layout, System};
static ALLOC_COUNT: AtomicUsize = AtomicUsize::new(0);
struct CountingAllocator;
unsafe impl GlobalAlloc for CountingAllocator {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
ALLOC_COUNT.fetch_add(1, Ordering::Relaxed);
unsafe { System.alloc(layout) }
}
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
unsafe { System.dealloc(ptr, layout) }
}
}
#[global_allocator]
static GLOBAL: CountingAllocator = CountingAllocator;
fn reset_alloc_count() {
ALLOC_COUNT.store(0, Ordering::Relaxed);
}
fn alloc_count() -> usize {
ALLOC_COUNT.load(Ordering::Relaxed)
}
#[test] #[test]
fn reverse_index_test() { fn reverse_index_test() {
@@ -1090,43 +938,4 @@ mod tests {
assert_eq!(&buf[idx.range_to(idx + 1)], &[4]); assert_eq!(&buf[idx.range_to(idx + 1)], &[4]);
assert_eq!(idx.to_forward_index(&buf), 4); assert_eq!(idx.to_forward_index(&buf), 4);
} }
#[test]
fn with_internal_capacity_preallocates_vecs() {
let mut builder = FlatBufferBuilder::with_internal_capacity(64, 8, 16, 32);
assert!(builder.allocator.len() >= 64);
assert!(builder.field_locs.capacity() >= 8);
assert!(builder.written_vtable_revpos.capacity() >= 16);
assert!(builder.strings_pool.capacity() >= 32);
assert!(builder.field_locs.is_empty());
assert!(builder.written_vtable_revpos.is_empty());
assert!(builder.strings_pool.is_empty());
// Reset the allocation counter after builder construction
reset_alloc_count();
// Add a shared string and verify it lands in the pool
let s1 = builder.create_shared_string("hello");
assert_eq!(builder.strings_pool.len(), 1);
// Adding the same string again should reuse the pooled entry
let s2 = builder.create_shared_string("hello");
assert_eq!(builder.strings_pool.len(), 1);
assert_eq!(s1.value(), s2.value());
// A different string should add a new entry
let _s3 = builder.create_shared_string("world");
assert_eq!(builder.strings_pool.len(), 2);
// With sufficient preallocated capacity, no additional allocations
// should have occurred for the internal vecs during the operations above
let allocs = alloc_count();
assert_eq!(
allocs, 0,
"expected 0 allocations after builder construction, got {}",
allocs
);
}
} }

View File

@@ -107,20 +107,6 @@ impl<'a, T: Follow<'a> + 'a> Vector<'a, T> {
key: K, key: K,
f: fn(&<T as Follow<'a>>::Inner, &K) -> Ordering, f: fn(&<T as Follow<'a>>::Inner, &K) -> Ordering,
) -> Option<T::Inner> { ) -> Option<T::Inner> {
self.lookup_index_by_key(key, f).map(|idx| self.get(idx))
}
/// Binary search by key, returning the index of the matching element.
///
/// This is similar to `lookup_by_key`, but returns the index of the found
/// element rather than the element itself. This is useful when you need
/// to reference elements by their position in the vector.
#[inline(always)]
pub fn lookup_index_by_key<K: Ord>(
&self,
key: K,
f: fn(&<T as Follow<'a>>::Inner, &K) -> Ordering,
) -> Option<usize> {
if self.is_empty() { if self.is_empty() {
return None; return None;
} }
@@ -132,7 +118,7 @@ impl<'a, T: Follow<'a> + 'a> Vector<'a, T> {
let mid = (left + right) / 2; let mid = (left + right) / 2;
let value = self.get(mid); let value = self.get(mid);
match f(&value, &key) { match f(&value, &key) {
Ordering::Equal => return Some(mid), Ordering::Equal => return Some(value),
Ordering::Less => left = mid + 1, Ordering::Less => left = mid + 1,
Ordering::Greater => { Ordering::Greater => {
if mid == 0 { if mid == 0 {

View File

@@ -421,9 +421,6 @@ impl<'a> Serializer for MapKeySerializer<'a> {
type SerializeStruct = Impossible<(), Error>; type SerializeStruct = Impossible<(), Error>;
type SerializeStructVariant = Impossible<(), Error>; type SerializeStructVariant = Impossible<(), Error>;
fn is_human_readable(&self) -> bool {
self.0.is_human_readable()
}
fn serialize_bool(self, _value: bool) -> Result<(), Error> { fn serialize_bool(self, _value: bool) -> Result<(), Error> {
key_must_be_a_string() key_must_be_a_string()
} }

View File

@@ -643,7 +643,7 @@ inline ::flatbuffers::Offset<Monster> Monster::Pack(::flatbuffers::FlatBufferBui
auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name); auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name);
auto _inventory = _o->inventory.size() ? _fbb.CreateVector(_o->inventory) : 0; auto _inventory = _o->inventory.size() ? _fbb.CreateVector(_o->inventory) : 0;
auto _color = _o->color; auto _color = _o->color;
auto _weapons = _o->weapons.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Sample::Weapon>> (_o->weapons.size(), [](size_t i, _VectorArgs *__va) { return MyGame::Sample::CreateWeapon(*__va->__fbb, __va->__o->weapons[i].get(), __va->__rehasher); }, &_va ) : 0; auto _weapons = _o->weapons.size() ? _fbb.CreateVector<::flatbuffers::Offset<MyGame::Sample::Weapon>> (_o->weapons.size(), [](size_t i, _VectorArgs *__va) { return CreateWeapon(*__va->__fbb, __va->__o->weapons[i].get(), __va->__rehasher); }, &_va ) : 0;
auto _equipped_type = _o->equipped.type; auto _equipped_type = _o->equipped.type;
auto _equipped = _o->equipped.Pack(_fbb); auto _equipped = _o->equipped.Pack(_fbb);
auto _path = _o->path.size() ? _fbb.CreateVectorOfStructs(_o->path) : 0; auto _path = _o->path.size() ? _fbb.CreateVectorOfStructs(_o->path) : 0;

View File

@@ -113,12 +113,12 @@ public struct MyGame_Sample_Vec3: NativeStruct, FlatbuffersVectorInitializable,
} }
extension MyGame_Sample_Vec3: Encodable { extension MyGame_Sample_Vec3: Encodable {
enum CodingKeys: String, CodingKey { enum CodingKeys: String, CodingKey {
case x = "x" case x = "x"
case y = "y" case y = "y"
case z = "z" case z = "z"
} }
public func encode(to encoder: Encoder) throws { public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
if x != 0.0 { if x != 0.0 {
@@ -170,49 +170,51 @@ public struct MyGame_Sample_Monster: FlatBufferTable, FlatbuffersVectorInitializ
private init(_ t: Table) { _accessor = t } private init(_ t: Table) { _accessor = t }
public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) } public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
private struct VT { private enum VTOFFSET: VOffset {
static let pos: VOffset = 4 case pos = 4
static let mana: VOffset = 6 case mana = 6
static let hp: VOffset = 8 case hp = 8
static let name: VOffset = 10 case name = 10
static let inventory: VOffset = 14 case inventory = 14
static let color: VOffset = 16 case color = 16
static let weapons: VOffset = 18 case weapons = 18
static let equippedType: VOffset = 20 case equippedType = 20
static let equipped: VOffset = 22 case equipped = 22
static let path: VOffset = 24 case path = 24
var v: Int32 { Int32(self.rawValue) }
var p: VOffset { self.rawValue }
} }
public var pos: MyGame_Sample_Vec3? { let o = _accessor.offset(VT.pos); return o == 0 ? nil : _accessor.readBuffer(of: MyGame_Sample_Vec3.self, at: o) } public var pos: MyGame_Sample_Vec3? { let o = _accessor.offset(VTOFFSET.pos.v); return o == 0 ? nil : _accessor.readBuffer(of: MyGame_Sample_Vec3.self, at: o) }
public var mutablePos: MyGame_Sample_Vec3_Mutable? { let o = _accessor.offset(VT.pos); return o == 0 ? nil : MyGame_Sample_Vec3_Mutable(_accessor.bb, o: o + _accessor.position) } public var mutablePos: MyGame_Sample_Vec3_Mutable? { let o = _accessor.offset(VTOFFSET.pos.v); return o == 0 ? nil : MyGame_Sample_Vec3_Mutable(_accessor.bb, o: o + _accessor.position) }
public var mana: Int16 { let o = _accessor.offset(VT.mana); return o == 0 ? 150 : _accessor.readBuffer(of: Int16.self, at: o) } public var mana: Int16 { let o = _accessor.offset(VTOFFSET.mana.v); return o == 0 ? 150 : _accessor.readBuffer(of: Int16.self, at: o) }
@discardableResult public func mutate(mana: Int16) -> Bool {let o = _accessor.offset(VT.mana); return _accessor.mutate(mana, index: o) } @discardableResult public func mutate(mana: Int16) -> Bool {let o = _accessor.offset(VTOFFSET.mana.v); return _accessor.mutate(mana, index: o) }
public var hp: Int16 { let o = _accessor.offset(VT.hp); return o == 0 ? 100 : _accessor.readBuffer(of: Int16.self, at: o) } public var hp: Int16 { let o = _accessor.offset(VTOFFSET.hp.v); return o == 0 ? 100 : _accessor.readBuffer(of: Int16.self, at: o) }
@discardableResult public func mutate(hp: Int16) -> Bool {let o = _accessor.offset(VT.hp); return _accessor.mutate(hp, index: o) } @discardableResult public func mutate(hp: Int16) -> Bool {let o = _accessor.offset(VTOFFSET.hp.v); return _accessor.mutate(hp, index: o) }
public var name: String? { let o = _accessor.offset(VT.name); return o == 0 ? nil : _accessor.string(at: o) } public var name: String? { let o = _accessor.offset(VTOFFSET.name.v); return o == 0 ? nil : _accessor.string(at: o) }
public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.name) } public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.name.v) }
public var inventory: FlatbufferVector<UInt8> { return _accessor.vector(at: VT.inventory, byteSize: 1) } public var inventory: FlatbufferVector<UInt8> { return _accessor.vector(at: VTOFFSET.inventory.v, byteSize: 1) }
public func mutate(inventory: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VT.inventory); return _accessor.directMutate(inventory, index: _accessor.vector(at: o) + index * 1) } public func mutate(inventory: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.inventory.v); return _accessor.directMutate(inventory, index: _accessor.vector(at: o) + index * 1) }
public func withUnsafePointerToInventory<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.inventory, body: body) } public func withUnsafePointerToInventory<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VTOFFSET.inventory.v, body: body) }
public var color: MyGame_Sample_Color { let o = _accessor.offset(VT.color); return o == 0 ? .blue : MyGame_Sample_Color(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? .blue } public var color: MyGame_Sample_Color { let o = _accessor.offset(VTOFFSET.color.v); return o == 0 ? .blue : MyGame_Sample_Color(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? .blue }
@discardableResult public func mutate(color: MyGame_Sample_Color) -> Bool {let o = _accessor.offset(VT.color); return _accessor.mutate(color.rawValue, index: o) } @discardableResult public func mutate(color: MyGame_Sample_Color) -> Bool {let o = _accessor.offset(VTOFFSET.color.v); return _accessor.mutate(color.rawValue, index: o) }
public var weapons: FlatbufferVector<MyGame_Sample_Weapon> { return _accessor.vector(at: VT.weapons, byteSize: 4) } public var weapons: FlatbufferVector<MyGame_Sample_Weapon> { return _accessor.vector(at: VTOFFSET.weapons.v, byteSize: 4) }
public var equippedType: MyGame_Sample_Equipment { let o = _accessor.offset(VT.equippedType); return o == 0 ? .none_ : MyGame_Sample_Equipment(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ } public var equippedType: MyGame_Sample_Equipment { let o = _accessor.offset(VTOFFSET.equippedType.v); return o == 0 ? .none_ : MyGame_Sample_Equipment(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }
public func equipped<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VT.equipped); return o == 0 ? nil : _accessor.union(o) } public func equipped<T: FlatbuffersInitializable>(type: T.Type) -> T? { let o = _accessor.offset(VTOFFSET.equipped.v); return o == 0 ? nil : _accessor.union(o) }
public var path: FlatbufferVector<MyGame_Sample_Vec3> { return _accessor.vector(at: VT.path, byteSize: 12) } public var path: FlatbufferVector<MyGame_Sample_Vec3> { return _accessor.vector(at: VTOFFSET.path.v, byteSize: 12) }
public var mutablePath: FlatbufferVector<MyGame_Sample_Vec3_Mutable> { return _accessor.vector(at: VT.path, byteSize: 12) } public var mutablePath: FlatbufferVector<MyGame_Sample_Vec3_Mutable> { return _accessor.vector(at: VTOFFSET.path.v, byteSize: 12) }
public func withUnsafePointerToPath<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VT.path, body: body) } public func withUnsafePointerToPath<T>(_ body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return try _accessor.withUnsafePointerToSlice(at: VTOFFSET.path.v, body: body) }
public static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 11) } public static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 11) }
public static func add(pos: MyGame_Sample_Vec3?, _ fbb: inout FlatBufferBuilder) { guard let pos = pos else { return }; fbb.create(struct: pos, position: VT.pos) } public static func add(pos: MyGame_Sample_Vec3?, _ fbb: inout FlatBufferBuilder) { guard let pos = pos else { return }; fbb.create(struct: pos, position: VTOFFSET.pos.p) }
public static func add(mana: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: mana, def: 150, at: VT.mana) } public static func add(mana: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: mana, def: 150, at: VTOFFSET.mana.p) }
public static func add(hp: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: hp, def: 100, at: VT.hp) } public static func add(hp: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: hp, def: 100, at: VTOFFSET.hp.p) }
public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VT.name) } public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VTOFFSET.name.p) }
public static func addVectorOf(inventory: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: inventory, at: VT.inventory) } public static func addVectorOf(inventory: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: inventory, at: VTOFFSET.inventory.p) }
public static func add(color: MyGame_Sample_Color, _ fbb: inout FlatBufferBuilder) { fbb.add(element: color.rawValue, def: 2, at: VT.color) } public static func add(color: MyGame_Sample_Color, _ fbb: inout FlatBufferBuilder) { fbb.add(element: color.rawValue, def: 2, at: VTOFFSET.color.p) }
public static func addVectorOf(weapons: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: weapons, at: VT.weapons) } public static func addVectorOf(weapons: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: weapons, at: VTOFFSET.weapons.p) }
public static func add(equippedType: MyGame_Sample_Equipment, _ fbb: inout FlatBufferBuilder) { fbb.add(element: equippedType.rawValue, def: 0, at: VT.equippedType) } public static func add(equippedType: MyGame_Sample_Equipment, _ fbb: inout FlatBufferBuilder) { fbb.add(element: equippedType.rawValue, def: 0, at: VTOFFSET.equippedType.p) }
public static func add(equipped: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: equipped, at: VT.equipped) } public static func add(equipped: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: equipped, at: VTOFFSET.equipped.p) }
public static func addVectorOf(path: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: path, at: VT.path) } public static func addVectorOf(path: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: path, at: VTOFFSET.path.p) }
public static func startVectorOfPath(_ size: Int, in builder: inout FlatBufferBuilder) { public static func startVectorOfPath(_ size: Int, in builder: inout FlatBufferBuilder) {
builder.startVector(size * MemoryLayout<MyGame_Sample_Vec3>.size, elementSize: MemoryLayout<MyGame_Sample_Vec3>.alignment) builder.startVector(size * MemoryLayout<MyGame_Sample_Vec3>.size, elementSize: MemoryLayout<MyGame_Sample_Vec3>.alignment)
} }
@@ -291,14 +293,14 @@ public struct MyGame_Sample_Monster: FlatBufferTable, FlatbuffersVectorInitializ
public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable { public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
var _v = try verifier.visitTable(at: position) var _v = try verifier.visitTable(at: position)
try _v.visit(field: VT.pos, fieldName: "pos", required: false, type: MyGame_Sample_Vec3.self) try _v.visit(field: VTOFFSET.pos.p, fieldName: "pos", required: false, type: MyGame_Sample_Vec3.self)
try _v.visit(field: VT.mana, fieldName: "mana", required: false, type: Int16.self) try _v.visit(field: VTOFFSET.mana.p, fieldName: "mana", required: false, type: Int16.self)
try _v.visit(field: VT.hp, fieldName: "hp", required: false, type: Int16.self) try _v.visit(field: VTOFFSET.hp.p, fieldName: "hp", required: false, type: Int16.self)
try _v.visit(field: VT.name, fieldName: "name", required: false, type: ForwardOffset<String>.self) try _v.visit(field: VTOFFSET.name.p, fieldName: "name", required: false, type: ForwardOffset<String>.self)
try _v.visit(field: VT.inventory, fieldName: "inventory", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self) try _v.visit(field: VTOFFSET.inventory.p, fieldName: "inventory", required: false, type: ForwardOffset<Vector<UInt8, UInt8>>.self)
try _v.visit(field: VT.color, fieldName: "color", required: false, type: MyGame_Sample_Color.self) try _v.visit(field: VTOFFSET.color.p, fieldName: "color", required: false, type: MyGame_Sample_Color.self)
try _v.visit(field: VT.weapons, fieldName: "weapons", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Sample_Weapon>, MyGame_Sample_Weapon>>.self) try _v.visit(field: VTOFFSET.weapons.p, fieldName: "weapons", required: false, type: ForwardOffset<Vector<ForwardOffset<MyGame_Sample_Weapon>, MyGame_Sample_Weapon>>.self)
try _v.visit(unionKey: VT.equippedType, unionField: VT.equipped, unionKeyName: "equippedType", fieldName: "equipped", required: false, completion: { (verifier, key: MyGame_Sample_Equipment, pos) in try _v.visit(unionKey: VTOFFSET.equippedType.p, unionField: VTOFFSET.equipped.p, unionKeyName: "equippedType", fieldName: "equipped", required: false, completion: { (verifier, key: MyGame_Sample_Equipment, pos) in
switch key { switch key {
case .none_: case .none_:
break // NOTE - SWIFT doesnt support none break // NOTE - SWIFT doesnt support none
@@ -306,12 +308,13 @@ public struct MyGame_Sample_Monster: FlatBufferTable, FlatbuffersVectorInitializ
try ForwardOffset<MyGame_Sample_Weapon>.verify(&verifier, at: pos, of: MyGame_Sample_Weapon.self) try ForwardOffset<MyGame_Sample_Weapon>.verify(&verifier, at: pos, of: MyGame_Sample_Weapon.self)
} }
}) })
try _v.visit(field: VT.path, fieldName: "path", required: false, type: ForwardOffset<Vector<MyGame_Sample_Vec3, MyGame_Sample_Vec3>>.self) try _v.visit(field: VTOFFSET.path.p, fieldName: "path", required: false, type: ForwardOffset<Vector<MyGame_Sample_Vec3, MyGame_Sample_Vec3>>.self)
_v.finish() _v.finish()
} }
} }
extension MyGame_Sample_Monster: Encodable { extension MyGame_Sample_Monster: Encodable {
enum CodingKeys: String, CodingKey { enum CodingKeys: String, CodingKey {
case pos = "pos" case pos = "pos"
case mana = "mana" case mana = "mana"
@@ -324,7 +327,6 @@ extension MyGame_Sample_Monster: Encodable {
case equipped = "equipped" case equipped = "equipped"
case path = "path" case path = "path"
} }
public func encode(to encoder: Encoder) throws { public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encodeIfPresent(pos, forKey: .pos) try container.encodeIfPresent(pos, forKey: .pos)
@@ -409,18 +411,20 @@ public struct MyGame_Sample_Weapon: FlatBufferTable, FlatbuffersVectorInitializa
private init(_ t: Table) { _accessor = t } private init(_ t: Table) { _accessor = t }
public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) } public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
private struct VT { private enum VTOFFSET: VOffset {
static let name: VOffset = 4 case name = 4
static let damage: VOffset = 6 case damage = 6
var v: Int32 { Int32(self.rawValue) }
var p: VOffset { self.rawValue }
} }
public var name: String? { let o = _accessor.offset(VT.name); return o == 0 ? nil : _accessor.string(at: o) } public var name: String? { let o = _accessor.offset(VTOFFSET.name.v); return o == 0 ? nil : _accessor.string(at: o) }
public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VT.name) } public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.name.v) }
public var damage: Int16 { let o = _accessor.offset(VT.damage); return o == 0 ? 0 : _accessor.readBuffer(of: Int16.self, at: o) } public var damage: Int16 { let o = _accessor.offset(VTOFFSET.damage.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int16.self, at: o) }
@discardableResult public func mutate(damage: Int16) -> Bool {let o = _accessor.offset(VT.damage); return _accessor.mutate(damage, index: o) } @discardableResult public func mutate(damage: Int16) -> Bool {let o = _accessor.offset(VTOFFSET.damage.v); return _accessor.mutate(damage, index: o) }
public static func startWeapon(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 2) } public static func startWeapon(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 2) }
public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VT.name) } public static func add(name: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VTOFFSET.name.p) }
public static func add(damage: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: damage, def: 0, at: VT.damage) } public static func add(damage: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: damage, def: 0, at: VTOFFSET.damage.p) }
public static func endWeapon(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end } public static func endWeapon(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset { let end = Offset(offset: fbb.endTable(at: start)); return end }
public static func createWeapon( public static func createWeapon(
_ fbb: inout FlatBufferBuilder, _ fbb: inout FlatBufferBuilder,
@@ -457,18 +461,18 @@ public struct MyGame_Sample_Weapon: FlatBufferTable, FlatbuffersVectorInitializa
public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable { public static func verify<T>(_ verifier: inout Verifier, at position: Int, of type: T.Type) throws where T: Verifiable {
var _v = try verifier.visitTable(at: position) var _v = try verifier.visitTable(at: position)
try _v.visit(field: VT.name, fieldName: "name", required: false, type: ForwardOffset<String>.self) try _v.visit(field: VTOFFSET.name.p, fieldName: "name", required: false, type: ForwardOffset<String>.self)
try _v.visit(field: VT.damage, fieldName: "damage", required: false, type: Int16.self) try _v.visit(field: VTOFFSET.damage.p, fieldName: "damage", required: false, type: Int16.self)
_v.finish() _v.finish()
} }
} }
extension MyGame_Sample_Weapon: Encodable { extension MyGame_Sample_Weapon: Encodable {
enum CodingKeys: String, CodingKey { enum CodingKeys: String, CodingKey {
case name = "name" case name = "name"
case damage = "damage" case damage = "damage"
} }
public func encode(to encoder: Encoder) throws { public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encodeIfPresent(name, forKey: .name) try container.encodeIfPresent(name, forKey: .name)

View File

@@ -2,13 +2,10 @@
// @generated // @generated
extern crate alloc; extern crate alloc;
use super::*; use super::*;
#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] #[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")]
pub const ENUM_MIN_COLOR: i8 = 0; pub const ENUM_MIN_COLOR: i8 = 0;
#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] #[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")]
pub const ENUM_MAX_COLOR: i8 = 2; pub const ENUM_MAX_COLOR: i8 = 2;
#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] #[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
pub const ENUM_VALUES_COLOR: [Color; 3] = [ pub const ENUM_VALUES_COLOR: [Color; 3] = [
@@ -20,7 +17,6 @@ pub const ENUM_VALUES_COLOR: [Color; 3] = [
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[repr(transparent)] #[repr(transparent)]
pub struct Color(pub i8); pub struct Color(pub i8);
#[allow(non_upper_case_globals)] #[allow(non_upper_case_globals)]
impl Color { impl Color {
pub const Red: Self = Self(0); pub const Red: Self = Self(0);
@@ -34,7 +30,6 @@ impl Color {
Self::Green, Self::Green,
Self::Blue, Self::Blue,
]; ];
/// Returns the variant's name or "" if unknown. /// Returns the variant's name or "" if unknown.
pub fn variant_name(self) -> Option<&'static str> { pub fn variant_name(self) -> Option<&'static str> {
match self { match self {
@@ -45,7 +40,6 @@ impl Color {
} }
} }
} }
impl ::core::fmt::Debug for Color { impl ::core::fmt::Debug for Color {
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
if let Some(name) = self.variant_name() { if let Some(name) = self.variant_name() {
@@ -55,10 +49,8 @@ impl ::core::fmt::Debug for Color {
} }
} }
} }
impl<'a> ::flatbuffers::Follow<'a> for Color { impl<'a> ::flatbuffers::Follow<'a> for Color {
type Inner = Self; type Inner = Self;
#[inline] #[inline]
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
let b = unsafe { ::flatbuffers::read_scalar_at::<i8>(buf, loc) }; let b = unsafe { ::flatbuffers::read_scalar_at::<i8>(buf, loc) };
@@ -68,7 +60,6 @@ impl<'a> ::flatbuffers::Follow<'a> for Color {
impl ::flatbuffers::Push for Color { impl ::flatbuffers::Push for Color {
type Output = Color; type Output = Color;
#[inline] #[inline]
unsafe fn push(&self, dst: &mut [u8], _written_len: usize) { unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {
unsafe { ::flatbuffers::emplace_scalar::<i8>(dst, self.0) }; unsafe { ::flatbuffers::emplace_scalar::<i8>(dst, self.0) };
@@ -77,12 +68,10 @@ impl ::flatbuffers::Push for Color {
impl ::flatbuffers::EndianScalar for Color { impl ::flatbuffers::EndianScalar for Color {
type Scalar = i8; type Scalar = i8;
#[inline] #[inline]
fn to_little_endian(self) -> i8 { fn to_little_endian(self) -> i8 {
self.0.to_le() self.0.to_le()
} }
#[inline] #[inline]
#[allow(clippy::wrong_self_convention)] #[allow(clippy::wrong_self_convention)]
fn from_little_endian(v: i8) -> Self { fn from_little_endian(v: i8) -> Self {

View File

@@ -2,13 +2,10 @@
// @generated // @generated
extern crate alloc; extern crate alloc;
use super::*; use super::*;
#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] #[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")]
pub const ENUM_MIN_EQUIPMENT: u8 = 0; pub const ENUM_MIN_EQUIPMENT: u8 = 0;
#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] #[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")]
pub const ENUM_MAX_EQUIPMENT: u8 = 1; pub const ENUM_MAX_EQUIPMENT: u8 = 1;
#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] #[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
pub const ENUM_VALUES_EQUIPMENT: [Equipment; 2] = [ pub const ENUM_VALUES_EQUIPMENT: [Equipment; 2] = [
@@ -19,7 +16,6 @@ pub const ENUM_VALUES_EQUIPMENT: [Equipment; 2] = [
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[repr(transparent)] #[repr(transparent)]
pub struct Equipment(pub u8); pub struct Equipment(pub u8);
#[allow(non_upper_case_globals)] #[allow(non_upper_case_globals)]
impl Equipment { impl Equipment {
pub const NONE: Self = Self(0); pub const NONE: Self = Self(0);
@@ -31,7 +27,6 @@ impl Equipment {
Self::NONE, Self::NONE,
Self::Weapon, Self::Weapon,
]; ];
/// Returns the variant's name or "" if unknown. /// Returns the variant's name or "" if unknown.
pub fn variant_name(self) -> Option<&'static str> { pub fn variant_name(self) -> Option<&'static str> {
match self { match self {
@@ -41,7 +36,6 @@ impl Equipment {
} }
} }
} }
impl ::core::fmt::Debug for Equipment { impl ::core::fmt::Debug for Equipment {
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
if let Some(name) = self.variant_name() { if let Some(name) = self.variant_name() {
@@ -51,10 +45,8 @@ impl ::core::fmt::Debug for Equipment {
} }
} }
} }
impl<'a> ::flatbuffers::Follow<'a> for Equipment { impl<'a> ::flatbuffers::Follow<'a> for Equipment {
type Inner = Self; type Inner = Self;
#[inline] #[inline]
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) }; let b = unsafe { ::flatbuffers::read_scalar_at::<u8>(buf, loc) };
@@ -64,7 +56,6 @@ impl<'a> ::flatbuffers::Follow<'a> for Equipment {
impl ::flatbuffers::Push for Equipment { impl ::flatbuffers::Push for Equipment {
type Output = Equipment; type Output = Equipment;
#[inline] #[inline]
unsafe fn push(&self, dst: &mut [u8], _written_len: usize) { unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {
unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) }; unsafe { ::flatbuffers::emplace_scalar::<u8>(dst, self.0) };
@@ -73,12 +64,10 @@ impl ::flatbuffers::Push for Equipment {
impl ::flatbuffers::EndianScalar for Equipment { impl ::flatbuffers::EndianScalar for Equipment {
type Scalar = u8; type Scalar = u8;
#[inline] #[inline]
fn to_little_endian(self) -> u8 { fn to_little_endian(self) -> u8 {
self.0.to_le() self.0.to_le()
} }
#[inline] #[inline]
#[allow(clippy::wrong_self_convention)] #[allow(clippy::wrong_self_convention)]
fn from_little_endian(v: u8) -> Self { fn from_little_endian(v: u8) -> Self {
@@ -97,7 +86,6 @@ impl<'a> ::flatbuffers::Verifiable for Equipment {
} }
impl ::flatbuffers::SimpleToVerifyInSlice for Equipment {} impl ::flatbuffers::SimpleToVerifyInSlice for Equipment {}
pub struct EquipmentUnionTableOffset {} pub struct EquipmentUnionTableOffset {}
#[allow(clippy::upper_case_acronyms)] #[allow(clippy::upper_case_acronyms)]
@@ -107,13 +95,11 @@ pub enum EquipmentT {
NONE, NONE,
Weapon(alloc::boxed::Box<WeaponT>), Weapon(alloc::boxed::Box<WeaponT>),
} }
impl Default for EquipmentT { impl Default for EquipmentT {
fn default() -> Self { fn default() -> Self {
Self::NONE Self::NONE
} }
} }
impl EquipmentT { impl EquipmentT {
pub fn equipment_type(&self) -> Equipment { pub fn equipment_type(&self) -> Equipment {
match self { match self {
@@ -121,14 +107,12 @@ impl EquipmentT {
Self::Weapon(_) => Equipment::Weapon, Self::Weapon(_) => Equipment::Weapon,
} }
} }
pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> { pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut ::flatbuffers::FlatBufferBuilder<'b, A>) -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>> {
match self { match self {
Self::NONE => None, Self::NONE => None,
Self::Weapon(v) => Some(v.pack(fbb).as_union_value()), Self::Weapon(v) => Some(v.pack(fbb).as_union_value()),
} }
} }
/// If the union variant matches, return the owned WeaponT, setting the union to NONE. /// If the union variant matches, return the owned WeaponT, setting the union to NONE.
pub fn take_weapon(&mut self) -> Option<alloc::boxed::Box<WeaponT>> { pub fn take_weapon(&mut self) -> Option<alloc::boxed::Box<WeaponT>> {
if let Self::Weapon(_) = self { if let Self::Weapon(_) = self {
@@ -142,15 +126,12 @@ impl EquipmentT {
None None
} }
} }
/// If the union variant matches, return a reference to the WeaponT. /// If the union variant matches, return a reference to the WeaponT.
pub fn as_weapon(&self) -> Option<&WeaponT> { pub fn as_weapon(&self) -> Option<&WeaponT> {
if let Self::Weapon(v) = self { Some(v.as_ref()) } else { None } if let Self::Weapon(v) = self { Some(v.as_ref()) } else { None }
} }
/// If the union variant matches, return a mutable reference to the WeaponT. /// If the union variant matches, return a mutable reference to the WeaponT.
pub fn as_weapon_mut(&mut self) -> Option<&mut WeaponT> { pub fn as_weapon_mut(&mut self) -> Option<&mut WeaponT> {
if let Self::Weapon(v) = self { Some(v.as_mut()) } else { None } if let Self::Weapon(v) = self { Some(v.as_mut()) } else { None }
} }
} }

View File

@@ -2,17 +2,15 @@
// @generated // @generated
extern crate alloc; extern crate alloc;
use super::*; use super::*;
pub enum MonsterOffset {} pub enum MonsterOffset {}
#[derive(Copy, Clone, PartialEq)] #[derive(Copy, Clone, PartialEq)]
pub struct Monster<'a> { pub struct Monster<'a> {
pub _tab: ::flatbuffers::Table<'a>, pub _tab: ::flatbuffers::Table<'a>,
} }
impl<'a> ::flatbuffers::Follow<'a> for Monster<'a> { impl<'a> ::flatbuffers::Follow<'a> for Monster<'a> {
type Inner = Monster<'a>; type Inner = Monster<'a>;
#[inline] #[inline]
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } } Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }
@@ -39,7 +37,6 @@ impl<'a> Monster<'a> {
pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self { pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {
Monster { _tab: table } Monster { _tab: table }
} }
#[allow(unused_mut)] #[allow(unused_mut)]
pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>( pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(
_fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>, _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,
@@ -107,7 +104,6 @@ impl<'a> Monster<'a> {
// which contains a valid value in this slot // which contains a valid value in this slot
unsafe { self._tab.get::<Vec3>(Monster::VT_POS, None)} unsafe { self._tab.get::<Vec3>(Monster::VT_POS, None)}
} }
#[inline] #[inline]
pub fn mana(&self) -> i16 { pub fn mana(&self) -> i16 {
// Safety: // Safety:
@@ -115,7 +111,6 @@ impl<'a> Monster<'a> {
// which contains a valid value in this slot // which contains a valid value in this slot
unsafe { self._tab.get::<i16>(Monster::VT_MANA, Some(150)).unwrap()} unsafe { self._tab.get::<i16>(Monster::VT_MANA, Some(150)).unwrap()}
} }
#[inline] #[inline]
pub fn hp(&self) -> i16 { pub fn hp(&self) -> i16 {
// Safety: // Safety:
@@ -123,7 +118,6 @@ impl<'a> Monster<'a> {
// which contains a valid value in this slot // which contains a valid value in this slot
unsafe { self._tab.get::<i16>(Monster::VT_HP, Some(100)).unwrap()} unsafe { self._tab.get::<i16>(Monster::VT_HP, Some(100)).unwrap()}
} }
#[inline] #[inline]
pub fn name(&self) -> Option<&'a str> { pub fn name(&self) -> Option<&'a str> {
// Safety: // Safety:
@@ -131,7 +125,6 @@ impl<'a> Monster<'a> {
// which contains a valid value in this slot // which contains a valid value in this slot
unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<&str>>(Monster::VT_NAME, None)} unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<&str>>(Monster::VT_NAME, None)}
} }
#[inline] #[inline]
pub fn inventory(&self) -> Option<::flatbuffers::Vector<'a, u8>> { pub fn inventory(&self) -> Option<::flatbuffers::Vector<'a, u8>> {
// Safety: // Safety:
@@ -139,7 +132,6 @@ impl<'a> Monster<'a> {
// which contains a valid value in this slot // which contains a valid value in this slot
unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u8>>>(Monster::VT_INVENTORY, None)} unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, u8>>>(Monster::VT_INVENTORY, None)}
} }
#[inline] #[inline]
pub fn color(&self) -> Color { pub fn color(&self) -> Color {
// Safety: // Safety:
@@ -147,7 +139,6 @@ impl<'a> Monster<'a> {
// which contains a valid value in this slot // which contains a valid value in this slot
unsafe { self._tab.get::<Color>(Monster::VT_COLOR, Some(Color::Blue)).unwrap()} unsafe { self._tab.get::<Color>(Monster::VT_COLOR, Some(Color::Blue)).unwrap()}
} }
#[inline] #[inline]
pub fn weapons(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Weapon<'a>>>> { pub fn weapons(&self) -> Option<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Weapon<'a>>>> {
// Safety: // Safety:
@@ -155,7 +146,6 @@ impl<'a> Monster<'a> {
// which contains a valid value in this slot // which contains a valid value in this slot
unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Weapon>>>>(Monster::VT_WEAPONS, None)} unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, ::flatbuffers::ForwardsUOffset<Weapon>>>>(Monster::VT_WEAPONS, None)}
} }
#[inline] #[inline]
pub fn equipped_type(&self) -> Equipment { pub fn equipped_type(&self) -> Equipment {
// Safety: // Safety:
@@ -163,7 +153,6 @@ impl<'a> Monster<'a> {
// which contains a valid value in this slot // which contains a valid value in this slot
unsafe { self._tab.get::<Equipment>(Monster::VT_EQUIPPED_TYPE, Some(Equipment::NONE)).unwrap()} unsafe { self._tab.get::<Equipment>(Monster::VT_EQUIPPED_TYPE, Some(Equipment::NONE)).unwrap()}
} }
#[inline] #[inline]
pub fn equipped(&self) -> Option<::flatbuffers::Table<'a>> { pub fn equipped(&self) -> Option<::flatbuffers::Table<'a>> {
// Safety: // Safety:
@@ -171,7 +160,6 @@ impl<'a> Monster<'a> {
// which contains a valid value in this slot // which contains a valid value in this slot
unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(Monster::VT_EQUIPPED, None)} unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Table<'a>>>(Monster::VT_EQUIPPED, None)}
} }
#[inline] #[inline]
pub fn path(&self) -> Option<::flatbuffers::Vector<'a, Vec3>> { pub fn path(&self) -> Option<::flatbuffers::Vector<'a, Vec3>> {
// Safety: // Safety:
@@ -179,7 +167,6 @@ impl<'a> Monster<'a> {
// which contains a valid value in this slot // which contains a valid value in this slot
unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, Vec3>>>(Monster::VT_PATH, None)} unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<::flatbuffers::Vector<'a, Vec3>>>(Monster::VT_PATH, None)}
} }
#[inline] #[inline]
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub fn equipped_as_weapon(&self) -> Option<Weapon<'a>> { pub fn equipped_as_weapon(&self) -> Option<Weapon<'a>> {
@@ -194,6 +181,7 @@ impl<'a> Monster<'a> {
None None
} }
} }
} }
impl ::flatbuffers::Verifiable for Monster<'_> { impl ::flatbuffers::Verifiable for Monster<'_> {
@@ -220,7 +208,6 @@ impl ::flatbuffers::Verifiable for Monster<'_> {
Ok(()) Ok(())
} }
} }
pub struct MonsterArgs<'a> { pub struct MonsterArgs<'a> {
pub pos: Option<&'a Vec3>, pub pos: Option<&'a Vec3>,
pub mana: i16, pub mana: i16,
@@ -233,7 +220,6 @@ pub struct MonsterArgs<'a> {
pub equipped: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>, pub equipped: Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>,
pub path: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, Vec3>>>, pub path: Option<::flatbuffers::WIPOffset<::flatbuffers::Vector<'a, Vec3>>>,
} }
impl<'a> Default for MonsterArgs<'a> { impl<'a> Default for MonsterArgs<'a> {
#[inline] #[inline]
fn default() -> Self { fn default() -> Self {
@@ -256,58 +242,47 @@ pub struct MonsterBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {
fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>, fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,
start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>, start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,
} }
impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> MonsterBuilder<'a, 'b, A> { impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> MonsterBuilder<'a, 'b, A> {
#[inline] #[inline]
pub fn add_pos(&mut self, pos: &Vec3) { pub fn add_pos(&mut self, pos: &Vec3) {
self.fbb_.push_slot_always::<&Vec3>(Monster::VT_POS, pos); self.fbb_.push_slot_always::<&Vec3>(Monster::VT_POS, pos);
} }
#[inline] #[inline]
pub fn add_mana(&mut self, mana: i16) { pub fn add_mana(&mut self, mana: i16) {
self.fbb_.push_slot::<i16>(Monster::VT_MANA, mana, 150); self.fbb_.push_slot::<i16>(Monster::VT_MANA, mana, 150);
} }
#[inline] #[inline]
pub fn add_hp(&mut self, hp: i16) { pub fn add_hp(&mut self, hp: i16) {
self.fbb_.push_slot::<i16>(Monster::VT_HP, hp, 100); self.fbb_.push_slot::<i16>(Monster::VT_HP, hp, 100);
} }
#[inline] #[inline]
pub fn add_name(&mut self, name: ::flatbuffers::WIPOffset<&'b str>) { pub fn add_name(&mut self, name: ::flatbuffers::WIPOffset<&'b str>) {
self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_NAME, name); self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_NAME, name);
} }
#[inline] #[inline]
pub fn add_inventory(&mut self, inventory: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u8>>) { pub fn add_inventory(&mut self, inventory: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , u8>>) {
self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_INVENTORY, inventory); self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_INVENTORY, inventory);
} }
#[inline] #[inline]
pub fn add_color(&mut self, color: Color) { pub fn add_color(&mut self, color: Color) {
self.fbb_.push_slot::<Color>(Monster::VT_COLOR, color, Color::Blue); self.fbb_.push_slot::<Color>(Monster::VT_COLOR, color, Color::Blue);
} }
#[inline] #[inline]
pub fn add_weapons(&mut self, weapons: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Weapon<'b >>>>) { pub fn add_weapons(&mut self, weapons: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , ::flatbuffers::ForwardsUOffset<Weapon<'b >>>>) {
self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_WEAPONS, weapons); self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_WEAPONS, weapons);
} }
#[inline] #[inline]
pub fn add_equipped_type(&mut self, equipped_type: Equipment) { pub fn add_equipped_type(&mut self, equipped_type: Equipment) {
self.fbb_.push_slot::<Equipment>(Monster::VT_EQUIPPED_TYPE, equipped_type, Equipment::NONE); self.fbb_.push_slot::<Equipment>(Monster::VT_EQUIPPED_TYPE, equipped_type, Equipment::NONE);
} }
#[inline] #[inline]
pub fn add_equipped(&mut self, equipped: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) { pub fn add_equipped(&mut self, equipped: ::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>) {
self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_EQUIPPED, equipped); self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_EQUIPPED, equipped);
} }
#[inline] #[inline]
pub fn add_path(&mut self, path: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , Vec3>>) { pub fn add_path(&mut self, path: ::flatbuffers::WIPOffset<::flatbuffers::Vector<'b , Vec3>>) {
self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_PATH, path); self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Monster::VT_PATH, path);
} }
#[inline] #[inline]
pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> MonsterBuilder<'a, 'b, A> { pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> MonsterBuilder<'a, 'b, A> {
let start = _fbb.start_table(); let start = _fbb.start_table();
@@ -316,7 +291,6 @@ impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> MonsterBuilder<'a, 'b, A> {
start_: start, start_: start,
} }
} }
#[inline] #[inline]
pub fn finish(self) -> ::flatbuffers::WIPOffset<Monster<'a>> { pub fn finish(self) -> ::flatbuffers::WIPOffset<Monster<'a>> {
let o = self.fbb_.end_table(self.start_); let o = self.fbb_.end_table(self.start_);
@@ -352,7 +326,6 @@ impl ::core::fmt::Debug for Monster<'_> {
ds.finish() ds.finish()
} }
} }
#[non_exhaustive] #[non_exhaustive]
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
pub struct MonsterT { pub struct MonsterT {
@@ -366,7 +339,6 @@ pub struct MonsterT {
pub equipped: EquipmentT, pub equipped: EquipmentT,
pub path: Option<alloc::vec::Vec<Vec3T>>, pub path: Option<alloc::vec::Vec<Vec3T>>,
} }
impl Default for MonsterT { impl Default for MonsterT {
fn default() -> Self { fn default() -> Self {
Self { Self {
@@ -382,7 +354,6 @@ impl Default for MonsterT {
} }
} }
} }
impl MonsterT { impl MonsterT {
pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>( pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(
&self, &self,
@@ -421,85 +392,74 @@ impl MonsterT {
}) })
} }
} }
#[inline]
/// Verifies that a buffer of bytes contains a `Monster` /// Verifies that a buffer of bytes contains a `Monster`
/// and returns it. /// and returns it.
/// Note that verification is still experimental and may not /// Note that verification is still experimental and may not
/// catch every error, or be maximally performant. For the /// catch every error, or be maximally performant. For the
/// previous, unchecked, behavior use /// previous, unchecked, behavior use
/// `root_as_monster_unchecked`. /// `root_as_monster_unchecked`.
#[inline]
pub fn root_as_monster(buf: &[u8]) -> Result<Monster<'_>, ::flatbuffers::InvalidFlatbuffer> { pub fn root_as_monster(buf: &[u8]) -> Result<Monster<'_>, ::flatbuffers::InvalidFlatbuffer> {
::flatbuffers::root::<Monster>(buf) ::flatbuffers::root::<Monster>(buf)
} }
#[inline]
/// Verifies that a buffer of bytes contains a size prefixed /// Verifies that a buffer of bytes contains a size prefixed
/// `Monster` and returns it. /// `Monster` and returns it.
/// Note that verification is still experimental and may not /// Note that verification is still experimental and may not
/// catch every error, or be maximally performant. For the /// catch every error, or be maximally performant. For the
/// previous, unchecked, behavior use /// previous, unchecked, behavior use
/// `size_prefixed_root_as_monster_unchecked`. /// `size_prefixed_root_as_monster_unchecked`.
#[inline]
pub fn size_prefixed_root_as_monster(buf: &[u8]) -> Result<Monster<'_>, ::flatbuffers::InvalidFlatbuffer> { pub fn size_prefixed_root_as_monster(buf: &[u8]) -> Result<Monster<'_>, ::flatbuffers::InvalidFlatbuffer> {
::flatbuffers::size_prefixed_root::<Monster>(buf) ::flatbuffers::size_prefixed_root::<Monster>(buf)
} }
#[inline]
/// Verifies, with the given options, that a buffer of bytes /// Verifies, with the given options, that a buffer of bytes
/// contains a `Monster` and returns it. /// contains a `Monster` and returns it.
/// Note that verification is still experimental and may not /// Note that verification is still experimental and may not
/// catch every error, or be maximally performant. For the /// catch every error, or be maximally performant. For the
/// previous, unchecked, behavior use /// previous, unchecked, behavior use
/// `root_as_monster_unchecked`. /// `root_as_monster_unchecked`.
#[inline]
pub fn root_as_monster_with_opts<'b, 'o>( pub fn root_as_monster_with_opts<'b, 'o>(
opts: &'o ::flatbuffers::VerifierOptions, opts: &'o ::flatbuffers::VerifierOptions,
buf: &'b [u8], buf: &'b [u8],
) -> Result<Monster<'b>, ::flatbuffers::InvalidFlatbuffer> { ) -> Result<Monster<'b>, ::flatbuffers::InvalidFlatbuffer> {
::flatbuffers::root_with_opts::<Monster<'b>>(opts, buf) ::flatbuffers::root_with_opts::<Monster<'b>>(opts, buf)
} }
#[inline]
/// Verifies, with the given verifier options, that a buffer of /// Verifies, with the given verifier options, that a buffer of
/// bytes contains a size prefixed `Monster` and returns /// bytes contains a size prefixed `Monster` and returns
/// it. Note that verification is still experimental and may not /// it. Note that verification is still experimental and may not
/// catch every error, or be maximally performant. For the /// catch every error, or be maximally performant. For the
/// previous, unchecked, behavior use /// previous, unchecked, behavior use
/// `root_as_monster_unchecked`. /// `root_as_monster_unchecked`.
#[inline]
pub fn size_prefixed_root_as_monster_with_opts<'b, 'o>( pub fn size_prefixed_root_as_monster_with_opts<'b, 'o>(
opts: &'o ::flatbuffers::VerifierOptions, opts: &'o ::flatbuffers::VerifierOptions,
buf: &'b [u8], buf: &'b [u8],
) -> Result<Monster<'b>, ::flatbuffers::InvalidFlatbuffer> { ) -> Result<Monster<'b>, ::flatbuffers::InvalidFlatbuffer> {
::flatbuffers::size_prefixed_root_with_opts::<Monster<'b>>(opts, buf) ::flatbuffers::size_prefixed_root_with_opts::<Monster<'b>>(opts, buf)
} }
#[inline]
/// Assumes, without verification, that a buffer of bytes contains a Monster and returns it. /// Assumes, without verification, that a buffer of bytes contains a Monster and returns it.
/// # Safety /// # Safety
/// Callers must trust the given bytes do indeed contain a valid `Monster`. /// Callers must trust the given bytes do indeed contain a valid `Monster`.
#[inline]
pub unsafe fn root_as_monster_unchecked(buf: &[u8]) -> Monster<'_> { pub unsafe fn root_as_monster_unchecked(buf: &[u8]) -> Monster<'_> {
unsafe { ::flatbuffers::root_unchecked::<Monster>(buf) } unsafe { ::flatbuffers::root_unchecked::<Monster>(buf) }
} }
#[inline]
/// Assumes, without verification, that a buffer of bytes contains a size prefixed Monster and returns it. /// Assumes, without verification, that a buffer of bytes contains a size prefixed Monster and returns it.
/// # Safety /// # Safety
/// Callers must trust the given bytes do indeed contain a valid size prefixed `Monster`. /// Callers must trust the given bytes do indeed contain a valid size prefixed `Monster`.
#[inline]
pub unsafe fn size_prefixed_root_as_monster_unchecked(buf: &[u8]) -> Monster<'_> { pub unsafe fn size_prefixed_root_as_monster_unchecked(buf: &[u8]) -> Monster<'_> {
unsafe { ::flatbuffers::size_prefixed_root_unchecked::<Monster>(buf) } unsafe { ::flatbuffers::size_prefixed_root_unchecked::<Monster>(buf) }
} }
#[inline] #[inline]
pub fn finish_monster_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>( pub fn finish_monster_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(
fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>, fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,
root: ::flatbuffers::WIPOffset<Monster<'a>> root: ::flatbuffers::WIPOffset<Monster<'a>>) {
) {
fbb.finish(root, None); fbb.finish(root, None);
} }
#[inline] #[inline]
pub fn finish_size_prefixed_monster_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>( pub fn finish_size_prefixed_monster_buffer<'a, 'b, A: ::flatbuffers::Allocator + 'a>(fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>, root: ::flatbuffers::WIPOffset<Monster<'a>>) {
fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,
root: ::flatbuffers::WIPOffset<Monster<'a>>
) {
fbb.finish_size_prefixed(root, None); fbb.finish_size_prefixed(root, None);
} }

View File

@@ -2,18 +2,15 @@
// @generated // @generated
extern crate alloc; extern crate alloc;
use super::*; use super::*;
// struct Vec3, aligned to 4 // struct Vec3, aligned to 4
#[repr(transparent)] #[repr(transparent)]
#[derive(Clone, Copy, PartialEq)] #[derive(Clone, Copy, PartialEq)]
pub struct Vec3(pub [u8; 12]); pub struct Vec3(pub [u8; 12]);
impl Default for Vec3 { impl Default for Vec3 {
fn default() -> Self { fn default() -> Self {
Self([0; 12]) Self([0; 12])
} }
} }
impl ::core::fmt::Debug for Vec3 { impl ::core::fmt::Debug for Vec3 {
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
f.debug_struct("Vec3") f.debug_struct("Vec3")
@@ -25,34 +22,27 @@ impl ::core::fmt::Debug for Vec3 {
} }
impl ::flatbuffers::SimpleToVerifyInSlice for Vec3 {} impl ::flatbuffers::SimpleToVerifyInSlice for Vec3 {}
impl<'a> ::flatbuffers::Follow<'a> for Vec3 { impl<'a> ::flatbuffers::Follow<'a> for Vec3 {
type Inner = &'a Vec3; type Inner = &'a Vec3;
#[inline] #[inline]
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
unsafe { <&'a Vec3>::follow(buf, loc) } unsafe { <&'a Vec3>::follow(buf, loc) }
} }
} }
impl<'a> ::flatbuffers::Follow<'a> for &'a Vec3 { impl<'a> ::flatbuffers::Follow<'a> for &'a Vec3 {
type Inner = &'a Vec3; type Inner = &'a Vec3;
#[inline] #[inline]
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
unsafe { ::flatbuffers::follow_cast_ref::<Vec3>(buf, loc) } unsafe { ::flatbuffers::follow_cast_ref::<Vec3>(buf, loc) }
} }
} }
impl<'b> ::flatbuffers::Push for Vec3 { impl<'b> ::flatbuffers::Push for Vec3 {
type Output = Vec3; type Output = Vec3;
#[inline] #[inline]
unsafe fn push(&self, dst: &mut [u8], _written_len: usize) { unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {
let src = unsafe { ::core::slice::from_raw_parts(self as *const Vec3 as *const u8, <Self as ::flatbuffers::Push>::size()) }; let src = unsafe { ::core::slice::from_raw_parts(self as *const Vec3 as *const u8, <Self as ::flatbuffers::Push>::size()) };
dst.copy_from_slice(src); dst.copy_from_slice(src);
} }
#[inline] #[inline]
fn alignment() -> ::flatbuffers::PushAlignment { fn alignment() -> ::flatbuffers::PushAlignment {
::flatbuffers::PushAlignment::new(4) ::flatbuffers::PushAlignment::new(4)
@@ -182,22 +172,12 @@ impl<'a> Vec3 {
} }
} }
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq, Default)]
pub struct Vec3T { pub struct Vec3T {
pub x: f32, pub x: f32,
pub y: f32, pub y: f32,
pub z: f32, pub z: f32,
} }
impl Default for Vec3T {
fn default() -> Self {
Self {
x: 0.0,
y: 0.0,
z: 0.0,
}
}
}
impl Vec3T { impl Vec3T {
pub fn pack(&self) -> Vec3 { pub fn pack(&self) -> Vec3 {
Vec3::new( Vec3::new(
@@ -207,3 +187,4 @@ impl Vec3T {
) )
} }
} }

View File

@@ -2,17 +2,15 @@
// @generated // @generated
extern crate alloc; extern crate alloc;
use super::*; use super::*;
pub enum WeaponOffset {} pub enum WeaponOffset {}
#[derive(Copy, Clone, PartialEq)] #[derive(Copy, Clone, PartialEq)]
pub struct Weapon<'a> { pub struct Weapon<'a> {
pub _tab: ::flatbuffers::Table<'a>, pub _tab: ::flatbuffers::Table<'a>,
} }
impl<'a> ::flatbuffers::Follow<'a> for Weapon<'a> { impl<'a> ::flatbuffers::Follow<'a> for Weapon<'a> {
type Inner = Weapon<'a>; type Inner = Weapon<'a>;
#[inline] #[inline]
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } } Self { _tab: unsafe { ::flatbuffers::Table::new(buf, loc) } }
@@ -31,7 +29,6 @@ impl<'a> Weapon<'a> {
pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self { pub unsafe fn init_from_table(table: ::flatbuffers::Table<'a>) -> Self {
Weapon { _tab: table } Weapon { _tab: table }
} }
#[allow(unused_mut)] #[allow(unused_mut)]
pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>( pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: ::flatbuffers::Allocator + 'bldr>(
_fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>, _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,
@@ -61,7 +58,6 @@ impl<'a> Weapon<'a> {
// which contains a valid value in this slot // which contains a valid value in this slot
unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<&str>>(Weapon::VT_NAME, None)} unsafe { self._tab.get::<::flatbuffers::ForwardsUOffset<&str>>(Weapon::VT_NAME, None)}
} }
#[inline] #[inline]
pub fn damage(&self) -> i16 { pub fn damage(&self) -> i16 {
// Safety: // Safety:
@@ -83,12 +79,10 @@ impl ::flatbuffers::Verifiable for Weapon<'_> {
Ok(()) Ok(())
} }
} }
pub struct WeaponArgs<'a> { pub struct WeaponArgs<'a> {
pub name: Option<::flatbuffers::WIPOffset<&'a str>>, pub name: Option<::flatbuffers::WIPOffset<&'a str>>,
pub damage: i16, pub damage: i16,
} }
impl<'a> Default for WeaponArgs<'a> { impl<'a> Default for WeaponArgs<'a> {
#[inline] #[inline]
fn default() -> Self { fn default() -> Self {
@@ -103,18 +97,15 @@ pub struct WeaponBuilder<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> {
fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>, fbb_: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,
start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>, start_: ::flatbuffers::WIPOffset<::flatbuffers::TableUnfinishedWIPOffset>,
} }
impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> WeaponBuilder<'a, 'b, A> { impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> WeaponBuilder<'a, 'b, A> {
#[inline] #[inline]
pub fn add_name(&mut self, name: ::flatbuffers::WIPOffset<&'b str>) { pub fn add_name(&mut self, name: ::flatbuffers::WIPOffset<&'b str>) {
self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Weapon::VT_NAME, name); self.fbb_.push_slot_always::<::flatbuffers::WIPOffset<_>>(Weapon::VT_NAME, name);
} }
#[inline] #[inline]
pub fn add_damage(&mut self, damage: i16) { pub fn add_damage(&mut self, damage: i16) {
self.fbb_.push_slot::<i16>(Weapon::VT_DAMAGE, damage, 0); self.fbb_.push_slot::<i16>(Weapon::VT_DAMAGE, damage, 0);
} }
#[inline] #[inline]
pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> WeaponBuilder<'a, 'b, A> { pub fn new(_fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>) -> WeaponBuilder<'a, 'b, A> {
let start = _fbb.start_table(); let start = _fbb.start_table();
@@ -123,7 +114,6 @@ impl<'a: 'b, 'b, A: ::flatbuffers::Allocator + 'a> WeaponBuilder<'a, 'b, A> {
start_: start, start_: start,
} }
} }
#[inline] #[inline]
pub fn finish(self) -> ::flatbuffers::WIPOffset<Weapon<'a>> { pub fn finish(self) -> ::flatbuffers::WIPOffset<Weapon<'a>> {
let o = self.fbb_.end_table(self.start_); let o = self.fbb_.end_table(self.start_);
@@ -139,14 +129,12 @@ impl ::core::fmt::Debug for Weapon<'_> {
ds.finish() ds.finish()
} }
} }
#[non_exhaustive] #[non_exhaustive]
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
pub struct WeaponT { pub struct WeaponT {
pub name: Option<alloc::string::String>, pub name: Option<alloc::string::String>,
pub damage: i16, pub damage: i16,
} }
impl Default for WeaponT { impl Default for WeaponT {
fn default() -> Self { fn default() -> Self {
Self { Self {
@@ -155,7 +143,6 @@ impl Default for WeaponT {
} }
} }
} }
impl WeaponT { impl WeaponT {
pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>( pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(
&self, &self,

View File

@@ -33,11 +33,11 @@ result = subprocess.run(
if result.returncode != 0: if result.returncode != 0:
print( print(
"\n" "\n"
"ERROR: **********************************************************\n" "ERROR: *********************************************************\n"
"ERROR: * The following differences were found after building. *\n" "ERROR: * The following differences were found after building. *\n"
"ERROR: * Perhaps there is a difference in the flags for the. *\n" "ERROR: * Perhaps there is a difference in the flags for the. *\n"
"ERROR: * CMakeLists.txt vs the scripts/generate_code.py script? *\n" "ERROR: * CMakeLists.txt vs the script/generate_code.py script? *\n"
"ERROR: **********************************************************\n" "ERROR: *********************************************************\n"
) )
subprocess.run(["git", "diff", "--binary", "--exit-code"], cwd=root_path) subprocess.run(["git", "diff", "--binary", "--exit-code"], cwd=root_path)
sys.exit(result.returncode) sys.exit(result.returncode)
@@ -55,11 +55,11 @@ result = subprocess.run(
if result.returncode != 0: if result.returncode != 0:
print( print(
"\n" "\n"
"ERROR: *********************************************************\n" "ERROR: ********************************************************\n"
"ERROR: * The following differences were found after running *\n" "ERROR: * The following differences were found after running *\n"
"ERROR: * the scripts/generate_code.py script. Maybe you forgot *\n" "ERROR: * the script/generate_code.py script. Maybe you forgot *\n"
"ERROR: * to run it after making changes in a generator? *\n" "ERROR: * to run it after making changes in a generator? *\n"
"ERROR: *********************************************************\n" "ERROR: ********************************************************\n"
) )
subprocess.run(["git", "diff", "--binary", "--exit-code"], cwd=root_path) subprocess.run(["git", "diff", "--binary", "--exit-code"], cwd=root_path)
sys.exit(result.returncode) sys.exit(result.returncode)

View File

@@ -85,11 +85,6 @@ RUST_OPTS = BASE_OPTS + [
"--gen-name-strings", "--gen-name-strings",
"--rust-module-root-file", "--rust-module-root-file",
] ]
RUST_STANDALONE_OPTS = BASE_OPTS + [
"--rust",
"--gen-all",
"--gen-name-strings",
]
RUST_SERIALIZE_OPTS = BASE_OPTS + [ RUST_SERIALIZE_OPTS = BASE_OPTS + [
"--rust", "--rust",
"--gen-all", "--gen-all",
@@ -245,12 +240,6 @@ flatc(
], ],
) )
flatc(
BASE_OPTS + CPP_OPTS + ["--cpp-ptr-type", "naked"],
prefix="vector_table_naked_ptr",
schema="vector_table_naked_ptr.fbs",
)
flatc( flatc(
BASE_OPTS + CPP_OPTS + CS_OPTS + JAVA_OPTS + KOTLIN_OPTS + PHP_OPTS, BASE_OPTS + CPP_OPTS + CS_OPTS + JAVA_OPTS + KOTLIN_OPTS + PHP_OPTS,
prefix="union_vector", prefix="union_vector",
@@ -293,12 +282,6 @@ flatc(
schema="include_test/include_test1.fbs", schema="include_test/include_test1.fbs",
) )
flatc(
RUST_STANDALONE_OPTS,
include="include_test",
schema="include_test/include_test1.fbs",
)
flatc( flatc(
RUST_OPTS, RUST_OPTS,
prefix="include_test2", prefix="include_test2",
@@ -306,12 +289,6 @@ flatc(
schema="include_test/sub/include_test2.fbs", schema="include_test/sub/include_test2.fbs",
) )
flatc(
RUST_STANDALONE_OPTS,
include="include_test",
schema="include_test/sub/include_test2.fbs",
)
flatc( flatc(
BINARY_OPTS + ["--bfbs-filenames", str(tests_path)], BINARY_OPTS + ["--bfbs-filenames", str(tests_path)],
include="include_test", include="include_test",
@@ -379,7 +356,13 @@ flatc(
) )
flatc( flatc(
["--cpp", "--gen-compare", "--gen-mutable", "--gen-object-api", "--reflect-names"], [
"--cpp",
"--gen-compare",
"--gen-mutable",
"--gen-object-api",
"--reflect-names",
],
schema="native_type_test.fbs", schema="native_type_test.fbs",
) )
@@ -394,11 +377,6 @@ flatc(
schema="native_inline_table_test.fbs", schema="native_inline_table_test.fbs",
) )
flatc(
["--cpp", "--gen-compare", "--gen-mutable", "--gen-object-api", "--reflect-names"],
schema="cross_namespace_pack_test.fbs",
)
flatc( flatc(
RUST_OPTS, RUST_OPTS,
prefix="arrays_test", prefix="arrays_test",
@@ -422,11 +400,6 @@ flatc(
schema="nested_union_test.fbs", schema="nested_union_test.fbs",
) )
flatc(
["--python", "--gen-object-api"],
schema="union_name_test.fbs",
)
flatc( flatc(
NO_INCL_OPTS + CPP_OPTS, NO_INCL_OPTS + CPP_OPTS,
schema="default_vectors_strings_test.fbs", schema="default_vectors_strings_test.fbs",
@@ -527,13 +500,6 @@ flatc(
cwd=swift_code_gen, cwd=swift_code_gen,
) )
flatc(
SWIFT_OPTS_CODE_GEN + BASE_OPTS,
schema="empty_vtable.fbs",
cwd=swift_code_gen,
prefix="../../Tests/Flatbuffers/",
)
# Swift Wasm Tests # Swift Wasm Tests
swift_Wasm_prefix = "swift/Wasm.tests/Tests/FlatBuffers.Test.Swift.WasmTests" swift_Wasm_prefix = "swift/Wasm.tests/Tests/FlatBuffers.Test.Swift.WasmTests"
flatc( flatc(

View File

@@ -61,7 +61,6 @@ Namer::Config LuaDefaultConfig() {
/*object_suffix=*/"", /*object_suffix=*/"",
/*keyword_prefix=*/"", /*keyword_prefix=*/"",
/*keyword_suffix=*/"_", /*keyword_suffix=*/"_",
/*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,
/*filenames=*/Case::kKeep, /*filenames=*/Case::kKeep,
/*directories=*/Case::kKeep, /*directories=*/Case::kKeep,
/*output_path=*/"", /*output_path=*/"",
@@ -195,13 +194,6 @@ class LuaBfbsGenerator : public BaseBfbsGenerator {
code += "\n"; code += "\n";
if (object == root_object) { if (object == root_object) {
// emit file identifier if present
const auto ident = schema_->file_ident();
if (ident && ident->size() == 4) {
code += "local FileIdentifier = \"" + ident->str() + "\"\n";
code += "\n";
}
code += "function " + object_name + ".GetRootAs" + object_name + code += "function " + object_name + ".GetRootAs" + object_name +
"(buf, offset)\n"; "(buf, offset)\n";
code += " if type(buf) == \"string\" then\n"; code += " if type(buf) == \"string\" then\n";
@@ -462,34 +454,6 @@ class LuaBfbsGenerator : public BaseBfbsGenerator {
code += " return builder:EndObject()\n"; code += " return builder:EndObject()\n";
code += "end\n"; code += "end\n";
code += "\n"; code += "\n";
if (object == root_object) {
code += "function " + object_name + ".Finish" + object_name +
"Buffer(builder, offset)\n";
// emit file identifier if present
const auto ident = schema_->file_ident();
if (ident && ident->size() == 4) {
code += " builder:FinishWithIdentifier(offset, FileIdentifier)\n";
} else {
code += " builder:Finish(offset)\n";
}
code += "end\n";
code += "\n";
// size prefixed option
code += "function " + object_name + ".FinishSizePrefixed" +
object_name + "Buffer(builder, offset)\n";
// emit file identifier if present
if (ident && ident->size() == 4) {
code +=
" builder:FinishSizePrefixedWithIdentifier(offset, "
"FileIdentifier)\n";
} else {
code += " builder:FinishSizePrefixed(offset)\n";
}
code += "end\n";
code += "\n";
}
} }
EmitCodeBlock(code, object_name, ns, object->declaration_file()->str()); EmitCodeBlock(code, object_name, ns, object->declaration_file()->str());

View File

@@ -70,7 +70,6 @@ Namer::Config NimDefaultConfig() {
/*object_suffix=*/"T", /*object_suffix=*/"T",
/*keyword_prefix=*/"", /*keyword_prefix=*/"",
/*keyword_suffix=*/"_", /*keyword_suffix=*/"_",
/*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,
/*filenames=*/Case::kKeep, /*filenames=*/Case::kKeep,
/*directories=*/Case::kKeep, /*directories=*/Case::kKeep,
/*output_path=*/"", /*output_path=*/"",

View File

@@ -126,7 +126,9 @@ static BinarySection GenerateMissingSection(const uint64_t offset,
std::map<uint64_t, BinarySection> BinaryAnnotator::Annotate() { std::map<uint64_t, BinarySection> BinaryAnnotator::Annotate() {
if (bfbs_ != nullptr && bfbs_length_ != 0) { if (bfbs_ != nullptr && bfbs_length_ != 0) {
flatbuffers::Verifier verifier(bfbs_, static_cast<size_t>(bfbs_length_)); flatbuffers::Verifier verifier(bfbs_, static_cast<size_t>(bfbs_length_));
if (!reflection::VerifySchemaBuffer(verifier)) { if ((is_size_prefixed_ &&
!reflection::VerifySizePrefixedSchemaBuffer(verifier)) ||
!reflection::VerifySchemaBuffer(verifier)) {
return {}; return {};
} }
} }

View File

@@ -265,9 +265,6 @@ const static FlatCOption flatc_options[] = {
{"", "python-gen-numpy", "", "Whether to generate numpy helpers."}, {"", "python-gen-numpy", "", "Whether to generate numpy helpers."},
{"", "ts-omit-entrypoint", "", {"", "ts-omit-entrypoint", "",
"Omit emission of namespace entrypoint file"}, "Omit emission of namespace entrypoint file"},
{"", "ts-undefined-for-optionals", "",
"Whether to generate undefined values instead of null values for missing "
"optional keys"},
{"", "file-names-only", "", {"", "file-names-only", "",
"Print out generated file names without writing to the files"}, "Print out generated file names without writing to the files"},
{"", "grpc-filename-suffix", "SUFFIX", {"", "grpc-filename-suffix", "SUFFIX",
@@ -713,8 +710,6 @@ FlatCOptions FlatCompiler::ParseFromCommandLineArguments(int argc,
opts.python_gen_numpy = false; opts.python_gen_numpy = false;
} else if (arg == "--ts-omit-entrypoint") { } else if (arg == "--ts-omit-entrypoint") {
opts.ts_omit_entrypoint = true; opts.ts_omit_entrypoint = true;
} else if (arg == "--ts-undefined-for-optionals") {
opts.ts_undefined_for_optionals = true;
} else if (arg == "--annotate-sparse-vectors") { } else if (arg == "--annotate-sparse-vectors") {
options.annotate_include_vector_contents = false; options.annotate_include_vector_contents = false;
} else if (arg == "--annotate") { } else if (arg == "--annotate") {
@@ -927,9 +922,6 @@ std::unique_ptr<Parser> FlatCompiler::GenerateCode(const FlatCOptions& options,
auto err = parser->ConformTo(conform_parser); auto err = parser->ConformTo(conform_parser);
if (!err.empty()) Error("schemas don\'t conform: " + err, false); if (!err.empty()) Error("schemas don\'t conform: " + err, false);
} }
if (parser->HasCircularStructDependency()) {
Error("schema has circular struct dependencies: " + filename, false);
}
if (options.schema_binary || opts.binary_schema_gen_embed) { if (options.schema_binary || opts.binary_schema_gen_embed) {
parser->Serialize(); parser->Serialize();
} }

View File

@@ -2779,17 +2779,15 @@ class CppGenerator : public BaseGenerator {
get_call += ">(" + offset_str + ");"; get_call += ">(" + offset_str + ");";
code_ += get_call; code_ += get_call;
} else if (IsString(type) && field.value.constant != "0") { } else if (IsString(type) && field.value.constant != "0") {
std::string escaped; // TODO: Add logic to always convert the string to a valid C++ string
flatbuffers::EscapeString(field.value.constant.c_str(), // literal by handling string escapes.
field.value.constant.length(), &escaped,
true, false);
code_ += " auto* ptr = {{FIELD_VALUE}};"; code_ += " auto* ptr = {{FIELD_VALUE}};";
code_ += " if (ptr) return ptr;"; code_ += " if (ptr) return ptr;";
code_ += " static const struct { uint32_t len; const char s[" + code_ += " static const struct { uint32_t len; const char s[" +
NumToString(field.value.constant.length() + 1) + NumToString(field.value.constant.length() + 1) +
"]; } bfbs_string = { " + "]; } bfbs_string = { " +
NumToString(field.value.constant.length()) + ", " + NumToString(field.value.constant.length()) + ", \"" +
escaped + " };"; field.value.constant + "\" };";
code_ += code_ +=
" return reinterpret_cast<const ::flatbuffers::String " " return reinterpret_cast<const ::flatbuffers::String "
" *>(&bfbs_string);"; " *>(&bfbs_string);";
@@ -3419,15 +3417,11 @@ class CppGenerator : public BaseGenerator {
code_.SetValue("CREATE_STRING", "CreateSharedString"); code_.SetValue("CREATE_STRING", "CreateSharedString");
} }
if (field->value.constant != "0") { if (field->value.constant != "0") {
std::string escaped;
flatbuffers::EscapeString(field->value.constant.c_str(),
field->value.constant.length(), &escaped,
true, false);
code_ += code_ +=
" auto {{FIELD_NAME}}__ = {{FIELD_NAME}} ? " " auto {{FIELD_NAME}}__ = {{FIELD_NAME}} ? "
"_fbb.{{CREATE_STRING}}({{FIELD_NAME}}) : " "_fbb.{{CREATE_STRING}}({{FIELD_NAME}}) : "
"_fbb.{{CREATE_STRING}}(" + "_fbb.{{CREATE_STRING}}(\"" +
escaped + ");"; field->value.constant + "\");";
} else { } else {
code_ += code_ +=
" auto {{FIELD_NAME}}__ = {{FIELD_NAME}} ? " " auto {{FIELD_NAME}}__ = {{FIELD_NAME}} ? "
@@ -3831,9 +3825,7 @@ class CppGenerator : public BaseGenerator {
code += WrapInNameSpace(*vector_type.struct_def) + ">> "; code += WrapInNameSpace(*vector_type.struct_def) + ">> ";
code += "(" + value + ".size(), "; code += "(" + value + ".size(), ";
code += "[](size_t i, _VectorArgs *__va) { "; code += "[](size_t i, _VectorArgs *__va) { ";
code += "return " + code += "return Create" + vector_type.struct_def->name;
WrapInNameSpace(vector_type.struct_def->defined_namespace,
"Create" + vector_type.struct_def->name);
code += "(*__va->__fbb, "; code += "(*__va->__fbb, ";
if (field.native_inline) { if (field.native_inline) {
code += "&(__va->_" + value + "[i])"; code += "&(__va->_" + value + "[i])";
@@ -3946,10 +3938,8 @@ class CppGenerator : public BaseGenerator {
} }
} else { } else {
// _o->field ? CreateT(_fbb, _o->field.get(), _rehasher); // _o->field ? CreateT(_fbb, _o->field.get(), _rehasher);
const auto& nested_struct = *field.value.type.struct_def; const std::string& type = field.value.type.struct_def->name;
code += value + " ? " + code += value + " ? Create" + type;
WrapInNameSpace(nested_struct.defined_namespace,
"Create" + nested_struct.name);
code += "(_fbb, " + value; code += "(_fbb, " + value;
if (!field.native_inline) code += GenPtrGet(field); if (!field.native_inline) code += GenPtrGet(field);
code += ", _rehasher) : 0"; code += ", _rehasher) : 0";

View File

@@ -1243,58 +1243,6 @@ class CSharpGenerator : public BaseGenerator {
} }
code += " }\n"; code += " }\n";
} }
// Generate Length property and ByteBuffer accessor for arrays in structs.
if (IsArray(field.value.type) && struct_def.fixed &&
IsScalar(field.value.type.VectorType().base_type)) {
auto camel_name = Name(field);
if (camel_name == struct_def.name) { camel_name += "_"; }
// Generate Length constant
code += " public const int " + camel_name;
code += "Length = ";
code += NumToString(field.value.type.fixed_length);
code += ";\n";
// Generate GetBytes methods for scalar arrays (similar to vector pattern)
code += "#if ENABLE_SPAN_T\n";
code += " public Span<" + GenTypeBasic(field.value.type.VectorType()) +
"> Get";
code += camel_name;
code += "Bytes() { return ";
// For byte arrays, we can return the span directly
if (field.value.type.VectorType().base_type == BASE_TYPE_UCHAR) {
code += "__p.bb.ToSpan(__p.bb_pos + ";
code += NumToString(field.value.offset);
code += ", ";
code += NumToString(field.value.type.fixed_length *
SizeOf(field.value.type.VectorType().base_type));
code += ")";
} else {
// For other types, we need to cast the byte span
code += "System.Runtime.InteropServices.MemoryMarshal.Cast<byte, " +
GenTypeBasic(field.value.type.VectorType()) + ">(__p.bb.ToSpan(__p.bb_pos + ";
code += NumToString(field.value.offset);
code += ", ";
code += NumToString(field.value.type.fixed_length *
SizeOf(field.value.type.VectorType().base_type));
code += "))";
}
code += "; }\n";
code += "#else\n";
code += " public ArraySegment<byte>? Get";
code += camel_name;
code += "Bytes() { return ";
code += "__p.bb.ToArraySegment(__p.bb_pos + ";
code += NumToString(field.value.offset);
code += ", ";
code += NumToString(field.value.type.fixed_length *
SizeOf(field.value.type.VectorType().base_type));
code += ");}\n";
code += "#endif\n";
}
// generate object accessors if is nested_flatbuffer // generate object accessors if is nested_flatbuffer
if (field.nested_flatbuffer) { if (field.nested_flatbuffer) {
auto nested_type_name = NamespacedName(*field.nested_flatbuffer); auto nested_type_name = NamespacedName(*field.nested_flatbuffer);

View File

@@ -48,7 +48,6 @@ static Namer::Config DartDefaultConfig() {
/*object_suffix=*/"T", /*object_suffix=*/"T",
/*keyword_prefix=*/"$", /*keyword_prefix=*/"$",
/*keyword_suffix=*/"", /*keyword_suffix=*/"",
/*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,
/*filenames=*/Case::kKeep, /*filenames=*/Case::kKeep,
/*directories=*/Case::kKeep, /*directories=*/Case::kKeep,
/*output_path=*/"", /*output_path=*/"",

View File

@@ -368,17 +368,7 @@ static std::string GenerateFBS(const Parser& parser,
if (field.value.type.base_type != BASE_TYPE_UTYPE) { if (field.value.type.base_type != BASE_TYPE_UTYPE) {
GenComment(field.doc_comment, &schema, nullptr, " "); GenComment(field.doc_comment, &schema, nullptr, " ");
schema += " " + field.name + ":" + GenType(field.value.type); schema += " " + field.name + ":" + GenType(field.value.type);
if (field.value.constant != "0") { if (field.value.constant != "0") schema += " = " + field.value.constant;
if (IsString(field.value.type)) {
std::string escaped;
flatbuffers::EscapeString(field.value.constant.c_str(),
field.value.constant.length(), &escaped,
true, false);
schema += " = " + escaped;
} else {
schema += " = " + field.value.constant;
}
}
std::vector<std::string> attributes; std::vector<std::string> attributes;
if (field.IsRequired()) attributes.push_back("required"); if (field.IsRequired()) attributes.push_back("required");
if (field.key) attributes.push_back("key"); if (field.key) attributes.push_back("key");

View File

@@ -75,7 +75,6 @@ static Namer::Config GoDefaultConfig() {
/*object_suffix=*/"T", /*object_suffix=*/"T",
/*keyword_prefix=*/"", /*keyword_prefix=*/"",
/*keyword_suffix=*/"_", /*keyword_suffix=*/"_",
/*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,
/*filenames=*/Case::kKeep, /*filenames=*/Case::kKeep,
/*directories=*/Case::kKeep, /*directories=*/Case::kKeep,
/*output_path=*/"", /*output_path=*/"",

View File

@@ -46,7 +46,6 @@ static Namer::Config JavaDefaultConfig() {
/*object_suffix=*/"T", /*object_suffix=*/"T",
/*keyword_prefix=*/"", /*keyword_prefix=*/"",
/*keyword_suffix=*/"_", /*keyword_suffix=*/"_",
/*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,
/*filenames=*/Case::kKeep, /*filenames=*/Case::kKeep,
/*directories=*/Case::kKeep, /*directories=*/Case::kKeep,
/*output_path=*/"", /*output_path=*/"",

View File

@@ -64,7 +64,6 @@ static Namer::Config KotlinDefaultConfig() {
/*object_suffix=*/"T", /*object_suffix=*/"T",
/*keyword_prefix=*/"", /*keyword_prefix=*/"",
/*keyword_suffix=*/"_", /*keyword_suffix=*/"_",
/*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,
/*filenames=*/Case::kKeep, /*filenames=*/Case::kKeep,
/*directories=*/Case::kKeep, /*directories=*/Case::kKeep,
/*output_path=*/"", /*output_path=*/"",

View File

@@ -62,7 +62,6 @@ static Namer::Config KotlinDefaultConfig() {
/*object_suffix=*/"T", /*object_suffix=*/"T",
/*keyword_prefix=*/"", /*keyword_prefix=*/"",
/*keyword_suffix=*/"E", /*keyword_suffix=*/"E",
/*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,
/*filenames=*/Case::kUpperCamel, /*filenames=*/Case::kUpperCamel,
/*directories=*/Case::kLowerCamel, /*directories=*/Case::kLowerCamel,
/*output_path=*/"", /*output_path=*/"",

View File

@@ -593,18 +593,6 @@ class PythonStubGenerator {
"bytes) -> uoffset: ...\n"; "bytes) -> uoffset: ...\n";
} }
} }
stub << "def ";
if (!parser_.opts.python_no_type_prefix_suffix) stub << type;
stub << "Create" << namer_.Method(*field)
<< "Vector(builder: flatbuffers.Builder, data: typing.Iterable["
"typing.Any]) -> uoffset: ...\n";
if (!parser_.opts.one_file &&
!parser_.opts.python_no_type_prefix_suffix) {
stub << "def Create" << namer_.Method(*field)
<< "Vector(builder: flatbuffers.Builder, data: "
"typing.Iterable[typing.Any]) -> uoffset: ...\n";
}
} }
} }
@@ -1479,59 +1467,6 @@ class PythonGenerator : public BaseGenerator {
} }
} }
void BuildVectorCreationHelper(const StructDef& struct_def,
const FieldDef& field, std::string* code_ptr,
ImportMap& imports) const {
auto& code = *code_ptr;
const auto vector_type = field.value.type.VectorType();
const bool is_struct_vector = IsStruct(vector_type);
const bool is_scalar_vector =
IsScalar(vector_type.base_type) || vector_type.enum_def != nullptr;
const std::string struct_type = namer_.Type(struct_def);
const std::string field_method = namer_.Method(field);
const std::string helper_name =
parser_.opts.python_no_type_prefix_suffix
? "Create" + field_method + "Vector"
: struct_type + "Create" + field_method + "Vector";
if (parser_.opts.python_typing) {
imports.insert(ImportMapEntry{"typing", "Iterable"});
code += "def " + helper_name +
"(builder: flatbuffers.Builder, data: Iterable[Any]) -> int:\n";
} else {
code += "def " + helper_name + "(builder, data):\n";
}
if (is_scalar_vector || is_struct_vector) {
auto alignment = InlineAlignment(vector_type);
auto elem_size = InlineSize(vector_type);
code += Indent + "data = list(data)\n";
code += Indent + "builder.StartVector(" + NumToString(elem_size) +
", len(data), " + NumToString(alignment) + ")\n";
code += Indent + "for item in reversed(data):\n";
if (is_struct_vector) {
code += Indent + Indent + "item.Pack(builder)\n";
} else {
code += Indent + Indent + "builder.Prepend" +
namer_.Method(GenTypeBasic(vector_type)) + "(item)\n";
}
code += Indent + "return builder.EndVector()\n\n";
} else {
code += Indent + "return builder.CreateVectorOfTables(data)\n\n";
}
if (!parser_.opts.one_file && !parser_.opts.python_no_type_prefix_suffix) {
if (parser_.opts.python_typing) {
code += "def Create" + field_method +
"Vector(builder: flatbuffers.Builder, data: Iterable[Any]) "
"-> int:\n";
} else {
code += "def Create" + field_method + "Vector(builder, data):\n";
}
code += Indent + "return " + helper_name + "(builder, data)\n\n";
}
}
// Set the value of one of the members of a table's vector and fills in the // Set the value of one of the members of a table's vector and fills in the
// elements from a bytearray. This is for simplifying the use of nested // elements from a bytearray. This is for simplifying the use of nested
// flatbuffers. // flatbuffers.
@@ -1682,8 +1617,8 @@ class PythonGenerator : public BaseGenerator {
} }
// Generate table constructors, conditioned on its members' types. // Generate table constructors, conditioned on its members' types.
void GenTableBuilders(const StructDef& struct_def, std::string* code_ptr, void GenTableBuilders(const StructDef& struct_def,
ImportMap& imports) const { std::string* code_ptr) const {
GetStartOfTable(struct_def, code_ptr); GetStartOfTable(struct_def, code_ptr);
for (auto it = struct_def.fields.vec.begin(); for (auto it = struct_def.fields.vec.begin();
@@ -1695,7 +1630,6 @@ class PythonGenerator : public BaseGenerator {
BuildFieldOfTable(struct_def, field, offset, code_ptr); BuildFieldOfTable(struct_def, field, offset, code_ptr);
if (IsVector(field.value.type)) { if (IsVector(field.value.type)) {
BuildVectorOfTable(struct_def, field, code_ptr); BuildVectorOfTable(struct_def, field, code_ptr);
BuildVectorCreationHelper(struct_def, field, code_ptr, imports);
BuildVectorOfTableFromBytes(struct_def, field, code_ptr); BuildVectorOfTableFromBytes(struct_def, field, code_ptr);
} }
} }
@@ -1762,7 +1696,7 @@ class PythonGenerator : public BaseGenerator {
GenStructBuilder(struct_def, code_ptr); GenStructBuilder(struct_def, code_ptr);
} else { } else {
// Creates a set of functions that allow table construction. // Creates a set of functions that allow table construction.
GenTableBuilders(struct_def, code_ptr, imports); GenTableBuilders(struct_def, code_ptr);
} }
} }
@@ -2095,12 +2029,12 @@ class PythonGenerator : public BaseGenerator {
const auto field_method = namer_.Method(field); const auto field_method = namer_.Method(field);
const auto struct_var = namer_.Variable(struct_def); const auto struct_var = namer_.Variable(struct_def);
const EnumDef& enum_def = *field.value.type.enum_def; const EnumDef& enum_def = *field.value.type.enum_def;
auto union_fn = namer_.Function(enum_def); auto union_type = namer_.Type(enum_def);
if (parser_.opts.include_dependence_headers) { if (parser_.opts.include_dependence_headers) {
union_fn = namer_.NamespacedType(enum_def) + "." + union_fn; union_type = namer_.NamespacedType(enum_def) + "." + union_type;
} }
code += GenIndents(2) + "self." + field_field + " = " + union_fn + code += GenIndents(2) + "self." + field_field + " = " + union_type +
"Creator(" + "self." + field_field + "Type, " + struct_var + "." + "Creator(" + "self." + field_field + "Type, " + struct_var + "." +
field_method + "())"; field_method + "())";
} }

View File

@@ -49,7 +49,6 @@ static Namer::Config RustDefaultConfig() {
/*object_suffix=*/"T", /*object_suffix=*/"T",
/*keyword_prefix=*/"", /*keyword_prefix=*/"",
/*keyword_suffix=*/"_", /*keyword_suffix=*/"_",
/*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,
/*filenames=*/Case::kSnake, /*filenames=*/Case::kSnake,
/*directories=*/Case::kSnake, /*directories=*/Case::kSnake,
/*output_path=*/"", /*output_path=*/"",
@@ -424,12 +423,14 @@ class RustGenerator : public BaseGenerator {
code_.Clear(); code_.Clear();
code_ += "// " + std::string(FlatBuffersGeneratedWarning()); code_ += "// " + std::string(FlatBuffersGeneratedWarning());
code_ += "// @generated"; code_ += "// @generated";
code_ += "extern crate alloc;";
assert(!cur_name_space_); assert(!cur_name_space_);
// Generate imports for the global scope in case no namespace is used // Generate imports for the global scope in case no namespace is used
// in the schema file. // in the schema file.
GenNamespaceImports(); GenNamespaceImports(0);
code_ += "";
// Generate all code in their namespaces, once, because Rust does not // Generate all code in their namespaces, once, because Rust does not
// permit re-opening modules. // permit re-opening modules.
@@ -707,8 +708,6 @@ class RustGenerator : public BaseGenerator {
// an enum match function, // an enum match function,
// and an enum array of values // and an enum array of values
void GenEnum(const EnumDef& enum_def) { void GenEnum(const EnumDef& enum_def) {
code_ += "";
const bool is_private = parser_.opts.no_leak_private_annotations && const bool is_private = parser_.opts.no_leak_private_annotations &&
(enum_def.attributes.Lookup("private") != nullptr); (enum_def.attributes.Lookup("private") != nullptr);
code_.SetValue("ACCESS_TYPE", is_private ? "pub(crate)" : "pub"); code_.SetValue("ACCESS_TYPE", is_private ? "pub(crate)" : "pub");
@@ -740,8 +739,6 @@ class RustGenerator : public BaseGenerator {
code_ += " }"; code_ += " }";
code_ += " }"; code_ += " }";
code_ += "}"; code_ += "}";
code_ += "";
code_ += "pub use self::bitflags_{{ENUM_NAMESPACE}}::{{ENUM_TY}};"; code_ += "pub use self::bitflags_{{ENUM_NAMESPACE}}::{{ENUM_TY}};";
code_ += ""; code_ += "";
@@ -756,14 +753,10 @@ class RustGenerator : public BaseGenerator {
code_ += code_ +=
"pub const ENUM_MIN_{{ENUM_CONSTANT}}: {{BASE_TYPE}}" "pub const ENUM_MIN_{{ENUM_CONSTANT}}: {{BASE_TYPE}}"
" = {{ENUM_MIN_BASE_VALUE}};"; " = {{ENUM_MIN_BASE_VALUE}};";
code_ += "";
code_ += deprecation_warning; code_ += deprecation_warning;
code_ += code_ +=
"pub const ENUM_MAX_{{ENUM_CONSTANT}}: {{BASE_TYPE}}" "pub const ENUM_MAX_{{ENUM_CONSTANT}}: {{BASE_TYPE}}"
" = {{ENUM_MAX_BASE_VALUE}};"; " = {{ENUM_MAX_BASE_VALUE}};";
code_ += "";
auto num_fields = NumToString(enum_def.size()); auto num_fields = NumToString(enum_def.size());
code_ += deprecation_warning; code_ += deprecation_warning;
code_ += "#[allow(non_camel_case_types)]"; code_ += "#[allow(non_camel_case_types)]";
@@ -784,8 +777,6 @@ class RustGenerator : public BaseGenerator {
"Default)]"; "Default)]";
code_ += "#[repr(transparent)]"; code_ += "#[repr(transparent)]";
code_ += "{{ACCESS_TYPE}} struct {{ENUM_TY}}(pub {{BASE_TYPE}});"; code_ += "{{ACCESS_TYPE}} struct {{ENUM_TY}}(pub {{BASE_TYPE}});";
code_ += "";
code_ += "#[allow(non_upper_case_globals)]"; code_ += "#[allow(non_upper_case_globals)]";
code_ += "impl {{ENUM_TY}} {"; code_ += "impl {{ENUM_TY}} {";
ForAllEnumValues1(enum_def, [&](const EnumVal& ev) { ForAllEnumValues1(enum_def, [&](const EnumVal& ev) {
@@ -794,15 +785,11 @@ class RustGenerator : public BaseGenerator {
}); });
code_ += ""; code_ += "";
// Generate Associated constants // Generate Associated constants
code_ += code_ += " pub const ENUM_MIN: {{BASE_TYPE}} = {{ENUM_MIN_BASE_VALUE}};";
" pub const ENUM_MIN: {{BASE_TYPE}} = {{ENUM_MIN_BASE_VALUE}};"; code_ += " pub const ENUM_MAX: {{BASE_TYPE}} = {{ENUM_MAX_BASE_VALUE}};";
code_ +=
" pub const ENUM_MAX: {{BASE_TYPE}} = {{ENUM_MAX_BASE_VALUE}};";
code_ += " pub const ENUM_VALUES: &'static [Self] = &["; code_ += " pub const ENUM_VALUES: &'static [Self] = &[";
ForAllEnumValues(enum_def, [&]() { code_ += " Self::{{VARIANT}},"; }); ForAllEnumValues(enum_def, [&]() { code_ += " Self::{{VARIANT}},"; });
code_ += " ];"; code_ += " ];";
code_ += "";
code_ += " /// Returns the variant's name or \"\" if unknown."; code_ += " /// Returns the variant's name or \"\" if unknown.";
code_ += " pub fn variant_name(self) -> Option<&'static str> {"; code_ += " pub fn variant_name(self) -> Option<&'static str> {";
code_ += " match self {"; code_ += " match self {";
@@ -813,7 +800,6 @@ class RustGenerator : public BaseGenerator {
code_ += " }"; code_ += " }";
code_ += " }"; code_ += " }";
code_ += "}"; code_ += "}";
code_ += "";
// Generate Debug. Unknown variants are printed like "<UNKNOWN 42>". // Generate Debug. Unknown variants are printed like "<UNKNOWN 42>".
code_ += "impl ::core::fmt::Debug for {{ENUM_TY}} {"; code_ += "impl ::core::fmt::Debug for {{ENUM_TY}} {";
@@ -823,12 +809,10 @@ class RustGenerator : public BaseGenerator {
code_ += " if let Some(name) = self.variant_name() {"; code_ += " if let Some(name) = self.variant_name() {";
code_ += " f.write_str(name)"; code_ += " f.write_str(name)";
code_ += " } else {"; code_ += " } else {";
code_ += code_ += " f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))";
" f.write_fmt(format_args!(\"<UNKNOWN {:?}>\", self.0))";
code_ += " }"; code_ += " }";
code_ += " }"; code_ += " }";
code_ += "}"; code_ += "}";
code_ += "";
code_.SetValue("INTO_BASE", "self.0"); code_.SetValue("INTO_BASE", "self.0");
} }
@@ -837,8 +821,7 @@ class RustGenerator : public BaseGenerator {
if (parser_.opts.rust_serialize) { if (parser_.opts.rust_serialize) {
code_ += "impl Serialize for {{ENUM_TY}} {"; code_ += "impl Serialize for {{ENUM_TY}} {";
code_ += code_ +=
" fn serialize<S>(&self, serializer: S) -> Result<S::Ok, " " fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>";
"S::Error>";
code_ += " where"; code_ += " where";
code_ += " S: Serializer,"; code_ += " S: Serializer,";
code_ += " {"; code_ += " {";
@@ -863,9 +846,7 @@ class RustGenerator : public BaseGenerator {
code_ += " {"; code_ += " {";
code_ += " let s = String::deserialize(deserializer)?;"; code_ += " let s = String::deserialize(deserializer)?;";
code_ += " for item in {{ENUM_TY}}::ENUM_VALUES {"; code_ += " for item in {{ENUM_TY}}::ENUM_VALUES {";
code_ += code_ += " if let Some(item_name) = item.variant_name() {";
" if let Some(item_name) = "
"item.variant_name() {";
code_ += " if item_name == s {"; code_ += " if item_name == s {";
code_ += " return Ok(item.clone());"; code_ += " return Ok(item.clone());";
code_ += " }"; code_ += " }";
@@ -883,7 +864,6 @@ class RustGenerator : public BaseGenerator {
// Generate Follow and Push so we can serialize and stuff. // Generate Follow and Push so we can serialize and stuff.
code_ += "impl<'a> ::flatbuffers::Follow<'a> for {{ENUM_TY}} {"; code_ += "impl<'a> ::flatbuffers::Follow<'a> for {{ENUM_TY}} {";
code_ += " type Inner = Self;"; code_ += " type Inner = Self;";
code_ += "";
code_ += " #[inline]"; code_ += " #[inline]";
code_ += " unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {"; code_ += " unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {";
code_ += code_ +=
@@ -899,7 +879,6 @@ class RustGenerator : public BaseGenerator {
code_ += ""; code_ += "";
code_ += "impl ::flatbuffers::Push for {{ENUM_TY}} {"; code_ += "impl ::flatbuffers::Push for {{ENUM_TY}} {";
code_ += " type Output = {{ENUM_TY}};"; code_ += " type Output = {{ENUM_TY}};";
code_ += "";
code_ += " #[inline]"; code_ += " #[inline]";
code_ += " unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {"; code_ += " unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {";
code_ += code_ +=
@@ -910,12 +889,10 @@ class RustGenerator : public BaseGenerator {
code_ += ""; code_ += "";
code_ += "impl ::flatbuffers::EndianScalar for {{ENUM_TY}} {"; code_ += "impl ::flatbuffers::EndianScalar for {{ENUM_TY}} {";
code_ += " type Scalar = {{BASE_TYPE}};"; code_ += " type Scalar = {{BASE_TYPE}};";
code_ += "";
code_ += " #[inline]"; code_ += " #[inline]";
code_ += " fn to_little_endian(self) -> {{BASE_TYPE}} {"; code_ += " fn to_little_endian(self) -> {{BASE_TYPE}} {";
code_ += " {{INTO_BASE}}.to_le()"; code_ += " {{INTO_BASE}}.to_le()";
code_ += " }"; code_ += " }";
code_ += "";
code_ += " #[inline]"; code_ += " #[inline]";
code_ += " #[allow(clippy::wrong_self_convention)]"; code_ += " #[allow(clippy::wrong_self_convention)]";
code_ += " fn from_little_endian(v: {{BASE_TYPE}}) -> Self {"; code_ += " fn from_little_endian(v: {{BASE_TYPE}}) -> Self {";
@@ -945,8 +922,8 @@ class RustGenerator : public BaseGenerator {
if (enum_def.is_union) { if (enum_def.is_union) {
// Generate typesafe offset(s) for unions // Generate typesafe offset(s) for unions
code_.SetValue("UNION_TYPE", namer_.Type(enum_def)); code_.SetValue("UNION_TYPE", namer_.Type(enum_def));
code_ += "";
code_ += "{{ACCESS_TYPE}} struct {{UNION_TYPE}}UnionTableOffset {}"; code_ += "{{ACCESS_TYPE}} struct {{UNION_TYPE}}UnionTableOffset {}";
code_ += "";
if (parser_.opts.generate_object_based_api) { if (parser_.opts.generate_object_based_api) {
GenUnionObject(enum_def); GenUnionObject(enum_def);
} }
@@ -978,7 +955,6 @@ class RustGenerator : public BaseGenerator {
code_.SetValue("ENUM_OTY", namer_.ObjectType(enum_def)); code_.SetValue("ENUM_OTY", namer_.ObjectType(enum_def));
// Generate native union. // Generate native union.
code_ += "";
code_ += "#[allow(clippy::upper_case_acronyms)]"; // NONE's spelling is code_ += "#[allow(clippy::upper_case_acronyms)]"; // NONE's spelling is
// intended. // intended.
code_ += "#[non_exhaustive]"; code_ += "#[non_exhaustive]";
@@ -990,15 +966,12 @@ class RustGenerator : public BaseGenerator {
"{{NATIVE_VARIANT}}(alloc::boxed::Box<{{U_ELEMENT_TABLE_TYPE}}>),"; "{{NATIVE_VARIANT}}(alloc::boxed::Box<{{U_ELEMENT_TABLE_TYPE}}>),";
}); });
code_ += "}"; code_ += "}";
code_ += "";
// Generate Default (NONE). // Generate Default (NONE).
code_ += "impl Default for {{ENUM_OTY}} {"; code_ += "impl Default for {{ENUM_OTY}} {";
code_ += " fn default() -> Self {"; code_ += " fn default() -> Self {";
code_ += " Self::NONE"; code_ += " Self::NONE";
code_ += " }"; code_ += " }";
code_ += "}"; code_ += "}";
code_ += "";
// Generate native union methods. // Generate native union methods.
code_ += "impl {{ENUM_OTY}} {"; code_ += "impl {{ENUM_OTY}} {";
@@ -1015,12 +988,9 @@ class RustGenerator : public BaseGenerator {
}); });
code_ += " }"; code_ += " }";
code_ += " }"; code_ += " }";
code_ += "";
// Pack flatbuffers union value // Pack flatbuffers union value
code_ += code_ +=
" pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: " " pub fn pack<'b, A: ::flatbuffers::Allocator + 'b>(&self, fbb: &mut "
"&mut "
"::flatbuffers::FlatBufferBuilder<'b, A>)" "::flatbuffers::FlatBufferBuilder<'b, A>)"
" -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>" " -> Option<::flatbuffers::WIPOffset<::flatbuffers::UnionWIPOffset>>"
" {"; " {";
@@ -1036,7 +1006,6 @@ class RustGenerator : public BaseGenerator {
// Generate some accessors; // Generate some accessors;
ForAllUnionObjectVariantsBesidesNone(enum_def, [&] { ForAllUnionObjectVariantsBesidesNone(enum_def, [&] {
// Move accessor. // Move accessor.
code_ += "";
code_ += code_ +=
"/// If the union variant matches, return the owned " "/// If the union variant matches, return the owned "
"{{U_ELEMENT_TABLE_TYPE}}, setting the union to NONE."; "{{U_ELEMENT_TABLE_TYPE}}, setting the union to NONE.";
@@ -1054,9 +1023,7 @@ class RustGenerator : public BaseGenerator {
code_ += " None"; code_ += " None";
code_ += " }"; code_ += " }";
code_ += "}"; code_ += "}";
// Immutable reference accessor. // Immutable reference accessor.
code_ += "";
code_ += code_ +=
"/// If the union variant matches, return a reference to the " "/// If the union variant matches, return a reference to the "
"{{U_ELEMENT_TABLE_TYPE}}."; "{{U_ELEMENT_TABLE_TYPE}}.";
@@ -1067,9 +1034,7 @@ class RustGenerator : public BaseGenerator {
" if let Self::{{NATIVE_VARIANT}}(v) = self " " if let Self::{{NATIVE_VARIANT}}(v) = self "
"{ Some(v.as_ref()) } else { None }"; "{ Some(v.as_ref()) } else { None }";
code_ += "}"; code_ += "}";
// Mutable reference accessor. // Mutable reference accessor.
code_ += "";
code_ += code_ +=
"/// If the union variant matches, return a mutable reference" "/// If the union variant matches, return a mutable reference"
" to the {{U_ELEMENT_TABLE_TYPE}}."; " to the {{U_ELEMENT_TABLE_TYPE}}.";
@@ -1081,9 +1046,7 @@ class RustGenerator : public BaseGenerator {
"{ Some(v.as_mut()) } else { None }"; "{ Some(v.as_mut()) } else { None }";
code_ += "}"; code_ += "}";
}); });
code_ += "}"; // End union methods impl. code_ += "}"; // End union methods impl.
code_ += "";
} }
enum DefaultContext { kBuilder, kAccessor, kObject }; enum DefaultContext { kBuilder, kAccessor, kObject };
@@ -1138,14 +1101,9 @@ class RustGenerator : public BaseGenerator {
// need one for Rust's Default trait so we use empty string. The usual // need one for Rust's Default trait so we use empty string. The usual
// value of field.value.constant is `0`, which is non-sensical except // value of field.value.constant is `0`, which is non-sensical except
// maybe to c++ (nullptr == 0). // maybe to c++ (nullptr == 0).
std::string defval; // TODO: Escape strings?
if (field.IsRequired()) { const std::string defval =
defval = "\"\""; field.IsRequired() ? "\"\"" : "\"" + field.value.constant + "\"";
} else {
flatbuffers::EscapeString(field.value.constant.c_str(),
field.value.constant.length(), &defval,
true, false);
}
if (context == kObject) { if (context == kObject) {
return "alloc::string::ToString::to_string(" + defval + ")"; return "alloc::string::ToString::to_string(" + defval + ")";
} }
@@ -1715,8 +1673,6 @@ class RustGenerator : public BaseGenerator {
// Generate an accessor struct, builder struct, and create function for a // Generate an accessor struct, builder struct, and create function for a
// table. // table.
void GenTable(const StructDef& struct_def) { void GenTable(const StructDef& struct_def) {
code_ += "";
const bool is_private = const bool is_private =
parser_.opts.no_leak_private_annotations && parser_.opts.no_leak_private_annotations &&
(struct_def.attributes.Lookup("private") != nullptr); (struct_def.attributes.Lookup("private") != nullptr);
@@ -1727,18 +1683,17 @@ class RustGenerator : public BaseGenerator {
// Generate an offset type, the base type, the Follow impl, and the // Generate an offset type, the base type, the Follow impl, and the
// init_from_table impl. // init_from_table impl.
code_ += "{{ACCESS_TYPE}} enum {{STRUCT_TY}}Offset {}"; code_ += "{{ACCESS_TYPE}} enum {{STRUCT_TY}}Offset {}";
code_ += "#[derive(Copy, Clone, PartialEq)]";
code_ += ""; code_ += "";
GenComment(struct_def.doc_comment); GenComment(struct_def.doc_comment);
code_ += "#[derive(Copy, Clone, PartialEq)]";
code_ += "{{ACCESS_TYPE}} struct {{STRUCT_TY}}<'a> {"; code_ += "{{ACCESS_TYPE}} struct {{STRUCT_TY}}<'a> {";
code_ += " pub _tab: ::flatbuffers::Table<'a>,"; code_ += " pub _tab: ::flatbuffers::Table<'a>,";
code_ += "}"; code_ += "}";
code_ += ""; code_ += "";
code_ += "impl<'a> ::flatbuffers::Follow<'a> for {{STRUCT_TY}}<'a> {"; code_ += "impl<'a> ::flatbuffers::Follow<'a> for {{STRUCT_TY}}<'a> {";
code_ += " type Inner = {{STRUCT_TY}}<'a>;"; code_ += " type Inner = {{STRUCT_TY}}<'a>;";
code_ += "";
code_ += " #[inline]"; code_ += " #[inline]";
code_ += " unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {"; code_ += " unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {";
code_ += code_ +=
@@ -1755,8 +1710,7 @@ class RustGenerator : public BaseGenerator {
"pub const {{OFFSET_NAME}}: ::flatbuffers::VOffsetT = " "pub const {{OFFSET_NAME}}: ::flatbuffers::VOffsetT = "
"{{OFFSET_VALUE}};"; "{{OFFSET_VALUE}};";
}); });
code_ += "";
if (struct_def.fields.vec.size() > 0) { code_ += ""; }
if (parser_.opts.generate_name_strings) { if (parser_.opts.generate_name_strings) {
GenFullyQualifiedNameGetter(struct_def, struct_def.name); GenFullyQualifiedNameGetter(struct_def, struct_def.name);
@@ -1768,7 +1722,6 @@ class RustGenerator : public BaseGenerator {
"Self {"; "Self {";
code_ += " {{STRUCT_TY}} { _tab: table }"; code_ += " {{STRUCT_TY}} { _tab: table }";
code_ += " }"; code_ += " }";
code_ += "";
// Generate a convenient create* function that uses the above builder // Generate a convenient create* function that uses the above builder
// to create a table in one function call. // to create a table in one function call.
@@ -1780,8 +1733,7 @@ class RustGenerator : public BaseGenerator {
" pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: " " pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: "
"::flatbuffers::Allocator + 'bldr>("; "::flatbuffers::Allocator + 'bldr>(";
code_ += code_ +=
" _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, " " _fbb: &'mut_bldr mut ::flatbuffers::FlatBufferBuilder<'bldr, A>,";
"A>,";
code_ += " {{MAYBE_US}}args: &'args {{STRUCT_TY}}Args{{MAYBE_LT}}"; code_ += " {{MAYBE_US}}args: &'args {{STRUCT_TY}}Args{{MAYBE_LT}}";
code_ += " ) -> ::flatbuffers::WIPOffset<{{STRUCT_TY}}<'bldr>> {"; code_ += " ) -> ::flatbuffers::WIPOffset<{{STRUCT_TY}}<'bldr>> {";
@@ -1807,7 +1759,6 @@ class RustGenerator : public BaseGenerator {
code_ += " builder.finish()"; code_ += " builder.finish()";
code_ += " }"; code_ += " }";
code_ += ""; code_ += "";
// Generate Object API Packer function. // Generate Object API Packer function.
if (parser_.opts.generate_object_based_api) { if (parser_.opts.generate_object_based_api) {
// TODO(cneo): Replace more for loops with ForAllX stuff. // TODO(cneo): Replace more for loops with ForAllX stuff.
@@ -1907,7 +1858,6 @@ class RustGenerator : public BaseGenerator {
code_ += " };"; code_ += " };";
} }
}); });
code_ += " {{STRUCT_OTY}} {"; code_ += " {{STRUCT_OTY}} {";
ForAllObjectTableFields(struct_def, [&](const FieldDef& field) { ForAllObjectTableFields(struct_def, [&](const FieldDef& field) {
if (field.value.type.base_type == BASE_TYPE_UTYPE) return; if (field.value.type.base_type == BASE_TYPE_UTYPE) return;
@@ -1917,6 +1867,8 @@ class RustGenerator : public BaseGenerator {
code_ += " }"; code_ += " }";
} }
if (struct_def.fields.vec.size() > 0) code_ += "";
// Generate the accessors. Each has one of two forms: // Generate the accessors. Each has one of two forms:
// //
// If a value can be None: // If a value can be None:
@@ -1929,7 +1881,6 @@ class RustGenerator : public BaseGenerator {
// self._tab.get::<internal_type>(offset, defaultval).unwrap() // self._tab.get::<internal_type>(offset, defaultval).unwrap()
// } // }
ForAllTableFields(struct_def, [&](const FieldDef& field) { ForAllTableFields(struct_def, [&](const FieldDef& field) {
code_ += "";
code_.SetValue("RETURN_TYPE", code_.SetValue("RETURN_TYPE",
GenTableAccessorFuncReturnType(field, "'a")); GenTableAccessorFuncReturnType(field, "'a"));
@@ -1960,7 +1911,6 @@ class RustGenerator : public BaseGenerator {
FLATBUFFERS_ASSERT(nested_root); // Guaranteed to exist by parser. FLATBUFFERS_ASSERT(nested_root); // Guaranteed to exist by parser.
code_.SetValue("NESTED", WrapInNameSpace(*nested_root)); code_.SetValue("NESTED", WrapInNameSpace(*nested_root));
code_ += "";
code_ += "pub fn {{FIELD}}_nested_flatbuffer(&'a self) -> \\"; code_ += "pub fn {{FIELD}}_nested_flatbuffer(&'a self) -> \\";
if (field.IsRequired()) { if (field.IsRequired()) {
code_ += "{{NESTED}}<'a> {"; code_ += "{{NESTED}}<'a> {";
@@ -1980,8 +1930,7 @@ class RustGenerator : public BaseGenerator {
code_ += " // Created from a valid Table for this object"; code_ += " // Created from a valid Table for this object";
code_ += " // Which contains a valid flatbuffer in this slot"; code_ += " // Which contains a valid flatbuffer in this slot";
code_ += code_ +=
" unsafe { " " unsafe { <::flatbuffers::ForwardsUOffset<{{NESTED}}<'a>>>"
"<::flatbuffers::ForwardsUOffset<{{NESTED}}<'a>>>"
"::follow(data.bytes(), 0) }"; "::follow(data.bytes(), 0) }";
code_ += " })"; code_ += " })";
} }
@@ -1995,7 +1944,6 @@ class RustGenerator : public BaseGenerator {
ForAllUnionVariantsBesidesNone( ForAllUnionVariantsBesidesNone(
*field.value.type.enum_def, [&](const EnumVal& unused) { *field.value.type.enum_def, [&](const EnumVal& unused) {
(void)unused; (void)unused;
code_ += "";
code_ += "#[inline]"; code_ += "#[inline]";
code_ += "#[allow(non_snake_case)]"; code_ += "#[allow(non_snake_case)]";
code_ += code_ +=
@@ -2028,13 +1976,10 @@ class RustGenerator : public BaseGenerator {
} else { } else {
code_ += " self.{{FIELD}}().map(|t| {"; code_ += " self.{{FIELD}}().map(|t| {";
code_ += " // Safety:"; code_ += " // Safety:";
code_ += " // Created from a valid Table for this object";
code_ += " // Which contains a valid union in this slot";
code_ += code_ +=
" // Created from a valid Table for this object"; " unsafe { {{U_ELEMENT_TABLE_TYPE}}::init_from_table(t) "
code_ +=
" // Which contains a valid union in this slot";
code_ +=
" unsafe { "
"{{U_ELEMENT_TABLE_TYPE}}::init_from_table(t) "
"}"; "}";
code_ += " })"; code_ += " })";
} }
@@ -2042,6 +1987,7 @@ class RustGenerator : public BaseGenerator {
code_ += " None"; code_ += " None";
code_ += " }"; code_ += " }";
code_ += "}"; code_ += "}";
code_ += "";
}); });
}); });
code_ += "}"; // End of table impl. code_ += "}"; // End of table impl.
@@ -2053,7 +1999,7 @@ class RustGenerator : public BaseGenerator {
code_ += " fn run_verifier("; code_ += " fn run_verifier(";
code_ += " v: &mut ::flatbuffers::Verifier, pos: usize"; code_ += " v: &mut ::flatbuffers::Verifier, pos: usize";
code_ += " ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {"; code_ += " ) -> Result<(), ::flatbuffers::InvalidFlatbuffer> {";
code_ += " v.visit_table(pos)?"; code_ += " v.visit_table(pos)?\\";
// Escape newline and insert it onthe next line so we can end the builder // Escape newline and insert it onthe next line so we can end the builder
// with a nice semicolon. // with a nice semicolon.
ForAllTableFields(struct_def, [&](const FieldDef& field) { ForAllTableFields(struct_def, [&](const FieldDef& field) {
@@ -2064,8 +2010,8 @@ class RustGenerator : public BaseGenerator {
// All types besides unions. // All types besides unions.
code_.SetValue("TY", FollowType(field.value.type, "'_")); code_.SetValue("TY", FollowType(field.value.type, "'_"));
code_ += code_ +=
" .visit_field::<{{TY}}>(\"{{FIELD}}\", " "\n .visit_field::<{{TY}}>(\"{{FIELD}}\", "
"Self::{{OFFSET_NAME}}, {{IS_REQ}})?"; "Self::{{OFFSET_NAME}}, {{IS_REQ}})?\\";
return; return;
} }
// Unions. // Unions.
@@ -2076,7 +2022,7 @@ class RustGenerator : public BaseGenerator {
code_.SetValue("UNION_TYPE_METHOD", code_.SetValue("UNION_TYPE_METHOD",
namer_.LegacyRustUnionTypeMethod(field)); namer_.LegacyRustUnionTypeMethod(field));
code_ += code_ +=
" .visit_union::<{{UNION_TYPE}}, _>(" "\n .visit_union::<{{UNION_TYPE}}, _>("
"\"{{UNION_TYPE_METHOD}}\", Self::{{UNION_TYPE_OFFSET_NAME}}, " "\"{{UNION_TYPE_METHOD}}\", Self::{{UNION_TYPE_OFFSET_NAME}}, "
"\"{{FIELD}}\", Self::{{OFFSET_NAME}}, {{IS_REQ}}, " "\"{{FIELD}}\", Self::{{OFFSET_NAME}}, {{IS_REQ}}, "
"|key, v, pos| {"; "|key, v, pos| {";
@@ -2084,20 +2030,18 @@ class RustGenerator : public BaseGenerator {
ForAllUnionVariantsBesidesNone(union_def, [&](const EnumVal& unused) { ForAllUnionVariantsBesidesNone(union_def, [&](const EnumVal& unused) {
(void)unused; (void)unused;
code_ += code_ +=
" {{U_ELEMENT_ENUM_TYPE}} => " " {{U_ELEMENT_ENUM_TYPE}} => v.verify_union_variant::"
"v.verify_union_variant::"
"<::flatbuffers::ForwardsUOffset<{{U_ELEMENT_TABLE_TYPE}}>>(" "<::flatbuffers::ForwardsUOffset<{{U_ELEMENT_TABLE_TYPE}}>>("
"\"{{U_ELEMENT_ENUM_TYPE}}\", pos),"; "\"{{U_ELEMENT_ENUM_TYPE}}\", pos),";
}); });
code_ += " _ => Ok(()),"; code_ += " _ => Ok(()),";
code_ += " }"; code_ += " }";
code_ += " })?"; code_ += " })?\\";
}); });
code_ += " .finish();"; code_ += "\n .finish();";
code_ += " Ok(())"; code_ += " Ok(())";
code_ += " }"; code_ += " }";
code_ += "}"; code_ += "}";
code_ += "";
// Generate an args struct: // Generate an args struct:
code_.SetValue("MAYBE_LT", code_.SetValue("MAYBE_LT",
@@ -2108,7 +2052,6 @@ class RustGenerator : public BaseGenerator {
code_ += " pub {{FIELD}}: {{PARAM_TYPE}},"; code_ += " pub {{FIELD}}: {{PARAM_TYPE}},";
}); });
code_ += "}"; code_ += "}";
code_ += "";
// Generate an impl of Default for the *Args type: // Generate an impl of Default for the *Args type:
code_ += "impl<'a> Default for {{STRUCT_TY}}Args{{MAYBE_LT}} {"; code_ += "impl<'a> Default for {{STRUCT_TY}}Args{{MAYBE_LT}} {";
@@ -2130,19 +2073,17 @@ class RustGenerator : public BaseGenerator {
code_.SetValue("NUM_FIELDS", NumToString(numFields)); code_.SetValue("NUM_FIELDS", NumToString(numFields));
code_ += "impl Serialize for {{STRUCT_TY}}<'_> {"; code_ += "impl Serialize for {{STRUCT_TY}}<'_> {";
code_ += code_ +=
" fn serialize<S>(&self, serializer: S) -> Result<S::Ok, " " fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>";
"S::Error>";
code_ += " where"; code_ += " where";
code_ += " S: Serializer,"; code_ += " S: Serializer,";
code_ += " {"; code_ += " {";
if (numFields == 0) { if (numFields == 0) {
code_ += code_ +=
" let s = serializer.serialize_struct(\"{{STRUCT_TY}}\", " " let s = serializer.serialize_struct(\"{{STRUCT_TY}}\", 0)?;";
"0)?;";
} else { } else {
code_ += code_ +=
" let mut s = " " let mut s = serializer.serialize_struct(\"{{STRUCT_TY}}\", "
"serializer.serialize_struct(\"{{STRUCT_TY}}\", {{NUM_FIELDS}})?;"; "{{NUM_FIELDS}})?;";
} }
ForAllTableFields(struct_def, [&](const FieldDef& field) { ForAllTableFields(struct_def, [&](const FieldDef& field) {
const Type& type = field.value.type; const Type& type = field.value.type;
@@ -2204,7 +2145,6 @@ class RustGenerator : public BaseGenerator {
" start_: ::flatbuffers::WIPOffset<" " start_: ::flatbuffers::WIPOffset<"
"::flatbuffers::TableUnfinishedWIPOffset>,"; "::flatbuffers::TableUnfinishedWIPOffset>,";
code_ += "}"; code_ += "}";
code_ += "";
// Generate builder functions: // Generate builder functions:
code_ += code_ +=
@@ -2240,7 +2180,6 @@ class RustGenerator : public BaseGenerator {
code_ += " {{FUNC_BODY}}({{FIELD_OFFSET}}, {{FIELD}});"; code_ += " {{FUNC_BODY}}({{FIELD_OFFSET}}, {{FIELD}});";
} }
code_ += "}"; code_ += "}";
code_ += "";
}); });
// Struct initializer (all fields required); // Struct initializer (all fields required);
@@ -2256,7 +2195,6 @@ class RustGenerator : public BaseGenerator {
code_ += " start_: start,"; code_ += " start_: start,";
code_ += " }"; code_ += " }";
code_ += " }"; code_ += " }";
code_ += "";
// finish() function. // finish() function.
code_ += " #[inline]"; code_ += " #[inline]";
@@ -2320,8 +2258,6 @@ class RustGenerator : public BaseGenerator {
} }
void GenTableObject(const StructDef& table) { void GenTableObject(const StructDef& table) {
code_ += "";
code_.SetValue("STRUCT_OTY", namer_.ObjectType(table)); code_.SetValue("STRUCT_OTY", namer_.ObjectType(table));
code_.SetValue("STRUCT_TY", namer_.Type(table)); code_.SetValue("STRUCT_TY", namer_.Type(table));
@@ -2336,7 +2272,6 @@ class RustGenerator : public BaseGenerator {
code_ += "pub {{FIELD}}: {{FIELD_OTY}},"; code_ += "pub {{FIELD}}: {{FIELD_OTY}},";
}); });
code_ += "}"; code_ += "}";
code_ += "";
code_ += "impl Default for {{STRUCT_OTY}} {"; code_ += "impl Default for {{STRUCT_OTY}} {";
code_ += " fn default() -> Self {"; code_ += " fn default() -> Self {";
@@ -2349,7 +2284,6 @@ class RustGenerator : public BaseGenerator {
code_ += " }"; code_ += " }";
code_ += " }"; code_ += " }";
code_ += "}"; code_ += "}";
code_ += "";
// TODO(cneo): Generate defaults for Native tables. However, since structs // TODO(cneo): Generate defaults for Native tables. However, since structs
// may be required, they, and therefore enums need defaults. // may be required, they, and therefore enums need defaults.
@@ -2496,8 +2430,6 @@ class RustGenerator : public BaseGenerator {
code_.SetValue("KEY_TYPE", GenTableAccessorFuncReturnType(field, "")); code_.SetValue("KEY_TYPE", GenTableAccessorFuncReturnType(field, ""));
code_.SetValue("REF", IsString(field.value.type) ? "" : "&"); code_.SetValue("REF", IsString(field.value.type) ? "" : "&");
code_ += "";
code_ += "#[inline]"; code_ += "#[inline]";
code_ += code_ +=
"pub fn key_compare_less_than(&self, o: &{{STRUCT_TY}}) -> " "pub fn key_compare_less_than(&self, o: &{{STRUCT_TY}}) -> "
@@ -2505,7 +2437,6 @@ class RustGenerator : public BaseGenerator {
code_ += " self.{{FIELD}}() < o.{{FIELD}}()"; code_ += " self.{{FIELD}}() < o.{{FIELD}}()";
code_ += "}"; code_ += "}";
code_ += ""; code_ += "";
code_ += "#[inline]"; code_ += "#[inline]";
code_ += code_ +=
"pub fn key_compare_with_value(&self, val: {{KEY_TYPE}}) -> " "pub fn key_compare_with_value(&self, val: {{KEY_TYPE}}) -> "
@@ -2518,69 +2449,60 @@ class RustGenerator : public BaseGenerator {
// Generate functions for accessing the root table object. This function // Generate functions for accessing the root table object. This function
// must only be called if the root table is defined. // must only be called if the root table is defined.
void GenRootTableFuncs(const StructDef& struct_def) { void GenRootTableFuncs(const StructDef& struct_def) {
code_ += "";
FLATBUFFERS_ASSERT(parser_.root_struct_def_ && "root table not defined"); FLATBUFFERS_ASSERT(parser_.root_struct_def_ && "root table not defined");
code_.SetValue("STRUCT_TY", namer_.Type(struct_def)); code_.SetValue("STRUCT_TY", namer_.Type(struct_def));
code_.SetValue("STRUCT_FN", namer_.Function(struct_def)); code_.SetValue("STRUCT_FN", namer_.Function(struct_def));
code_.SetValue("STRUCT_CONST", namer_.Constant(struct_def.name)); code_.SetValue("STRUCT_CONST", namer_.Constant(struct_def.name));
// Default verifier root fns. // Default verifier root fns.
code_ += "#[inline]";
code_ += "/// Verifies that a buffer of bytes contains a `{{STRUCT_TY}}`"; code_ += "/// Verifies that a buffer of bytes contains a `{{STRUCT_TY}}`";
code_ += "/// and returns it."; code_ += "/// and returns it.";
code_ += "/// Note that verification is still experimental and may not"; code_ += "/// Note that verification is still experimental and may not";
code_ += "/// catch every error, or be maximally performant. For the"; code_ += "/// catch every error, or be maximally performant. For the";
code_ += "/// previous, unchecked, behavior use"; code_ += "/// previous, unchecked, behavior use";
code_ += "/// `root_as_{{STRUCT_FN}}_unchecked`."; code_ += "/// `root_as_{{STRUCT_FN}}_unchecked`.";
code_ += "#[inline]";
code_ += code_ +=
"pub fn root_as_{{STRUCT_FN}}(buf: &[u8]) " "pub fn root_as_{{STRUCT_FN}}(buf: &[u8]) "
"-> Result<{{STRUCT_TY}}<'_>, ::flatbuffers::InvalidFlatbuffer> {"; "-> Result<{{STRUCT_TY}}<'_>, ::flatbuffers::InvalidFlatbuffer> {";
code_ += " ::flatbuffers::root::<{{STRUCT_TY}}>(buf)"; code_ += " ::flatbuffers::root::<{{STRUCT_TY}}>(buf)";
code_ += "}"; code_ += "}";
code_ += ""; code_ += "#[inline]";
code_ += "/// Verifies that a buffer of bytes contains a size prefixed"; code_ += "/// Verifies that a buffer of bytes contains a size prefixed";
code_ += "/// `{{STRUCT_TY}}` and returns it."; code_ += "/// `{{STRUCT_TY}}` and returns it.";
code_ += "/// Note that verification is still experimental and may not"; code_ += "/// Note that verification is still experimental and may not";
code_ += "/// catch every error, or be maximally performant. For the"; code_ += "/// catch every error, or be maximally performant. For the";
code_ += "/// previous, unchecked, behavior use"; code_ += "/// previous, unchecked, behavior use";
code_ += "/// `size_prefixed_root_as_{{STRUCT_FN}}_unchecked`."; code_ += "/// `size_prefixed_root_as_{{STRUCT_FN}}_unchecked`.";
code_ += "#[inline]";
code_ += code_ +=
"pub fn size_prefixed_root_as_{{STRUCT_FN}}" "pub fn size_prefixed_root_as_{{STRUCT_FN}}"
"(buf: &[u8]) -> Result<{{STRUCT_TY}}<'_>, " "(buf: &[u8]) -> Result<{{STRUCT_TY}}<'_>, "
"::flatbuffers::InvalidFlatbuffer> {"; "::flatbuffers::InvalidFlatbuffer> {";
code_ += " ::flatbuffers::size_prefixed_root::<{{STRUCT_TY}}>(buf)"; code_ += " ::flatbuffers::size_prefixed_root::<{{STRUCT_TY}}>(buf)";
code_ += "}"; code_ += "}";
code_ += "";
// Verifier with options root fns. // Verifier with options root fns.
code_ += "#[inline]";
code_ += "/// Verifies, with the given options, that a buffer of bytes"; code_ += "/// Verifies, with the given options, that a buffer of bytes";
code_ += "/// contains a `{{STRUCT_TY}}` and returns it."; code_ += "/// contains a `{{STRUCT_TY}}` and returns it.";
code_ += "/// Note that verification is still experimental and may not"; code_ += "/// Note that verification is still experimental and may not";
code_ += "/// catch every error, or be maximally performant. For the"; code_ += "/// catch every error, or be maximally performant. For the";
code_ += "/// previous, unchecked, behavior use"; code_ += "/// previous, unchecked, behavior use";
code_ += "/// `root_as_{{STRUCT_FN}}_unchecked`."; code_ += "/// `root_as_{{STRUCT_FN}}_unchecked`.";
code_ += "#[inline]";
code_ += "pub fn root_as_{{STRUCT_FN}}_with_opts<'b, 'o>("; code_ += "pub fn root_as_{{STRUCT_FN}}_with_opts<'b, 'o>(";
code_ += " opts: &'o ::flatbuffers::VerifierOptions,"; code_ += " opts: &'o ::flatbuffers::VerifierOptions,";
code_ += " buf: &'b [u8],"; code_ += " buf: &'b [u8],";
code_ += code_ +=
") -> Result<{{STRUCT_TY}}<'b>, ::flatbuffers::InvalidFlatbuffer>" ") -> Result<{{STRUCT_TY}}<'b>, ::flatbuffers::InvalidFlatbuffer>"
" {"; " {";
code_ += code_ += " ::flatbuffers::root_with_opts::<{{STRUCT_TY}}<'b>>(opts, buf)";
" ::flatbuffers::root_with_opts::<{{STRUCT_TY}}<'b>>(opts, buf)";
code_ += "}"; code_ += "}";
code_ += ""; code_ += "#[inline]";
code_ += "/// Verifies, with the given verifier options, that a buffer of"; code_ += "/// Verifies, with the given verifier options, that a buffer of";
code_ += "/// bytes contains a size prefixed `{{STRUCT_TY}}` and returns"; code_ += "/// bytes contains a size prefixed `{{STRUCT_TY}}` and returns";
code_ += "/// it. Note that verification is still experimental and may not"; code_ += "/// it. Note that verification is still experimental and may not";
code_ += "/// catch every error, or be maximally performant. For the"; code_ += "/// catch every error, or be maximally performant. For the";
code_ += "/// previous, unchecked, behavior use"; code_ += "/// previous, unchecked, behavior use";
code_ += "/// `root_as_{{STRUCT_FN}}_unchecked`."; code_ += "/// `root_as_{{STRUCT_FN}}_unchecked`.";
code_ += "#[inline]";
code_ += code_ +=
"pub fn size_prefixed_root_as_{{STRUCT_FN}}_with_opts" "pub fn size_prefixed_root_as_{{STRUCT_FN}}_with_opts"
"<'b, 'o>("; "<'b, 'o>(";
@@ -2593,9 +2515,8 @@ class RustGenerator : public BaseGenerator {
" ::flatbuffers::size_prefixed_root_with_opts::<{{STRUCT_TY}}" " ::flatbuffers::size_prefixed_root_with_opts::<{{STRUCT_TY}}"
"<'b>>(opts, buf)"; "<'b>>(opts, buf)";
code_ += "}"; code_ += "}";
code_ += "";
// Unchecked root fns. // Unchecked root fns.
code_ += "#[inline]";
code_ += code_ +=
"/// Assumes, without verification, that a buffer of bytes " "/// Assumes, without verification, that a buffer of bytes "
"contains a {{STRUCT_TY}} and returns it."; "contains a {{STRUCT_TY}} and returns it.";
@@ -2603,15 +2524,12 @@ class RustGenerator : public BaseGenerator {
code_ += code_ +=
"/// Callers must trust the given bytes do indeed contain a valid" "/// Callers must trust the given bytes do indeed contain a valid"
" `{{STRUCT_TY}}`."; " `{{STRUCT_TY}}`.";
code_ += "#[inline]";
code_ += code_ +=
"pub unsafe fn root_as_{{STRUCT_FN}}_unchecked" "pub unsafe fn root_as_{{STRUCT_FN}}_unchecked"
"(buf: &[u8]) -> {{STRUCT_TY}}<'_> {"; "(buf: &[u8]) -> {{STRUCT_TY}}<'_> {";
code_ += code_ += " unsafe { ::flatbuffers::root_unchecked::<{{STRUCT_TY}}>(buf) }";
" unsafe { ::flatbuffers::root_unchecked::<{{STRUCT_TY}}>(buf) }";
code_ += "}"; code_ += "}";
code_ += ""; code_ += "#[inline]";
code_ += code_ +=
"/// Assumes, without verification, that a buffer of bytes " "/// Assumes, without verification, that a buffer of bytes "
"contains a size prefixed {{STRUCT_TY}} and returns it."; "contains a size prefixed {{STRUCT_TY}} and returns it.";
@@ -2619,7 +2537,6 @@ class RustGenerator : public BaseGenerator {
code_ += code_ +=
"/// Callers must trust the given bytes do indeed contain a valid" "/// Callers must trust the given bytes do indeed contain a valid"
" size prefixed `{{STRUCT_TY}}`."; " size prefixed `{{STRUCT_TY}}`.";
code_ += "#[inline]";
code_ += code_ +=
"pub unsafe fn size_prefixed_root_as_{{STRUCT_FN}}" "pub unsafe fn size_prefixed_root_as_{{STRUCT_FN}}"
"_unchecked(buf: &[u8]) -> {{STRUCT_TY}}<'_> {"; "_unchecked(buf: &[u8]) -> {{STRUCT_TY}}<'_> {";
@@ -2628,7 +2545,6 @@ class RustGenerator : public BaseGenerator {
"::flatbuffers::size_prefixed_root_unchecked::<{{STRUCT_TY}}>" "::flatbuffers::size_prefixed_root_unchecked::<{{STRUCT_TY}}>"
"(buf) }"; "(buf) }";
code_ += "}"; code_ += "}";
code_ += "";
if (parser_.file_identifier_.length()) { if (parser_.file_identifier_.length()) {
// Declare the identifier // Declare the identifier
@@ -2667,8 +2583,7 @@ class RustGenerator : public BaseGenerator {
"pub fn finish_{{STRUCT_FN}}_buffer<'a, 'b, A: " "pub fn finish_{{STRUCT_FN}}_buffer<'a, 'b, A: "
"::flatbuffers::Allocator + 'a>("; "::flatbuffers::Allocator + 'a>(";
code_ += " fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,"; code_ += " fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,";
code_ += " root: ::flatbuffers::WIPOffset<{{STRUCT_TY}}<'a>>"; code_ += " root: ::flatbuffers::WIPOffset<{{STRUCT_TY}}<'a>>) {";
code_ += ") {";
if (parser_.file_identifier_.length()) { if (parser_.file_identifier_.length()) {
code_ += " fbb.finish(root, Some({{STRUCT_CONST}}_IDENTIFIER));"; code_ += " fbb.finish(root, Some({{STRUCT_CONST}}_IDENTIFIER));";
} else { } else {
@@ -2679,10 +2594,9 @@ class RustGenerator : public BaseGenerator {
code_ += "#[inline]"; code_ += "#[inline]";
code_ += code_ +=
"pub fn finish_size_prefixed_{{STRUCT_FN}}_buffer" "pub fn finish_size_prefixed_{{STRUCT_FN}}_buffer"
"<'a, 'b, A: ::flatbuffers::Allocator + 'a>("; "<'a, 'b, A: ::flatbuffers::Allocator + 'a>("
code_ += " fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>,"; "fbb: &'b mut ::flatbuffers::FlatBufferBuilder<'a, A>, "
code_ += " root: ::flatbuffers::WIPOffset<{{STRUCT_TY}}<'a>>"; "root: ::flatbuffers::WIPOffset<{{STRUCT_TY}}<'a>>) {";
code_ += ") {";
if (parser_.file_identifier_.length()) { if (parser_.file_identifier_.length()) {
code_ += code_ +=
" fbb.finish_size_prefixed(root, " " fbb.finish_size_prefixed(root, "
@@ -2738,8 +2652,6 @@ class RustGenerator : public BaseGenerator {
} }
// Generate an accessor struct with constructor for a flatbuffers struct. // Generate an accessor struct with constructor for a flatbuffers struct.
void GenStruct(const StructDef& struct_def) { void GenStruct(const StructDef& struct_def) {
code_ += "";
const bool is_private = const bool is_private =
parser_.opts.no_leak_private_annotations && parser_.opts.no_leak_private_annotations &&
(struct_def.attributes.Lookup("private") != nullptr); (struct_def.attributes.Lookup("private") != nullptr);
@@ -2762,14 +2674,11 @@ class RustGenerator : public BaseGenerator {
code_ += "#[repr(transparent)]"; code_ += "#[repr(transparent)]";
code_ += "#[derive(Clone, Copy, PartialEq)]"; code_ += "#[derive(Clone, Copy, PartialEq)]";
code_ += "{{ACCESS_TYPE}} struct {{STRUCT_TY}}(pub [u8; {{STRUCT_SIZE}}]);"; code_ += "{{ACCESS_TYPE}} struct {{STRUCT_TY}}(pub [u8; {{STRUCT_SIZE}}]);";
code_ += "";
code_ += "impl Default for {{STRUCT_TY}} { "; code_ += "impl Default for {{STRUCT_TY}} { ";
code_ += " fn default() -> Self { "; code_ += " fn default() -> Self { ";
code_ += " Self([0; {{STRUCT_SIZE}}])"; code_ += " Self([0; {{STRUCT_SIZE}}])";
code_ += " }"; code_ += " }";
code_ += "}"; code_ += "}";
code_ += "";
// Debug for structs. // Debug for structs.
code_ += "impl ::core::fmt::Debug for {{STRUCT_TY}} {"; code_ += "impl ::core::fmt::Debug for {{STRUCT_TY}} {";
@@ -2790,21 +2699,15 @@ class RustGenerator : public BaseGenerator {
// Follow for the value type, Follow for the reference type, Push for the // Follow for the value type, Follow for the reference type, Push for the
// value type, and Push for the reference type. // value type, and Push for the reference type.
code_ += "impl ::flatbuffers::SimpleToVerifyInSlice for {{STRUCT_TY}} {}"; code_ += "impl ::flatbuffers::SimpleToVerifyInSlice for {{STRUCT_TY}} {}";
code_ += "";
code_ += "impl<'a> ::flatbuffers::Follow<'a> for {{STRUCT_TY}} {"; code_ += "impl<'a> ::flatbuffers::Follow<'a> for {{STRUCT_TY}} {";
code_ += " type Inner = &'a {{STRUCT_TY}};"; code_ += " type Inner = &'a {{STRUCT_TY}};";
code_ += "";
code_ += " #[inline]"; code_ += " #[inline]";
code_ += " unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {"; code_ += " unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {";
code_ += " unsafe { <&'a {{STRUCT_TY}}>::follow(buf, loc) }"; code_ += " unsafe { <&'a {{STRUCT_TY}}>::follow(buf, loc) }";
code_ += " }"; code_ += " }";
code_ += "}"; code_ += "}";
code_ += "";
code_ += "impl<'a> ::flatbuffers::Follow<'a> for &'a {{STRUCT_TY}} {"; code_ += "impl<'a> ::flatbuffers::Follow<'a> for &'a {{STRUCT_TY}} {";
code_ += " type Inner = &'a {{STRUCT_TY}};"; code_ += " type Inner = &'a {{STRUCT_TY}};";
code_ += "";
code_ += " #[inline]"; code_ += " #[inline]";
code_ += " unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {"; code_ += " unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {";
code_ += code_ +=
@@ -2812,11 +2715,8 @@ class RustGenerator : public BaseGenerator {
"loc) }"; "loc) }";
code_ += " }"; code_ += " }";
code_ += "}"; code_ += "}";
code_ += "";
code_ += "impl<'b> ::flatbuffers::Push for {{STRUCT_TY}} {"; code_ += "impl<'b> ::flatbuffers::Push for {{STRUCT_TY}} {";
code_ += " type Output = {{STRUCT_TY}};"; code_ += " type Output = {{STRUCT_TY}};";
code_ += "";
code_ += " #[inline]"; code_ += " #[inline]";
code_ += " unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {"; code_ += " unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {";
code_ += code_ +=
@@ -2825,8 +2725,6 @@ class RustGenerator : public BaseGenerator {
"{{STRUCT_TY}} as *const u8, <Self as ::flatbuffers::Push>::size()) };"; "{{STRUCT_TY}} as *const u8, <Self as ::flatbuffers::Push>::size()) };";
code_ += " dst.copy_from_slice(src);"; code_ += " dst.copy_from_slice(src);";
code_ += " }"; code_ += " }";
code_ += "";
code_ += " #[inline]"; code_ += " #[inline]";
code_ += " fn alignment() -> ::flatbuffers::PushAlignment {"; code_ += " fn alignment() -> ::flatbuffers::PushAlignment {";
code_ += " ::flatbuffers::PushAlignment::new({{ALIGN}})"; code_ += " ::flatbuffers::PushAlignment::new({{ALIGN}})";
@@ -2852,8 +2750,7 @@ class RustGenerator : public BaseGenerator {
code_.SetValue("NUM_FIELDS", NumToString(numFields)); code_.SetValue("NUM_FIELDS", NumToString(numFields));
code_ += "impl Serialize for {{STRUCT_TY}} {"; code_ += "impl Serialize for {{STRUCT_TY}} {";
code_ += code_ +=
" fn serialize<S>(&self, serializer: S) -> Result<S::Ok, " " fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>";
"S::Error>";
code_ += " where"; code_ += " where";
code_ += " S: Serializer,"; code_ += " S: Serializer,";
code_ += " {"; code_ += " {";
@@ -3037,61 +2934,18 @@ class RustGenerator : public BaseGenerator {
} }
code_ += "}"; // End impl Struct methods. code_ += "}"; // End impl Struct methods.
code_ += "";
// Generate Struct Object. // Generate Struct Object.
if (parser_.opts.generate_object_based_api) { if (parser_.opts.generate_object_based_api) {
// Struct declaration // Struct declaration
code_ += ""; code_ += "#[derive(Debug, Clone, PartialEq, Default)]";
code_ += "#[derive(Debug, Clone, PartialEq)]";
code_ += "{{ACCESS_TYPE}} struct {{STRUCT_OTY}} {"; code_ += "{{ACCESS_TYPE}} struct {{STRUCT_OTY}} {";
ForAllStructFields(struct_def, [&](const FieldDef& field) { ForAllStructFields(struct_def, [&](const FieldDef& field) {
(void)field; // unused. (void)field; // unused.
code_ += "pub {{FIELD}}: {{FIELD_OTY}},"; code_ += "pub {{FIELD}}: {{FIELD_OTY}},";
}); });
code_ += "}"; code_ += "}";
// Manual impl Default to avoid issues with arrays > 32 elements
// where #[derive(Default)] fails on older Rust versions.
code_ += "impl Default for {{STRUCT_OTY}} {";
code_ += " fn default() -> Self {";
code_ += " Self {";
ForAllStructFields(struct_def, [&](const FieldDef& field) {
const auto full_type = GetFullType(field.value.type);
switch (full_type) {
case ftArrayOfBuiltin: {
// Use the correct zero literal for each element type:
// bool -> false, float/double -> 0.0, integers -> 0
const auto elem_type = field.value.type.VectorType().base_type;
std::string zero;
if (elem_type == BASE_TYPE_BOOL) {
zero = "false";
} else if (IsFloat(elem_type)) {
zero = "0.0";
} else {
zero = "0";
}
code_ += " {{FIELD}}: [" + zero + "; " +
NumToString(field.value.type.fixed_length) + "],";
break;
}
case ftArrayOfEnum:
case ftArrayOfStruct: {
code_ +=
" {{FIELD}}: ::flatbuffers::array_init(|_| "
"Default::default()),";
break;
}
default: {
std::string default_value =
GetDefaultValue(field, kObject);
code_ += " {{FIELD}}: " + default_value + ",";
break;
}
}
});
code_ += " }";
code_ += " }";
code_ += "}";
code_ += "";
// The `pack` method that turns the native struct into its Flatbuffers // The `pack` method that turns the native struct into its Flatbuffers
// counterpart. // counterpart.
code_ += "impl {{STRUCT_OTY}} {"; code_ += "impl {{STRUCT_OTY}} {";
@@ -3115,13 +2969,16 @@ class RustGenerator : public BaseGenerator {
code_ += " )"; code_ += " )";
code_ += " }"; code_ += " }";
code_ += "}"; code_ += "}";
code_ += "";
} }
} }
void GenNamespaceImports() { void GenNamespaceImports(const int white_spaces) {
// DO not use global attributes (i.e. #![...]) since it interferes // DO not use global attributes (i.e. #![...]) since it interferes
// with users who include! generated files. // with users who include! generated files.
// See: https://github.com/google/flatbuffers/issues/6261 // See: https://github.com/google/flatbuffers/issues/6261
std::string indent = std::string(white_spaces, ' ');
code_ += "";
if (!parser_.opts.generate_all) { if (!parser_.opts.generate_all) {
for (auto it = parser_.included_files_.begin(); for (auto it = parser_.included_files_.begin();
it != parser_.included_files_.end(); ++it) { it != parser_.included_files_.end(); ++it) {
@@ -3130,24 +2987,24 @@ class RustGenerator : public BaseGenerator {
auto basename = flatbuffers::StripPath(noext); auto basename = flatbuffers::StripPath(noext);
if (parser_.opts.include_prefix.empty()) { if (parser_.opts.include_prefix.empty()) {
code_ += code_ += indent + "use crate::" + basename +
"use crate::" + basename + parser_.opts.filename_suffix + "::*;"; parser_.opts.filename_suffix + "::*;";
} else { } else {
auto prefix = parser_.opts.include_prefix; auto prefix = parser_.opts.include_prefix;
prefix.pop_back(); prefix.pop_back();
code_ += "use crate::" + prefix + "::" + basename + code_ += indent + "use crate::" + prefix + "::" + basename +
parser_.opts.filename_suffix + "::*;"; parser_.opts.filename_suffix + "::*;";
} }
} }
} }
if (parser_.opts.rust_serialize) { if (parser_.opts.rust_serialize) {
code_ += "extern crate serde;"; code_ += indent + "extern crate serde;";
code_ += code_ +=
indent +
"use self::serde::ser::{Serialize, Serializer, SerializeStruct};"; "use self::serde::ser::{Serialize, Serializer, SerializeStruct};";
code_ += "";
} }
code_ += "extern crate alloc;";
} }
// Set up the correct namespace. This opens a namespace if the current // Set up the correct namespace. This opens a namespace if the current
@@ -3178,18 +3035,22 @@ class RustGenerator : public BaseGenerator {
// Close cur_name_space in reverse order to reach the common prefix. // Close cur_name_space in reverse order to reach the common prefix.
// In the previous example, D then C are closed. // In the previous example, D then C are closed.
for (size_t j = old_size; j > common_prefix_size; --j) { for (size_t j = old_size; j > common_prefix_size; --j) {
code_.DecrementIdentLevel();
code_ += "} // pub mod " + cur_name_space_->components[j - 1]; code_ += "} // pub mod " + cur_name_space_->components[j - 1];
} }
if (old_size != common_prefix_size) {
code_ += "";
}
// open namespace parts to reach the ns namespace // open namespace parts to reach the ns namespace
// in the previous example, E, then F, then G are opened // in the previous example, E, then F, then G are opened
for (auto j = common_prefix_size; j != new_size; ++j) { for (auto j = common_prefix_size; j != new_size; ++j) {
code_ += "";
code_ += "#[allow(unused_imports, dead_code)]"; code_ += "#[allow(unused_imports, dead_code)]";
code_ += "pub mod " + namer_.Namespace(ns->components[j]) + " {"; code_ += "pub mod " + namer_.Namespace(ns->components[j]) + " {";
code_.IncrementIdentLevel(); // Generate local namespace imports.
GenNamespaceImports(); GenNamespaceImports(2);
}
if (new_size != common_prefix_size) {
code_ += "";
} }
cur_name_space_ = ns; cur_name_space_ = ns;

View File

@@ -47,7 +47,6 @@ static Namer::Config SwiftDefaultConfig() {
/*object_suffix=*/"T", /*object_suffix=*/"T",
/*keyword_prefix=*/"", /*keyword_prefix=*/"",
/*keyword_suffix=*/"_", /*keyword_suffix=*/"_",
/*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,
/*filenames=*/Case::kKeep, /*filenames=*/Case::kKeep,
/*directories=*/Case::kKeep, /*directories=*/Case::kKeep,
/*output_path=*/"", /*output_path=*/"",
@@ -164,7 +163,7 @@ class SwiftGenerator : public BaseGenerator {
bool generate() { bool generate() {
code_.Clear(); code_.Clear();
code_.SetValue("ACCESS", "_accessor"); code_.SetValue("ACCESS", "_accessor");
code_.SetValue("TABLEOFFSET", "VT"); code_.SetValue("TABLEOFFSET", "VTOFFSET");
code_ += "// " + std::string(FlatBuffersGeneratedWarning()); code_ += "// " + std::string(FlatBuffersGeneratedWarning());
code_ += "// swiftlint:disable all"; code_ += "// swiftlint:disable all";
code_ += "// swiftformat:disable all\n"; code_ += "// swiftformat:disable all\n";
@@ -282,16 +281,9 @@ class SwiftGenerator : public BaseGenerator {
NumToString(field.value.type.VectorType().fixed_length); NumToString(field.value.type.VectorType().fixed_length);
code_.SetValue("FIXEDLENGTH", fixed_length); code_.SetValue("FIXEDLENGTH", fixed_length);
std::string vector_base_type; const auto vector_base_type = IsStruct(field.value.type.VectorType())
if (IsStruct(field.value.type.VectorType())) { ? (type + "()")
vector_base_type = type + "()"; : SwiftConstant(field);
} else if (IsBool(field.value.type.VectorType().base_type)) {
vector_base_type = "false";
} else if (IsFloat(field.value.type.VectorType().base_type)) {
vector_base_type = "0.0";
} else {
vector_base_type = SwiftConstant(field);
}
code_ += "private var _{{FIELDVAR}}: InlineArray<{{FIXEDLENGTH}}, " + code_ += "private var _{{FIELDVAR}}: InlineArray<{{FIXEDLENGTH}}, " +
valueType + ">"; valueType + ">";
@@ -525,7 +517,7 @@ class SwiftGenerator : public BaseGenerator {
void GenTableAccessors(const StructDef& struct_def) { void GenTableAccessors(const StructDef& struct_def) {
// Generate field id constants. // Generate field id constants.
if (struct_def.fields.vec.size() > 0) { if (struct_def.fields.vec.size() > 0) {
code_ += "private struct {{TABLEOFFSET}} {"; code_ += "private enum {{TABLEOFFSET}}: VOffset {";
Indent(); Indent();
for (auto it = struct_def.fields.vec.begin(); for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); ++it) { it != struct_def.fields.vec.end(); ++it) {
@@ -535,8 +527,10 @@ class SwiftGenerator : public BaseGenerator {
} }
code_.SetValue("OFFSET_NAME", namer_.Variable(field)); code_.SetValue("OFFSET_NAME", namer_.Variable(field));
code_.SetValue("OFFSET_VALUE", NumToString(field.value.offset)); code_.SetValue("OFFSET_VALUE", NumToString(field.value.offset));
code_ += "static let {{OFFSET_NAME}}: VOffset = {{OFFSET_VALUE}}"; code_ += "case {{OFFSET_NAME}} = {{OFFSET_VALUE}}";
} }
code_ += "var v: Int32 { Int32(self.rawValue) }";
code_ += "var p: VOffset { self.rawValue }";
Outdent(); Outdent();
code_ += "}"; code_ += "}";
code_ += ""; code_ += "";
@@ -625,8 +619,7 @@ class SwiftGenerator : public BaseGenerator {
if (should_generate_create) { if (should_generate_create) {
code_ += "{{ACCESS_TYPE}} static func create{{SHORT_STRUCTNAME}}("; code_ += "{{ACCESS_TYPE}} static func create{{SHORT_STRUCTNAME}}(";
Indent(); Indent();
code_ += "_ fbb: inout FlatBufferBuilder\\"; code_ += "_ fbb: inout FlatBufferBuilder,";
if (create_func_header.empty() == false) code_ += ",";
for (auto it = create_func_header.begin(); it < create_func_header.end(); for (auto it = create_func_header.begin(); it < create_func_header.end();
++it) { ++it) {
code_ += *it + "\\"; code_ += *it + "\\";
@@ -705,7 +698,7 @@ class SwiftGenerator : public BaseGenerator {
code_ += field.IsOptional() ? (optional_enum + "\\") code_ += field.IsOptional() ? (optional_enum + "\\")
: (is_enum + ", def: {{CONSTANT}}\\"); : (is_enum + ", def: {{CONSTANT}}\\");
code_ += ", at: {{TABLEOFFSET}}.{{OFFSET}}) }"; code_ += ", at: {{TABLEOFFSET}}.{{OFFSET}}.p) }";
const auto default_value = const auto default_value =
IsEnum(field.value.type) IsEnum(field.value.type)
@@ -725,7 +718,7 @@ class SwiftGenerator : public BaseGenerator {
code_ += code_ +=
"{{VALUETYPE}}" + builder_string + "fbb.add(element: {{FIELDVAR}},\\"; "{{VALUETYPE}}" + builder_string + "fbb.add(element: {{FIELDVAR}},\\";
code_ += field.IsOptional() ? "\\" : " def: {{CONSTANT}},"; code_ += field.IsOptional() ? "\\" : " def: {{CONSTANT}},";
code_ += " at: {{TABLEOFFSET}}.{{OFFSET}}) }"; code_ += " at: {{TABLEOFFSET}}.{{OFFSET}}.p) }";
create_func_header.push_back( create_func_header.push_back(
field_var + ": " + nullable_type + " = " + field_var + ": " + nullable_type + " = " +
(field.IsOptional() ? "nil" : default_value)); (field.IsOptional() ? "nil" : default_value));
@@ -736,7 +729,7 @@ class SwiftGenerator : public BaseGenerator {
const auto create_struct = const auto create_struct =
"guard let {{FIELDVAR}} = {{FIELDVAR}} else { return };" "guard let {{FIELDVAR}} = {{FIELDVAR}} else { return };"
" fbb.create(struct: {{FIELDVAR}}, position: " " fbb.create(struct: {{FIELDVAR}}, position: "
"{{TABLEOFFSET}}.{{OFFSET}}) }"; "{{TABLEOFFSET}}.{{OFFSET}}.p) }";
code_ += type + "?" + builder_string + create_struct; code_ += type + "?" + builder_string + create_struct;
/// Optional hard coded since structs are always optional /// Optional hard coded since structs are always optional
create_func_header.push_back(field_var + ": " + type + create_func_header.push_back(field_var + ": " + type +
@@ -753,9 +746,8 @@ class SwiftGenerator : public BaseGenerator {
(field.IsRequired() ? "" : " = Offset()")); (field.IsRequired() ? "" : " = Offset()"));
const auto reader_type = const auto reader_type =
IsStruct(field.value.type) && field.value.type.struct_def->fixed IsStruct(field.value.type) && field.value.type.struct_def->fixed
? "structOffset: {{TABLEOFFSET}}.{{OFFSET}}) }" ? "structOffset: {{TABLEOFFSET}}.{{OFFSET}}.p) }"
: "offset: {{FIELDVAR}}, at: {{TABLEOFFSET}}.{{OFFSET}}) " : "offset: {{FIELDVAR}}, at: {{TABLEOFFSET}}.{{OFFSET}}.p) }";
"}";
code_ += "Offset" + builder_string + "fbb.add(" + reader_type; code_ += "Offset" + builder_string + "fbb.add(" + reader_type;
const auto vectortype = field.value.type.VectorType(); const auto vectortype = field.value.type.VectorType();
@@ -859,10 +851,7 @@ class SwiftGenerator : public BaseGenerator {
break; break;
case BASE_TYPE_STRING: { case BASE_TYPE_STRING: {
const auto sc = SwiftConstant(field); const auto default_string = "\"" + SwiftConstant(field) + "\"";
std::string default_string;
flatbuffers::EscapeString(sc.c_str(), sc.length(), &default_string,
true, false);
code_.SetValue("VALUETYPE", GenType(field.value.type)); code_.SetValue("VALUETYPE", GenType(field.value.type));
code_.SetValue("CONSTANT", field.IsDefault() ? default_string : "nil"); code_.SetValue("CONSTANT", field.IsDefault() ? default_string : "nil");
code_ += GenReaderMainBody(is_required) + GenOffset() + code_ += GenReaderMainBody(is_required) + GenOffset() +
@@ -870,7 +859,7 @@ class SwiftGenerator : public BaseGenerator {
code_ += "{{ACCESS_TYPE}} var {{FIELDVAR}}SegmentArray: [UInt8]" + code_ += "{{ACCESS_TYPE}} var {{FIELDVAR}}SegmentArray: [UInt8]" +
is_required + is_required +
" { return " " { return "
"{{ACCESS}}.getVector(at: {{TABLEOFFSET}}.{{OFFSET}}) }"; "{{ACCESS}}.getVector(at: {{TABLEOFFSET}}.{{OFFSET}}.v) }";
break; break;
} }
case BASE_TYPE_ARRAY: case BASE_TYPE_ARRAY:
@@ -904,7 +893,7 @@ class SwiftGenerator : public BaseGenerator {
code_ += code_ +=
"{{ACCESS_TYPE}} var {{FIELDVAR}}: " "{{ACCESS_TYPE}} var {{FIELDVAR}}: "
"FlatbufferVector<{{VALUETYPE}}> " "FlatbufferVector<{{VALUETYPE}}> "
"{ return {{ACCESS}}.vector(at: {{TABLEOFFSET}}.{{OFFSET}}, " "{ return {{ACCESS}}.vector(at: {{TABLEOFFSET}}.{{OFFSET}}.v, "
"byteSize: {{SIZE}}) }"; "byteSize: {{SIZE}}) }";
} }
@@ -921,7 +910,7 @@ class SwiftGenerator : public BaseGenerator {
code_ += code_ +=
"{{ACCESS_TYPE}} var {{FIELDVAR}}: " "{{ACCESS_TYPE}} var {{FIELDVAR}}: "
"FlatbufferVector<{{VALUETYPE}}_Mutable> " "FlatbufferVector<{{VALUETYPE}}_Mutable> "
"{ return {{ACCESS}}.vector(at: {{TABLEOFFSET}}.{{OFFSET}}, " "{ return {{ACCESS}}.vector(at: {{TABLEOFFSET}}.{{OFFSET}}.v, "
"byteSize: {{SIZE}}) }"; "byteSize: {{SIZE}}) }";
GenUnsafeBufferPointer(field); GenUnsafeBufferPointer(field);
return; return;
@@ -930,8 +919,7 @@ class SwiftGenerator : public BaseGenerator {
if (vectortype.base_type == BASE_TYPE_UNION) { if (vectortype.base_type == BASE_TYPE_UNION) {
code_ += code_ +=
"{{ACCESS_TYPE}} var {{FIELDVAR}}: UnionFlatbufferVector " "{{ACCESS_TYPE}} var {{FIELDVAR}}: UnionFlatbufferVector "
"{ return {{ACCESS}}.unionVector(at: " "{ return {{ACCESS}}.unionVector(at: {{TABLEOFFSET}}.{{OFFSET}}.v, "
"{{TABLEOFFSET}}.{{OFFSET}}, "
"byteSize: {{SIZE}}) }"; "byteSize: {{SIZE}}) }";
code_ += code_ +=
"{{ACCESS_TYPE}} func {{FIELDVAR}}<T: FlatbuffersInitializable>(at " "{{ACCESS_TYPE}} func {{FIELDVAR}}<T: FlatbuffersInitializable>(at "
@@ -965,21 +953,24 @@ class SwiftGenerator : public BaseGenerator {
"{{ACCESS_TYPE}} func {{functionName}}<T>(_ body: " "{{ACCESS_TYPE}} func {{functionName}}<T>(_ body: "
"(UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return " "(UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? { return "
"try " "try "
"{{ACCESS}}.withUnsafePointerToSlice(at: " "{{ACCESS}}.withUnsafePointerToSlice(at: {{TABLEOFFSET}}.{{OFFSET}}.v, "
"{{TABLEOFFSET}}.{{OFFSET}}, "
"body: body) }"; "body: body) }";
} }
std::vector<std::string> GenerateCodingKeys(const StructDef& struct_def) { void GenerateCodingKeys(const StructDef& struct_def) {
std::vector<std::string> coding_keys; code_ += "enum CodingKeys: String, CodingKey {";
Indent();
for (auto it = struct_def.fields.vec.begin(); for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); ++it) { it != struct_def.fields.vec.end(); ++it) {
const auto& field = **it; const auto& field = **it;
if (field.deprecated) continue; if (field.deprecated) continue;
coding_keys.push_back("case " + namer_.Variable(field) + " = \"" +
field.name + "\""); code_.SetValue("RAWVALUENAME", field.name);
code_.SetValue("FIELDVAR", namer_.Variable(field));
code_ += "case {{FIELDVAR}} = \"{{RAWVALUENAME}}\"";
} }
return coding_keys; Outdent();
code_ += "}";
} }
void GenerateEncoderUnionBody(const FieldDef& field) { void GenerateEncoderUnionBody(const FieldDef& field) {
@@ -1101,31 +1092,14 @@ class SwiftGenerator : public BaseGenerator {
GenOSVersionChecks(); GenOSVersionChecks();
code_ += "extension {{STRUCTNAME}}: Encodable {"; code_ += "extension {{STRUCTNAME}}: Encodable {";
Indent(); Indent();
auto coding_keys = GenerateCodingKeys(struct_def);
if (coding_keys.empty() == false) {
code_ += "enum CodingKeys: String, CodingKey {";
Indent();
for (auto it = coding_keys.begin(); it != coding_keys.end(); ++it) {
const auto& field = *it;
code_ += field;
}
Outdent();
code_ += "}";
code_ += ""; code_ += "";
} if (struct_def.fields.vec.empty() == false) GenerateCodingKeys(struct_def);
code_ += "{{ACCESS_TYPE}} func encode(to encoder: Encoder) throws {"; code_ += "{{ACCESS_TYPE}} func encode(to encoder: Encoder) throws {";
if (coding_keys.empty() == false) {
Indent(); Indent();
GenerateEncoderBody(struct_def); if (struct_def.fields.vec.empty() == false) GenerateEncoderBody(struct_def);
Outdent(); Outdent();
}
code_ += "}"; code_ += "}";
Outdent(); Outdent();
code_ += "}"; code_ += "}";
code_ += ""; code_ += "";
@@ -1155,7 +1129,7 @@ class SwiftGenerator : public BaseGenerator {
} }
code_ += code_ +=
"try _v.visit(field: {{TABLEOFFSET}}.{{OFFSET}}, fieldName: " "try _v.visit(field: {{TABLEOFFSET}}.{{OFFSET}}.p, fieldName: "
"\"{{FIELDVAR}}\", required: {{ISREQUIRED}}, type: " "\"{{FIELDVAR}}\", required: {{ISREQUIRED}}, type: "
"{{VALUETYPE}}.self)"; "{{VALUETYPE}}.self)";
} }
@@ -1175,9 +1149,8 @@ class SwiftGenerator : public BaseGenerator {
code_.SetValue("VALUETYPE", namer_.NamespacedType(union_def)); code_.SetValue("VALUETYPE", namer_.NamespacedType(union_def));
code_.SetValue("FUNCTION_NAME", is_vector ? "visitUnionVector" : "visit"); code_.SetValue("FUNCTION_NAME", is_vector ? "visitUnionVector" : "visit");
code_ += code_ +=
"try _v.{{FUNCTION_NAME}}(unionKey: " "try _v.{{FUNCTION_NAME}}(unionKey: {{TABLEOFFSET}}.{{OFFSET}}Type.p, "
"{{TABLEOFFSET}}.{{OFFSET}}Type, " "unionField: {{TABLEOFFSET}}.{{OFFSET}}.p, unionKeyName: "
"unionField: {{TABLEOFFSET}}.{{OFFSET}}, unionKeyName: "
"\"{{FIELDVAR}}Type\", fieldName: \"{{FIELDVAR}}\", required: " "\"{{FIELDVAR}}Type\", fieldName: \"{{FIELDVAR}}\", required: "
"{{ISREQUIRED}}, completion: { (verifier, key: {{VALUETYPE}}, pos) in"; "{{ISREQUIRED}}, completion: { (verifier, key: {{VALUETYPE}}, pos) in";
Indent(); Indent();
@@ -1652,23 +1625,15 @@ class SwiftGenerator : public BaseGenerator {
buffer_constructor.push_back(field_var + " = _t." + field_field); buffer_constructor.push_back(field_var + " = _t." + field_field);
if (field.IsRequired()) { if (field.IsRequired()) {
std::string default_value; std::string default_value =
if (field.IsDefault()) { field.IsDefault() ? SwiftConstant(field) : "";
const auto sc = SwiftConstant(field); base_constructor.push_back(field_var + " = \"" + default_value +
flatbuffers::EscapeString(sc.c_str(), sc.length(), &default_value, "\"");
true, false);
} else {
default_value = "\"\"";
}
base_constructor.push_back(field_var + " = " + default_value);
break; break;
} }
if (field.IsDefault() && !field.IsRequired()) { if (field.IsDefault() && !field.IsRequired()) {
const auto sc = SwiftConstant(field); std::string value = field.IsDefault() ? SwiftConstant(field) : "nil";
std::string value; base_constructor.push_back(field_var + " = \"" + value + "\"");
flatbuffers::EscapeString(sc.c_str(), sc.length(), &value,
true, false);
base_constructor.push_back(field_var + " = " + value);
} }
break; break;
} }
@@ -1927,7 +1892,7 @@ class SwiftGenerator : public BaseGenerator {
} }
std::string GenOffset() { std::string GenOffset() {
return "let o = {{ACCESS}}.offset({{TABLEOFFSET}}.{{OFFSET}}); "; return "let o = {{ACCESS}}.offset({{TABLEOFFSET}}.{{OFFSET}}.v); ";
} }
std::string GenReaderMainBody(const std::string& optional = "") { std::string GenReaderMainBody(const std::string& optional = "") {

View File

@@ -67,7 +67,6 @@ Namer::Config TypeScriptDefaultConfig() {
/*object_suffix=*/"T", /*object_suffix=*/"T",
/*keyword_prefix=*/"", /*keyword_prefix=*/"",
/*keyword_suffix=*/"_", /*keyword_suffix=*/"_",
/*keywords_casing=*/Namer::Config::KeywordsCasing::CaseSensitive,
/*filenames=*/Case::kDasher, /*filenames=*/Case::kDasher,
/*directories=*/Case::kDasher, /*directories=*/Case::kDasher,
/*output_path=*/"", /*output_path=*/"",
@@ -87,7 +86,6 @@ std::set<std::string> TypescriptKeywords() {
"throw", "true", "try", "typeof", "var", "void", "throw", "true", "try", "typeof", "var", "void",
"while", "with", "as", "implements", "interface", "let", "while", "with", "as", "implements", "interface", "let",
"package", "private", "protected", "public", "static", "yield", "package", "private", "protected", "public", "static", "yield",
"undefined" // Used with --ts-undefined-for-optionals
}; };
} }
@@ -112,9 +110,7 @@ class TsGenerator : public BaseGenerator {
const std::string& file_name) const std::string& file_name)
: BaseGenerator(parser, path, file_name, "", "_", "ts"), : BaseGenerator(parser, path, file_name, "", "_", "ts"),
namer_(WithFlagOptions(TypeScriptDefaultConfig(), parser.opts, path), namer_(WithFlagOptions(TypeScriptDefaultConfig(), parser.opts, path),
TypescriptKeywords()), TypescriptKeywords()) {}
null_keyword_(parser_.opts.ts_undefined_for_optionals ? "undefined"
: "null") {}
bool generate() { bool generate() {
generateEnums(); generateEnums();
@@ -218,8 +214,6 @@ class TsGenerator : public BaseGenerator {
std::map<std::string, NsDefinition> ns_defs_; std::map<std::string, NsDefinition> ns_defs_;
std::string null_keyword_;
// Generate code for all enums. // Generate code for all enums.
void generateEnums() { void generateEnums() {
for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end(); for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
@@ -324,12 +318,11 @@ class TsGenerator : public BaseGenerator {
export_counter++; export_counter++;
} }
if (export_counter > 0) { if (export_counter > 0)
parser_.opts.file_saver->SaveFile(it.second.filepath.c_str(), code, parser_.opts.file_saver->SaveFile(it.second.filepath.c_str(), code,
false); false);
} }
} }
}
// Generate a documentation comment, if available. // Generate a documentation comment, if available.
static void GenDocComment(const std::vector<std::string>& dc, static void GenDocComment(const std::vector<std::string>& dc,
@@ -474,7 +467,7 @@ class TsGenerator : public BaseGenerator {
std::string GenDefaultValue(const FieldDef& field, import_set& imports) { std::string GenDefaultValue(const FieldDef& field, import_set& imports) {
if (field.IsScalarOptional()) { if (field.IsScalarOptional()) {
return null_keyword_; return "null";
} }
const auto& value = field.value; const auto& value = field.value;
@@ -522,23 +515,10 @@ class TsGenerator : public BaseGenerator {
case BASE_TYPE_BOOL: case BASE_TYPE_BOOL:
return value.constant == "0" ? "false" : "true"; return value.constant == "0" ? "false" : "true";
case BASE_TYPE_STRING: { case BASE_TYPE_STRING:
// NOTE: Strings without a default value are parsed as "0" by
// the parser, so therefore we have to treat "0" as a null-signifying
// value.
if (value.constant == "0" || value.constant == "null") {
return "null";
} else {
std::string escaped;
flatbuffers::EscapeString(value.constant.c_str(),
value.constant.length(), &escaped,
true, false);
return escaped;
}
}
case BASE_TYPE_UNION: case BASE_TYPE_UNION:
case BASE_TYPE_STRUCT: { case BASE_TYPE_STRUCT: {
return null_keyword_; return "null";
} }
case BASE_TYPE_ARRAY: case BASE_TYPE_ARRAY:
@@ -574,16 +554,16 @@ class TsGenerator : public BaseGenerator {
} else { } else {
name = AddImport(imports, owner, *type.struct_def).name; name = AddImport(imports, owner, *type.struct_def).name;
} }
return allowNull ? (name + "|" + null_keyword_) : name; return allowNull ? (name + "|null") : name;
} }
} }
switch (type.base_type) { switch (type.base_type) {
case BASE_TYPE_BOOL: case BASE_TYPE_BOOL:
return allowNull ? ("boolean|" + null_keyword_) : "boolean"; return allowNull ? "boolean|null" : "boolean";
case BASE_TYPE_LONG: case BASE_TYPE_LONG:
case BASE_TYPE_ULONG: case BASE_TYPE_ULONG:
return allowNull ? ("bigint|" + null_keyword_) : "bigint"; return allowNull ? "bigint|null" : "bigint";
case BASE_TYPE_ARRAY: { case BASE_TYPE_ARRAY: {
std::string name; std::string name;
if (type.element == BASE_TYPE_LONG || type.element == BASE_TYPE_ULONG) { if (type.element == BASE_TYPE_LONG || type.element == BASE_TYPE_ULONG) {
@@ -598,16 +578,16 @@ class TsGenerator : public BaseGenerator {
} }
} }
return name + (allowNull ? ("|" + null_keyword_) : ""); return name + (allowNull ? "|null" : "");
} }
default: default:
if (IsScalar(type.base_type)) { if (IsScalar(type.base_type)) {
if (type.enum_def) { if (type.enum_def) {
const auto enum_name = const auto enum_name =
AddImport(imports, owner, *type.enum_def).name; AddImport(imports, owner, *type.enum_def).name;
return allowNull ? (enum_name + "|" + null_keyword_) : enum_name; return allowNull ? (enum_name + "|null") : enum_name;
} }
return allowNull ? ("number|" + null_keyword_) : "number"; return allowNull ? "number|null" : "number";
} }
return "flatbuffers.Offset"; return "flatbuffers.Offset";
} }
@@ -661,8 +641,7 @@ class TsGenerator : public BaseGenerator {
} }
void GenStructArgs(import_set& imports, const StructDef& struct_def, void GenStructArgs(import_set& imports, const StructDef& struct_def,
const Definition& owner, std::string* arguments, std::string* arguments, const std::string& nameprefix) {
const std::string& nameprefix) {
for (auto it = struct_def.fields.vec.begin(); for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); ++it) { it != struct_def.fields.vec.end(); ++it) {
auto& field = **it; auto& field = **it;
@@ -670,11 +649,11 @@ class TsGenerator : public BaseGenerator {
// Generate arguments for a struct inside a struct. To ensure names // Generate arguments for a struct inside a struct. To ensure names
// don't clash, and to make it obvious these arguments are constructing // don't clash, and to make it obvious these arguments are constructing
// a nested struct, prefix the name with the field name. // a nested struct, prefix the name with the field name.
GenStructArgs(imports, *field.value.type.struct_def, owner, arguments, GenStructArgs(imports, *field.value.type.struct_def, arguments,
nameprefix + field.name + "_"); nameprefix + field.name + "_");
} else { } else {
*arguments += ", " + nameprefix + field.name + ": " + *arguments += ", " + nameprefix + field.name + ": " +
GenTypeName(imports, owner, field.value.type, true, GenTypeName(imports, field, field.value.type, true,
field.IsOptional()); field.IsOptional());
} }
} }
@@ -936,48 +915,6 @@ class TsGenerator : public BaseGenerator {
return symbols_expression; return symbols_expression;
} }
std::vector<std::string> PathComponents(const std::string& path) const {
std::vector<std::string> components;
size_t start = 0;
while (start < path.size()) {
auto end = path.find(kPathSeparator, start);
if (end == std::string::npos) end = path.size();
if (end > start) {
components.emplace_back(path.substr(start, end - start));
}
if (end == path.size()) break;
start = end + 1;
}
return components;
}
std::string RelativeDirectory(const std::vector<std::string>& from,
const std::vector<std::string>& to) const {
size_t common = 0;
while (common < from.size() && common < to.size() &&
from[common] == to[common]) {
++common;
}
std::string rel;
const size_t ups = from.size() - common;
if (ups == 0) {
rel = ".";
} else {
for (size_t i = 0; i < ups; ++i) {
if (!rel.empty()) rel += kPathSeparator;
rel += "..";
}
}
for (size_t i = common; i < to.size(); ++i) {
if (!rel.empty()) rel += kPathSeparator;
rel += to[i];
}
return rel;
}
template <typename DefinitionT> template <typename DefinitionT>
ImportDefinition AddImport(import_set& imports, const Definition& dependent, ImportDefinition AddImport(import_set& imports, const Definition& dependent,
const DefinitionT& dependency) { const DefinitionT& dependency) {
@@ -1005,32 +942,26 @@ class TsGenerator : public BaseGenerator {
const std::string symbols_expression = GenSymbolExpression( const std::string symbols_expression = GenSymbolExpression(
dependency, has_name_clash, import_name, name, object_name); dependency, has_name_clash, import_name, name, object_name);
const Namespace* dependent_ns = dependent.defined_namespace std::string bare_file_path;
? dependent.defined_namespace std::string rel_file_path;
: parser_.empty_namespace_; if (dependent.defined_namespace) {
const Namespace* dependency_ns = dependency.defined_namespace const auto& dep_comps = dependent.defined_namespace->components;
? dependency.defined_namespace for (size_t i = 0; i < dep_comps.size(); i++) {
: parser_.empty_namespace_; rel_file_path += i == 0 ? ".." : (kPathSeparator + std::string(".."));
}
if (dep_comps.size() == 0) {
rel_file_path += ".";
}
} else {
rel_file_path += "..";
}
const std::string dependent_dirs = bare_file_path +=
namer_.Directories(*dependent_ns, SkipDir::OutputPath); kPathSeparator +
const std::string dependency_dirs = namer_.Directories(dependency.defined_namespace->components,
namer_.Directories(*dependency_ns, SkipDir::OutputPath); SkipDir::OutputPath) +
const auto dependent_components = PathComponents(dependent_dirs);
const auto dependency_components = PathComponents(dependency_dirs);
std::string rel_dir =
RelativeDirectory(dependent_components, dependency_components);
if (rel_dir.empty()) rel_dir = ".";
if (!rel_dir.empty()) rel_dir += kPathSeparator;
std::string rel_file_path =
rel_dir + namer_.File(dependency, SkipFile::SuffixAndExtension);
std::string bare_file_path =
kPathSeparator + dependency_dirs +
namer_.File(dependency, SkipFile::SuffixAndExtension); namer_.File(dependency, SkipFile::SuffixAndExtension);
rel_file_path += bare_file_path;
ImportDefinition import; ImportDefinition import;
import.name = name; import.name = name;
@@ -1108,8 +1039,7 @@ class TsGenerator : public BaseGenerator {
const auto& enum_def = *union_type.enum_def; const auto& enum_def = *union_type.enum_def;
const auto valid_union_type = GenUnionTypeTS(enum_def, imports); const auto valid_union_type = GenUnionTypeTS(enum_def, imports);
const auto valid_union_type_with_null = const auto valid_union_type_with_null = valid_union_type + "|null";
valid_union_type + "|" + null_keyword_;
auto ret = "\n\nexport function " + GenUnionConvFuncName(enum_def) + auto ret = "\n\nexport function " + GenUnionConvFuncName(enum_def) +
"(\n type: " + GetTypeName(enum_def) + "(\n type: " + GetTypeName(enum_def) +
@@ -1121,7 +1051,7 @@ class TsGenerator : public BaseGenerator {
const auto union_enum_loop = [&](const std::string& accessor_str) { const auto union_enum_loop = [&](const std::string& accessor_str) {
ret += " switch(" + enum_type + "[type]) {\n"; ret += " switch(" + enum_type + "[type]) {\n";
ret += " case 'NONE': return " + null_keyword_ + "; \n"; ret += " case 'NONE': return null; \n";
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();
++it) { ++it) {
@@ -1145,7 +1075,7 @@ class TsGenerator : public BaseGenerator {
ret += "\n"; ret += "\n";
} }
ret += " default: return " + null_keyword_ + ";\n"; ret += " default: return null;\n";
ret += " }\n"; ret += " }\n";
}; };
@@ -1190,8 +1120,7 @@ class TsGenerator : public BaseGenerator {
ret += " const temp = " + conversion_function + "(this." + ret += " const temp = " + conversion_function + "(this." +
namer_.Method(field_name, "Type") + "(), " + namer_.Method(field_name, "Type") + "(), " +
field_binded_method + ");\n"; field_binded_method + ");\n";
ret += " if(temp === " + null_keyword_ + ") { return " + ret += " if(temp === null) { return null; }\n";
null_keyword_ + "; }\n";
ret += union_has_string ret += union_has_string
? " if(typeof temp === 'string') { return temp; }\n" ? " if(typeof temp === 'string') { return temp; }\n"
: ""; : "";
@@ -1211,12 +1140,12 @@ class TsGenerator : public BaseGenerator {
"++targetEnumIndex) {\n"; "++targetEnumIndex) {\n";
ret += " const targetEnum = this." + ret += " const targetEnum = this." +
namer_.Method(field_name, "Type") + "(targetEnumIndex);\n"; namer_.Method(field_name, "Type") + "(targetEnumIndex);\n";
ret += " if(targetEnum === " + null_keyword_ + " || " + enum_type + ret += " if(targetEnum === null || " + enum_type +
"[targetEnum!] === 'NONE') { " "[targetEnum!] === 'NONE') { "
"continue; }\n\n"; "continue; }\n\n";
ret += " const temp = " + conversion_function + "(targetEnum, " + ret += " const temp = " + conversion_function + "(targetEnum, " +
field_binded_method + ", targetEnumIndex);\n"; field_binded_method + ", targetEnumIndex);\n";
ret += " if(temp === " + null_keyword_ + ") { continue; }\n"; ret += " if(temp === null) { continue; }\n";
ret += union_has_string ? " if(typeof temp === 'string') { " ret += union_has_string ? " if(typeof temp === 'string') { "
"ret.push(temp); continue; }\n" "ret.push(temp); continue; }\n"
: ""; : "";
@@ -1233,12 +1162,11 @@ class TsGenerator : public BaseGenerator {
return ""; return "";
} }
std::string GenNullCheckConditional(const std::string& nullCheckVar, static std::string GenNullCheckConditional(
const std::string& trueVal, const std::string& nullCheckVar, const std::string& trueVal,
const std::string& falseVal = "") { const std::string& falseVal = "null") {
std::string false_val = falseVal.empty() ? null_keyword_ : falseVal; return "(" + nullCheckVar + " !== null ? " + trueVal + " : " + falseVal +
return "(" + nullCheckVar + " !== " + null_keyword_ + " ? " + trueVal + ")";
" : " + false_val + ")";
} }
std::string GenStructMemberValueTS(const StructDef& struct_def, std::string GenStructMemberValueTS(const StructDef& struct_def,
@@ -1347,9 +1275,10 @@ class TsGenerator : public BaseGenerator {
// Emit a scalar field // Emit a scalar field
const auto is_string = IsString(field.value.type); const auto is_string = IsString(field.value.type);
if (IsScalar(field.value.type.base_type) || is_string) { if (IsScalar(field.value.type.base_type) || is_string) {
field_type += const auto has_null_default = is_string || HasNullDefault(field);
GenTypeName(imports, field, field.value.type, false,
!HasDefaultValue(field) || HasNullDefault(field)); field_type += GenTypeName(imports, field, field.value.type, false,
has_null_default);
field_val = "this." + namer_.Method(field) + "()"; field_val = "this." + namer_.Method(field) + "()";
if (field.value.type.base_type != BASE_TYPE_STRING) { if (field.value.type.base_type != BASE_TYPE_STRING) {
@@ -1371,8 +1300,8 @@ class TsGenerator : public BaseGenerator {
const std::string field_accessor = const std::string field_accessor =
"this." + namer_.Method(field) + "()"; "this." + namer_.Method(field) + "()";
field_val = GenNullCheckConditional( field_val = GenNullCheckConditional(field_accessor,
field_accessor, field_accessor + "!.unpack()", null_keyword_); field_accessor + "!.unpack()");
auto packing = GenNullCheckConditional( auto packing = GenNullCheckConditional(
"this." + field_field, "this." + field_field,
"this." + field_field + "!.pack(builder)", "0"); "this." + field_field + "!.pack(builder)", "0");
@@ -1580,8 +1509,8 @@ class TsGenerator : public BaseGenerator {
break; break;
} }
// length 0 vector is simply empty instead of null/undefined. // length 0 vector is simply empty instead of null
field_type += is_vector ? "" : ("|" + null_keyword_); field_type += is_vector ? "" : "|null";
} }
if (!field_offset_decl.empty()) { if (!field_offset_decl.empty()) {
@@ -1610,7 +1539,7 @@ class TsGenerator : public BaseGenerator {
} else { } else {
if (field.IsScalarOptional()) { if (field.IsScalarOptional()) {
pack_func_create_call += pack_func_create_call +=
" if (" + field_offset_val + " !== " + null_keyword_ + ")\n "; " if (" + field_offset_val + " !== null)\n ";
} }
pack_func_create_call += " " + struct_name + "." + pack_func_create_call += " " + struct_name + "." +
namer_.Method("add", field) + "(builder, " + namer_.Method("add", field) + "(builder, " +
@@ -1695,14 +1624,12 @@ class TsGenerator : public BaseGenerator {
GenDocComment(struct_def.doc_comment, code_ptr); GenDocComment(struct_def.doc_comment, code_ptr);
code += "export class "; code += "export class ";
code += object_name; code += object_name;
if (parser.opts.generate_object_based_api) { if (parser.opts.generate_object_based_api)
code += " implements flatbuffers.IUnpackableObject<" + object_api_name + code += " implements flatbuffers.IUnpackableObject<" + object_api_name +
"> {\n"; "> {\n";
} else { else
code += " {\n"; code += " {\n";
} code += " bb: flatbuffers.ByteBuffer|null = null;\n";
code += " bb: flatbuffers.ByteBuffer|" + null_keyword_ + " = " +
null_keyword_ + ";\n";
code += " bb_pos = 0;\n"; code += " bb_pos = 0;\n";
// Generate the __init method that sets the field in a pre-existing // Generate the __init method that sets the field in a pre-existing
@@ -1743,22 +1670,21 @@ class TsGenerator : public BaseGenerator {
offset_prefix = " const offset = " + GenBBAccess() + offset_prefix = " const offset = " + GenBBAccess() +
".__offset(this.bb_pos, " + ".__offset(this.bb_pos, " +
NumToString(field.value.offset) + ");\n"; NumToString(field.value.offset) + ");\n";
offset_prefix += " return "; offset_prefix += " return offset ? ";
} }
// Emit a scalar field // Emit a scalar field
const auto is_string = IsString(field.value.type); const auto is_string = IsString(field.value.type);
if (IsScalar(field.value.type.base_type) || is_string) { if (IsScalar(field.value.type.base_type) || is_string) {
const auto has_null_default = const auto has_null_default = is_string || HasNullDefault(field);
!field.IsRequired() && !HasDefaultValue(field);
GenDocComment(field.doc_comment, code_ptr); GenDocComment(field.doc_comment, code_ptr);
std::string prefix = namer_.Method(field) + "("; std::string prefix = namer_.Method(field) + "(";
if (is_string) { if (is_string) {
code += prefix + "):" + (has_null_default ? "string|" + null_keyword_ : "string") + "\n"; code += prefix + "):string|null\n";
code += code +=
prefix + "optionalEncoding:flatbuffers.Encoding" + "):" + prefix + "optionalEncoding:flatbuffers.Encoding" + "):" +
GenTypeName(imports, struct_def, field.value.type, false, has_null_default) + GenTypeName(imports, struct_def, field.value.type, false, true) +
"\n"; "\n";
code += prefix + "optionalEncoding?:any"; code += prefix + "optionalEncoding?:any";
} else { } else {
@@ -1787,16 +1713,9 @@ class TsGenerator : public BaseGenerator {
if (is_string) { if (is_string) {
index += ", optionalEncoding"; index += ", optionalEncoding";
} }
if (field.IsRequired()) {
code += code +=
offset_prefix + GenGetter(field.value.type, "(" + index + ")"); offset_prefix + GenGetter(field.value.type, "(" + index + ")");
; if (field.value.type.base_type != BASE_TYPE_ARRAY) {
} else {
code += offset_prefix + "offset ? " +
GenGetter(field.value.type, "(" + index + ")");
}
if (field.value.type.base_type != BASE_TYPE_ARRAY &&
!field.IsRequired()) {
code += " : " + GenDefaultValue(field, imports); code += " : " + GenDefaultValue(field, imports);
} }
code += ";\n"; code += ";\n";
@@ -1812,8 +1731,7 @@ class TsGenerator : public BaseGenerator {
.name; .name;
GenDocComment(field.doc_comment, code_ptr); GenDocComment(field.doc_comment, code_ptr);
code += namer_.Method(field); code += namer_.Method(field);
code += code += "(obj?:" + type + "):" + type + "|null {\n";
"(obj?:" + type + "):" + type + "|" + null_keyword_ + " {\n";
if (struct_def.fixed) { if (struct_def.fixed) {
code += " return (obj || " + GenerateNewExpression(type); code += " return (obj || " + GenerateNewExpression(type);
@@ -1821,12 +1739,12 @@ class TsGenerator : public BaseGenerator {
code += code +=
MaybeAdd(field.value.offset) + ", " + GenBBAccess() + ");\n"; MaybeAdd(field.value.offset) + ", " + GenBBAccess() + ");\n";
} else { } else {
code += offset_prefix + "offset ? (obj || " + code += offset_prefix + "(obj || " + GenerateNewExpression(type) +
GenerateNewExpression(type) + ").__init("; ").__init(";
code += field.value.type.struct_def->fixed code += field.value.type.struct_def->fixed
? "this.bb_pos + offset" ? "this.bb_pos + offset"
: GenBBAccess() + ".__indirect(this.bb_pos + offset)"; : GenBBAccess() + ".__indirect(this.bb_pos + offset)";
code += ", " + GenBBAccess() + ") : " + null_keyword_ + ";\n"; code += ", " + GenBBAccess() + ") : null;\n";
} }
break; break;
@@ -1879,7 +1797,7 @@ class TsGenerator : public BaseGenerator {
} else { } else {
code += prefix; code += prefix;
} }
code += "):" + vectortypename + "|" + null_keyword_ + " {\n"; code += "):" + vectortypename + "|null {\n";
if (vectortype.base_type == BASE_TYPE_STRUCT) { if (vectortype.base_type == BASE_TYPE_STRUCT) {
code += offset_prefix + "(obj || " + code += offset_prefix + "(obj || " +
@@ -1919,7 +1837,7 @@ class TsGenerator : public BaseGenerator {
code += " : 0"; code += " : 0";
} }
} else { } else {
code += ": " + null_keyword_; code += ": null";
} }
break; break;
} }
@@ -1977,10 +1895,10 @@ class TsGenerator : public BaseGenerator {
} else { } else {
code += prefix; code += prefix;
} }
code += "):" + vectortypename + "|" + null_keyword_ + " {\n"; code += "):" + vectortypename + "|null {\n";
if (vectortype.base_type == BASE_TYPE_STRUCT) { if (vectortype.base_type == BASE_TYPE_STRUCT) {
code += offset_prefix + "offset ? (obj || " + code += offset_prefix + "(obj || " +
GenerateNewExpression(vectortypename); GenerateNewExpression(vectortypename);
code += ").__init("; code += ").__init(";
code += vectortype.struct_def->fixed code += vectortype.struct_def->fixed
@@ -1993,8 +1911,7 @@ class TsGenerator : public BaseGenerator {
} else if (IsString(vectortype)) { } else if (IsString(vectortype)) {
index += ", optionalEncoding"; index += ", optionalEncoding";
} }
code += offset_prefix + "offset ? " + code += offset_prefix + GenGetter(vectortype, "(" + index + ")");
GenGetter(vectortype, "(" + index + ")");
} }
code += " : "; code += " : ";
if (field.value.type.element == BASE_TYPE_BOOL) { if (field.value.type.element == BASE_TYPE_BOOL) {
@@ -2004,12 +1921,12 @@ class TsGenerator : public BaseGenerator {
code += "BigInt(0)"; code += "BigInt(0)";
} else if (IsScalar(field.value.type.element)) { } else if (IsScalar(field.value.type.element)) {
if (field.value.type.enum_def) { if (field.value.type.enum_def) {
code += null_keyword_; code += "null";
} else { } else {
code += "0"; code += "0";
} }
} else { } else {
code += null_keyword_; code += "null";
} }
code += ";\n"; code += ";\n";
break; break;
@@ -2022,13 +1939,13 @@ class TsGenerator : public BaseGenerator {
const auto& union_enum = *(field.value.type.enum_def); const auto& union_enum = *(field.value.type.enum_def);
const auto union_type = GenUnionGenericTypeTS(union_enum); const auto union_type = GenUnionGenericTypeTS(union_enum);
code += "<T extends flatbuffers.Table>(obj:" + union_type + code += "<T extends flatbuffers.Table>(obj:" + union_type +
"):" + union_type + "|" + null_keyword_ + "):" + union_type +
" " "|null "
"{\n"; "{\n";
code += offset_prefix + "offset ? " + code += offset_prefix +
GenGetter(field.value.type, "(obj, this.bb_pos + offset)") + GenGetter(field.value.type, "(obj, this.bb_pos + offset)") +
" : " + null_keyword_ + ";\n"; " : null;\n";
break; break;
} }
default: default:
@@ -2079,7 +1996,7 @@ class TsGenerator : public BaseGenerator {
// Emit a length helper // Emit a length helper
GenDocComment(code_ptr); GenDocComment(code_ptr);
code += namer_.Method(field, "Length"); code += namer_.Method(field, "Length");
code += "():number {\n" + offset_prefix + "offset ? "; code += "():number {\n" + offset_prefix;
code += code +=
GenBBAccess() + ".__vector_len(this.bb_pos + offset) : 0;\n}\n\n"; GenBBAccess() + ".__vector_len(this.bb_pos + offset) : 0;\n}\n\n";
@@ -2090,30 +2007,14 @@ class TsGenerator : public BaseGenerator {
GenDocComment(code_ptr); GenDocComment(code_ptr);
code += namer_.Method(field, "Array"); code += namer_.Method(field, "Array");
code +=
"():" + GenType(vectorType) + "Array|null {\n" + offset_prefix;
std::string return_type = code += "new " + GenType(vectorType) + "Array(" + GenBBAccess() +
(field.IsRequired() || HasDefaultValue(field)) ".bytes().buffer, " + GenBBAccess() +
? "Array"
: ("Array|" + null_keyword_);
if (field.IsRequired()) {
code += "():" + GenType(vectorType) + return_type + " {\n" +
offset_prefix + "new " + GenType(vectorType) + "Array(" +
GenBBAccess() + ".bytes().buffer, " + GenBBAccess() +
".bytes().byteOffset + " + GenBBAccess() + ".bytes().byteOffset + " + GenBBAccess() +
".__vector(this.bb_pos + offset), " + GenBBAccess() + ".__vector(this.bb_pos + offset), " + GenBBAccess() +
".__vector_len(this.bb_pos + offset));\n}\n\n"; ".__vector_len(this.bb_pos + offset)) : null;\n}\n\n";
} else {
std::string value = HasDefaultValue(field)
? "new " + GenType(vectorType) + "Array()"
: "null";
code += "():" + GenType(vectorType) + return_type + " {\n" +
offset_prefix + "offset ? new " + GenType(vectorType) +
"Array(" + GenBBAccess() + ".bytes().buffer, " +
GenBBAccess() + ".bytes().byteOffset + " + GenBBAccess() +
".__vector(this.bb_pos + offset), " + GenBBAccess() +
".__vector_len(this.bb_pos + offset)) : " + value +
";\n}\n\n";
}
} }
} }
} }
@@ -2142,7 +2043,7 @@ class TsGenerator : public BaseGenerator {
// Emit a factory constructor // Emit a factory constructor
if (struct_def.fixed) { if (struct_def.fixed) {
std::string arguments; std::string arguments;
GenStructArgs(imports, struct_def, struct_def, &arguments, ""); GenStructArgs(imports, struct_def, &arguments, "");
GenDocComment(code_ptr); GenDocComment(code_ptr);
code += "static create" + GetPrefixedName(struct_def) + code += "static create" + GetPrefixedName(struct_def) +
@@ -2183,7 +2084,7 @@ class TsGenerator : public BaseGenerator {
if (!IsScalar(field.value.type.base_type)) { if (!IsScalar(field.value.type.base_type)) {
code += "0"; code += "0";
} else if (HasNullDefault(field)) { } else if (HasNullDefault(field)) {
code += null_keyword_; code += "null";
} else { } else {
if (field.value.type.base_type == BASE_TYPE_BOOL) { if (field.value.type.base_type == BASE_TYPE_BOOL) {
code += "+"; code += "+";
@@ -2300,7 +2201,7 @@ class TsGenerator : public BaseGenerator {
const auto arg_name = GetArgName(field); const auto arg_name = GetArgName(field);
if (field.IsScalarOptional()) { if (field.IsScalarOptional()) {
code += " if (" + arg_name + " !== " + null_keyword_ + ")\n "; code += " if (" + arg_name + " !== null)\n ";
} }
code += " " + methodPrefix + "." + namer_.Method("add", field) + "("; code += " " + methodPrefix + "." + namer_.Method("add", field) + "(";
@@ -2340,38 +2241,10 @@ class TsGenerator : public BaseGenerator {
} }
} }
bool HasNullDefault(const FieldDef& field) { static bool HasNullDefault(const FieldDef& field) {
return field.IsOptional() && field.value.constant == "null"; return field.IsOptional() && field.value.constant == "null";
} }
static bool HasDefaultValue(const FieldDef& field) {
switch (field.value.type.base_type) {
// These types can't have defaults
case BASE_TYPE_UNION:
case BASE_TYPE_STRUCT: {
return false;
}
// Arrays always have a default (empty array)
case BASE_TYPE_ARRAY:
return true;
// The only supported default for vectors is []
case BASE_TYPE_VECTOR:
return field.value.constant == "[]";
// Even strings are presumed to be null-default if the default value is
// "0", this is intended behavior.
case BASE_TYPE_STRING: {
return field.value.constant != "0" && field.value.constant != "null";
}
default: {
return field.value.constant != "null";
}
}
}
std::string GetArgType(import_set& imports, const Definition& owner, std::string GetArgType(import_set& imports, const Definition& owner,
const FieldDef& field, bool allowNull) { const FieldDef& field, bool allowNull) {
return GenTypeName(imports, owner, field.value.type, true, return GenTypeName(imports, owner, field.value.type, true,

View File

@@ -2755,42 +2755,6 @@ std::vector<IncludedFile> Parser::GetIncludedFiles() const {
return {it->second.cbegin(), it->second.cend()}; return {it->second.cbegin(), it->second.cend()};
} }
bool Parser::HasCircularStructDependency() {
std::function<bool(StructDef*)> visit =
[&](StructDef* struct_def) {
// Only consider fixed structs and structs we have yet to check
if (!struct_def->fixed || struct_def->cycle_status == StructDef::CycleStatus::Checked) {
return false;
}
if (struct_def->cycle_status == StructDef::CycleStatus::InProgress) {
// cycle found
return true;
}
struct_def->cycle_status = StructDef::CycleStatus::InProgress;
for (const auto& field : struct_def->fields.vec) {
if (field->value.type.base_type == BASE_TYPE_STRUCT) {
if (visit(field->value.type.struct_def)) {
return true; // Cycle detected in recursion.
}
}
}
struct_def->cycle_status = StructDef::CycleStatus::Checked;
return false; // No cycle detected.
};
for (const auto& struct_def : structs_.vec) {
if (visit(struct_def)) {
return true; // Cycle detected.
}
}
return false; // No cycle detected.
}
bool Parser::SupportsOptionalScalars(const flatbuffers::IDLOptions& opts) { bool Parser::SupportsOptionalScalars(const flatbuffers::IDLOptions& opts) {
static FLATBUFFERS_CONSTEXPR unsigned long supported_langs = static FLATBUFFERS_CONSTEXPR unsigned long supported_langs =
IDLOptions::kRust | IDLOptions::kSwift | IDLOptions::kLobster | IDLOptions::kRust | IDLOptions::kSwift | IDLOptions::kLobster |
@@ -2809,8 +2773,7 @@ bool Parser::SupportsOptionalScalars() const {
bool Parser::SupportsDefaultVectorsAndStrings() const { bool Parser::SupportsDefaultVectorsAndStrings() const {
static FLATBUFFERS_CONSTEXPR unsigned long supported_langs = static FLATBUFFERS_CONSTEXPR unsigned long supported_langs =
IDLOptions::kRust | IDLOptions::kSwift | IDLOptions::kNim | IDLOptions::kRust | IDLOptions::kSwift | IDLOptions::kNim |
IDLOptions::kCpp | IDLOptions::kBinary | IDLOptions::kJson | IDLOptions::kCpp | IDLOptions::kBinary | IDLOptions::kJson;
IDLOptions::kTs;
return !(opts.lang_to_generate & ~supported_langs); return !(opts.lang_to_generate & ~supported_langs);
} }
@@ -3172,10 +3135,8 @@ CheckedError Parser::ParseProtoFields(StructDef* struct_def, bool isextend,
return Error("Protobuf has non positive number in reserved ids"); return Error("Protobuf has non positive number in reserved ids");
if (range) { if (range) {
for (uint32_t id = static_cast<uint32_t>(from) + 1; for (voffset_t id = from + 1; id <= attribute; id++)
id <= static_cast<uint32_t>(attribute); id++) { struct_def->reserved_ids.push_back(id);
struct_def->reserved_ids.push_back(static_cast<voffset_t>(id));
}
range = false; range = false;
} else { } else {

View File

@@ -641,10 +641,7 @@ const uint8_t* AddFlatBuffer(std::vector<uint8_t>& flatbuf,
const uint8_t* newbuf, size_t newlen) { const uint8_t* newbuf, size_t newlen) {
// Align to sizeof(uoffset_t) past sizeof(largest_scalar_t) since we're // Align to sizeof(uoffset_t) past sizeof(largest_scalar_t) since we're
// going to chop off the root offset. // going to chop off the root offset.
if (!newbuf || newlen < sizeof(uoffset_t)) return nullptr;
FLATBUFFERS_ASSERT(newlen >= sizeof(uoffset_t)); FLATBUFFERS_ASSERT(newlen >= sizeof(uoffset_t));
auto root = ReadScalar<uoffset_t>(newbuf);
if (root < sizeof(uoffset_t) || root >= newlen) return nullptr;
while ((flatbuf.size() & (sizeof(uoffset_t) - 1)) || while ((flatbuf.size() & (sizeof(uoffset_t) - 1)) ||
!(flatbuf.size() & (sizeof(largest_scalar_t) - 1))) { !(flatbuf.size() & (sizeof(largest_scalar_t) - 1))) {
flatbuf.push_back(0); flatbuf.push_back(0);
@@ -652,7 +649,7 @@ const uint8_t* AddFlatBuffer(std::vector<uint8_t>& flatbuf,
auto insertion_point = static_cast<uoffset_t>(flatbuf.size()); auto insertion_point = static_cast<uoffset_t>(flatbuf.size());
// Insert the entire FlatBuffer minus the root pointer. // Insert the entire FlatBuffer minus the root pointer.
flatbuf.insert(flatbuf.end(), newbuf + sizeof(uoffset_t), newbuf + newlen); flatbuf.insert(flatbuf.end(), newbuf + sizeof(uoffset_t), newbuf + newlen);
auto root_offset = root - sizeof(uoffset_t); auto root_offset = ReadScalar<uoffset_t>(newbuf) - sizeof(uoffset_t);
return flatbuf.data() + insertion_point + root_offset; return flatbuf.data() + insertion_point + root_offset;
} }

View File

@@ -49,7 +49,7 @@ public struct Table {
/// the vtable /// the vtable
/// - Parameter o: current offset /// - Parameter o: current offset
/// - Returns: offset of field within buffer /// - Returns: offset of field within buffer
public func offset(_ o: VOffset) -> Int32 { public func offset(_ o: Int32) -> Int32 {
let vtable = position &- bb.read(def: Int32.self, position: Int(position)) let vtable = position &- bb.read(def: Int32.self, position: Int(position))
return o return o
< bb < bb
@@ -57,7 +57,7 @@ public struct Table {
? Int32( ? Int32(
bb.read( bb.read(
def: Int16.self, def: Int16.self,
position: Int(vtable &+ Int32(o)))) : 0 position: Int(vtable &+ o))) : 0
} }
/// Gets the indirect offset of the current stored object /// Gets the indirect offset of the current stored object
@@ -106,13 +106,13 @@ public struct Table {
/// This should only be used by `Scalars` /// This should only be used by `Scalars`
/// - Parameter off: Readable offset /// - Parameter off: Readable offset
/// - Returns: Returns a vector of type [T] /// - Returns: Returns a vector of type [T]
public func getVector<T>(at off: VOffset) -> [T]? { public func getVector<T>(at off: Int32) -> [T]? {
let o = offset(off) let o = offset(off)
guard o != 0 else { return nil } guard o != 0 else { return nil }
return bb.readSlice(index: Int(vector(at: o)), count: Int(vector(count: o))) return bb.readSlice(index: Int(vector(at: o)), count: Int(vector(count: o)))
} }
public func vector<T>(at off: VOffset, byteSize: Int) -> FlatbufferVector<T> { public func vector<T>(at off: Int32, byteSize: Int) -> FlatbufferVector<T> {
let off = offset(off) let off = offset(off)
return FlatbufferVector( return FlatbufferVector(
bb: bb, bb: bb,
@@ -122,7 +122,7 @@ public struct Table {
} }
public func unionVector( public func unionVector(
at off: VOffset, at off: Int32,
byteSize: Int) -> UnionFlatbufferVector byteSize: Int) -> UnionFlatbufferVector
{ {
let off = offset(off) let off = offset(off)
@@ -146,7 +146,7 @@ public struct Table {
/// - Returns: Returns a pointer to the underlying data /// - Returns: Returns a pointer to the underlying data
@inline(__always) @inline(__always)
public func withUnsafePointerToSlice<T>( public func withUnsafePointerToSlice<T>(
at off: VOffset, at off: Int32,
body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T? body: (UnsafeRawBufferPointer, Int) throws -> T) rethrows -> T?
{ {
let o = offset(off) let o = offset(off)

View File

@@ -14,7 +14,6 @@
* limitations under the License. * limitations under the License.
*/ */
import Common
import Foundation import Foundation
enum FlexBuffersErrors: Error { enum FlexBuffersErrors: Error {
@@ -24,10 +23,6 @@ enum FlexBuffersErrors: Error {
@inline(__always) @inline(__always)
public func getRoot(buffer: ByteBuffer) throws -> Reference? { public func getRoot(buffer: ByteBuffer) throws -> Reference? {
assert(
isLitteEndian,
"Swift FlexBuffers currently only supports little-endian systems")
let end = buffer.count let end = buffer.count
if buffer.count < 3 { if buffer.count < 3 {
throw FlexBuffersErrors.sizeOfBufferIsTooSmall throw FlexBuffersErrors.sizeOfBufferIsTooSmall

View File

@@ -37,15 +37,12 @@ public struct FlexBuffersWriter {
private var hasDuplicatedKeys = false private var hasDuplicatedKeys = false
private var minBitWidth: BitWidth = .w8 private var minBitWidth: BitWidth = .w8
private var _bb: _InternalByteBuffer private var _bb: _InternalByteBuffer
private var stack: Stack = Stack() private var stack: [Value] = []
private var keyPool: [Int: UInt] = [:] private var keyPool: [Int: UInt] = [:]
private var stringPool: [Int: UInt] = [:] private var stringPool: [Int: UInt] = [:]
private var flags: BuilderFlag private var flags: BuilderFlag
public init(initialSize: Int = 1024, flags: BuilderFlag = .shareKeys) { public init(initialSize: Int = 1024, flags: BuilderFlag = .shareKeys) {
assert(
isLitteEndian,
"Swift FlexBuffers currently only supports little-endian systems")
_bb = _InternalByteBuffer(initialSize: initialSize) _bb = _InternalByteBuffer(initialSize: initialSize)
self.flags = flags self.flags = flags
} }
@@ -151,7 +148,7 @@ public struct FlexBuffersWriter {
typed: typed, typed: typed,
fixed: fixed, fixed: fixed,
keys: nil) keys: nil)
stack.popLast(start) stack = Array(stack[..<start])
stack.append(vec) stack.append(vec)
return vec.u return vec.u
} }
@@ -220,7 +217,7 @@ public struct FlexBuffersWriter {
typed: false, typed: false,
fixed: false, fixed: false,
keys: keys) keys: keys)
stack.popLast(start) stack = Array(stack[..<start])
stack.append(vec) stack.append(vec)
return numericCast(vec.u) return numericCast(vec.u)
} }
@@ -760,7 +757,7 @@ public struct FlexBuffersWriter {
} }
if !fixed { if !fixed {
write(value: UInt64(count), byteWidth: byteWidth) write(value: count, byteWidth: byteWidth)
} }
let vloc = _bb.writerIndex let vloc = _bb.writerIndex
@@ -833,14 +830,13 @@ public struct FlexBuffersWriter {
let key, value: Value let key, value: Value
} }
stack.withUnsafeMutableBytes(start: start) { buffer in stack[start...].withUnsafeMutableBytes { buffer in
var ptr = buffer.assumingMemoryBound(to: TwoValue.self) var ptr = buffer.assumingMemoryBound(to: TwoValue.self)
ptr.sort { a, b in ptr.sort { a, b in
let aMem = _bb.memory.advanced(by: numericCast(a.key.u)) let aMem = _bb.memory.advanced(by: numericCast(a.key.u))
.assumingMemoryBound(to: CChar.self) .assumingMemoryBound(to: CChar.self)
let bMem = _bb.memory.advanced(by: numericCast(b.key.u)) let bMem = _bb.memory.advanced(by: numericCast(b.key.u))
.assumingMemoryBound(to: CChar.self) .assumingMemoryBound(to: CChar.self)
let comp = strcmp(aMem, bMem) let comp = strcmp(aMem, bMem)
if (comp == 0) && a != b { hasDuplicatedKeys = true } if (comp == 0) && a != b { hasDuplicatedKeys = true }
return comp < 0 return comp < 0
@@ -901,129 +897,3 @@ extension FlexBuffersWriter {
return endMap(start: start) return endMap(start: start)
} }
} }
fileprivate struct Stack: RandomAccessCollection {
typealias Element = Value
typealias Index = Int
private final class Storage {
var memory: UnsafeMutableRawPointer
init(capacity: Int, alignment: Int) {
memory = .allocate(byteCount: capacity, alignment: alignment)
memset(memory, 0, capacity)
}
deinit {
memory.deallocate()
}
}
private static let initialCapacity = 10 &* MemoryLayout<Value>.stride
private let storage: Storage
private var capacity: Int
private(set) var count: Int
var startIndex: Int {
0
}
var endIndex: Int {
count
}
init() {
count = 0
capacity = Self.initialCapacity
storage = Storage(
capacity: capacity,
alignment: MemoryLayout<Value>.alignment)
}
@inline(__always)
subscript(position: Int) -> Value {
get {
storage.memory.advanced(by: position &* MemoryLayout<Value>.stride)
.assumingMemoryBound(to: Value.self).pointee
}
set {
storage.memory.advanced(by: position &* MemoryLayout<Value>.stride)
.assumingMemoryBound(to: Value.self).pointee = newValue
}
}
@inline(__always)
mutating func popLast(_ val: Int) {
count = if val < 0 {
0
} else {
val
}
}
mutating func append(_ value: Value) {
let writePosition = count &* MemoryLayout<Value>.stride
if writePosition >= capacity {
reallocate(writePosition: writePosition)
}
storage.memory.advanced(by: writePosition).storeBytes(
of: value,
as: Value.self)
count += 1
}
mutating func removeAll(keepingCapacity keepCapacity: Bool = false) {
count = 0
if !keepCapacity {
capacity = Self.initialCapacity
storage.memory = UnsafeMutableRawPointer.allocate(
byteCount: capacity,
alignment: MemoryLayout<Value>.alignment)
}
memset(storage.memory, 0, capacity)
}
@discardableResult
mutating func withUnsafeMutableBytes<R>(
start: Int,
_ body: (UnsafeMutableRawBufferPointer) throws -> R) rethrows -> R
{
let startingPosition = start &* MemoryLayout<Value>.stride
let pointer = storage.memory.advanced(by: startingPosition)
return try body(UnsafeMutableRawBufferPointer(
start: pointer,
count: (count &* MemoryLayout<Value>.stride) &- startingPosition))
}
@discardableResult
mutating func withUnsafeMutableBytes<R>(
_ body: (UnsafeMutableRawBufferPointer) throws
-> R) rethrows -> R
{
return try body(UnsafeMutableRawBufferPointer(
start: storage.memory,
count: count &* MemoryLayout<Value>.stride))
}
mutating private func reallocate(writePosition: Int) {
while capacity <= writePosition {
capacity = capacity << 1
}
/// solution take from Apple-NIO
capacity = capacity.convertToPowerofTwo
let newData = UnsafeMutableRawPointer.allocate(
byteCount: capacity,
alignment: MemoryLayout<Value>.alignment)
memset(newData, 0, capacity)
memcpy(
newData,
storage.memory,
writePosition)
storage.memory.deallocate()
storage.memory = newData
}
}

View File

@@ -60,7 +60,7 @@ struct _InternalByteBuffer {
let newData = UnsafeMutableRawPointer.allocate( let newData = UnsafeMutableRawPointer.allocate(
byteCount: capacity, byteCount: capacity,
alignment: alignment) alignment: alignment)
memset(newData, 0, capacity) memset(newData, 0, capacity &- writerSize)
memcpy( memcpy(
newData, newData,
memory, memory,

30
tests/64bit/BUILD.bazel Normal file
View File

@@ -0,0 +1,30 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//:build_defs.bzl", "flatbuffer_cc_library")
package(default_visibility = ["//visibility:public"])
cc_library(
name = "offset64_test",
testonly = 1,
srcs = ["offset64_test.cpp"],
hdrs = ["offset64_test.h"],
deps = [
":test_64bit_cc_fbs",
"//tests:test_assert",
"//tests/64bit/evolution:v1_cc_fbs",
"//tests/64bit/evolution:v2_cc_fbs",
],
)
flatbuffer_cc_library(
name = "test_64bit_cc_fbs",
srcs = ["test_64bit.fbs"],
filename_suffix = ".fbs",
flatc_args = [
"--gen-compare",
"--gen-mutable",
"--gen-object-api",
"--reflect-names",
"--filename-suffix .fbs",
],
)

View File

@@ -0,0 +1,29 @@
load("//:build_defs.bzl", "flatbuffer_cc_library")
package(default_visibility = ["//visibility:public"])
flatbuffer_cc_library(
name = "v1_cc_fbs",
srcs = ["v1.fbs"],
filename_suffix = ".fbs",
flatc_args = [
"--gen-compare",
"--gen-mutable",
"--gen-object-api",
"--reflect-names",
"--filename-suffix .fbs",
],
)
flatbuffer_cc_library(
name = "v2_cc_fbs",
srcs = ["v2.fbs"],
filename_suffix = ".fbs",
flatc_args = [
"--gen-compare",
"--gen-mutable",
"--gen-object-api",
"--reflect-names",
"--filename-suffix .fbs",
],
)

View File

@@ -1,222 +0,0 @@
// automatically generated by the FlatBuffers compiler, do not modify
#ifndef FLATBUFFERS_GENERATED_V1_V1_H_
#define FLATBUFFERS_GENERATED_V1_V1_H_
#include "flatbuffers/flatbuffers.h"
// Ensure the included flatbuffers.h is the same version as when this file was
// generated, otherwise it may not be compatible.
static_assert(FLATBUFFERS_VERSION_MAJOR == 25 &&
FLATBUFFERS_VERSION_MINOR == 12 &&
FLATBUFFERS_VERSION_REVISION == 19,
"Non-compatible flatbuffers version included");
namespace v1 {
struct RootTable;
struct RootTableBuilder;
struct RootTableT;
bool operator==(const RootTableT &lhs, const RootTableT &rhs);
bool operator!=(const RootTableT &lhs, const RootTableT &rhs);
inline const ::flatbuffers::TypeTable *RootTableTypeTable();
struct RootTableT : public ::flatbuffers::NativeTable {
typedef RootTable TableType;
float a = 0.0f;
std::vector<uint8_t> b{};
};
struct RootTable FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
typedef RootTableT NativeTableType;
typedef RootTableBuilder Builder;
static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
return RootTableTypeTable();
}
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_A = 4,
VT_B = 6
};
float a() const {
return GetField<float>(VT_A, 0.0f);
}
bool mutate_a(float _a = 0.0f) {
return SetField<float>(VT_A, _a, 0.0f);
}
const ::flatbuffers::Vector<uint8_t> *b() const {
return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_B);
}
::flatbuffers::Vector<uint8_t> *mutable_b() {
return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_B);
}
template <bool B = false>
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<float>(verifier, VT_A, 4) &&
VerifyOffset(verifier, VT_B) &&
verifier.VerifyVector(b()) &&
verifier.EndTable();
}
RootTableT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
void UnPackTo(RootTableT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
static ::flatbuffers::Offset<RootTable> Pack(::flatbuffers::FlatBufferBuilder &_fbb, const RootTableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
};
struct RootTableBuilder {
typedef RootTable Table;
::flatbuffers::FlatBufferBuilder &fbb_;
::flatbuffers::uoffset_t start_;
void add_a(float a) {
fbb_.AddElement<float>(RootTable::VT_A, a, 0.0f);
}
void add_b(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> b) {
fbb_.AddOffset(RootTable::VT_B, b);
}
explicit RootTableBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
::flatbuffers::Offset<RootTable> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = ::flatbuffers::Offset<RootTable>(end);
return o;
}
};
inline ::flatbuffers::Offset<RootTable> CreateRootTable(
::flatbuffers::FlatBufferBuilder &_fbb,
float a = 0.0f,
::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> b = 0) {
RootTableBuilder builder_(_fbb);
builder_.add_b(b);
builder_.add_a(a);
return builder_.Finish();
}
inline ::flatbuffers::Offset<RootTable> CreateRootTableDirect(
::flatbuffers::FlatBufferBuilder &_fbb,
float a = 0.0f,
const std::vector<uint8_t> *b = nullptr) {
auto b__ = b ? _fbb.CreateVector<uint8_t>(*b) : 0;
return v1::CreateRootTable(
_fbb,
a,
b__);
}
::flatbuffers::Offset<RootTable> CreateRootTable(::flatbuffers::FlatBufferBuilder &_fbb, const RootTableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
inline bool operator==(const RootTableT &lhs, const RootTableT &rhs) {
return
(lhs.a == rhs.a) &&
(lhs.b == rhs.b);
}
inline bool operator!=(const RootTableT &lhs, const RootTableT &rhs) {
return !(lhs == rhs);
}
inline RootTableT *RootTable::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
auto _o = std::unique_ptr<RootTableT>(new RootTableT());
UnPackTo(_o.get(), _resolver);
return _o.release();
}
inline void RootTable::UnPackTo(RootTableT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
{ auto _e = a(); _o->a = _e; }
{ auto _e = b(); if (_e) { _o->b.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->b.begin()); } }
}
inline ::flatbuffers::Offset<RootTable> CreateRootTable(::flatbuffers::FlatBufferBuilder &_fbb, const RootTableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
return RootTable::Pack(_fbb, _o, _rehasher);
}
inline ::flatbuffers::Offset<RootTable> RootTable::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const RootTableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
(void)_rehasher;
(void)_o;
struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const RootTableT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
auto _a = _o->a;
auto _b = _o->b.size() ? _fbb.CreateVector(_o->b) : 0;
return v1::CreateRootTable(
_fbb,
_a,
_b);
}
inline const ::flatbuffers::TypeTable *RootTableTypeTable() {
static const ::flatbuffers::TypeCode type_codes[] = {
{ ::flatbuffers::ET_FLOAT, 0, -1 },
{ ::flatbuffers::ET_UCHAR, 1, -1 }
};
static const char * const names[] = {
"a",
"b"
};
static const ::flatbuffers::TypeTable tt = {
::flatbuffers::ST_TABLE, 2, type_codes, nullptr, nullptr, nullptr, names
};
return &tt;
}
inline const v1::RootTable *GetRootTable(const void *buf) {
return ::flatbuffers::GetRoot<v1::RootTable>(buf);
}
inline const v1::RootTable *GetSizePrefixedRootTable(const void *buf) {
return ::flatbuffers::GetSizePrefixedRoot<v1::RootTable>(buf);
}
inline RootTable *GetMutableRootTable(void *buf) {
return ::flatbuffers::GetMutableRoot<RootTable>(buf);
}
inline v1::RootTable *GetMutableSizePrefixedRootTable(void *buf) {
return ::flatbuffers::GetMutableSizePrefixedRoot<v1::RootTable>(buf);
}
template <bool B = false>
inline bool VerifyRootTableBuffer(
::flatbuffers::VerifierTemplate<B> &verifier) {
return verifier.template VerifyBuffer<v1::RootTable>(nullptr);
}
template <bool B = false>
inline bool VerifySizePrefixedRootTableBuffer(
::flatbuffers::VerifierTemplate<B> &verifier) {
return verifier.template VerifySizePrefixedBuffer<v1::RootTable>(nullptr);
}
inline void FinishRootTableBuffer(
::flatbuffers::FlatBufferBuilder &fbb,
::flatbuffers::Offset<v1::RootTable> root) {
fbb.Finish(root);
}
inline void FinishSizePrefixedRootTableBuffer(
::flatbuffers::FlatBufferBuilder &fbb,
::flatbuffers::Offset<v1::RootTable> root) {
fbb.FinishSizePrefixed(root);
}
inline std::unique_ptr<v1::RootTableT> UnPackRootTable(
const void *buf,
const ::flatbuffers::resolver_function_t *res = nullptr) {
return std::unique_ptr<v1::RootTableT>(GetRootTable(buf)->UnPack(res));
}
inline std::unique_ptr<v1::RootTableT> UnPackSizePrefixedRootTable(
const void *buf,
const ::flatbuffers::resolver_function_t *res = nullptr) {
return std::unique_ptr<v1::RootTableT>(GetSizePrefixedRootTable(buf)->UnPack(res));
}
} // namespace v1
#endif // FLATBUFFERS_GENERATED_V1_V1_H_

View File

@@ -1,246 +0,0 @@
// automatically generated by the FlatBuffers compiler, do not modify
#ifndef FLATBUFFERS_GENERATED_V2_V2_H_
#define FLATBUFFERS_GENERATED_V2_V2_H_
#include "flatbuffers/flatbuffers.h"
// Ensure the included flatbuffers.h is the same version as when this file was
// generated, otherwise it may not be compatible.
static_assert(FLATBUFFERS_VERSION_MAJOR == 25 &&
FLATBUFFERS_VERSION_MINOR == 12 &&
FLATBUFFERS_VERSION_REVISION == 19,
"Non-compatible flatbuffers version included");
namespace v2 {
struct RootTable;
struct RootTableBuilder;
struct RootTableT;
bool operator==(const RootTableT &lhs, const RootTableT &rhs);
bool operator!=(const RootTableT &lhs, const RootTableT &rhs);
inline const ::flatbuffers::TypeTable *RootTableTypeTable();
struct RootTableT : public ::flatbuffers::NativeTable {
typedef RootTable TableType;
float a = 0.0f;
std::vector<uint8_t> b{};
std::vector<uint8_t> big_vector{};
};
struct RootTable FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
typedef RootTableT NativeTableType;
typedef RootTableBuilder Builder;
static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
return RootTableTypeTable();
}
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_A = 4,
VT_B = 6,
VT_BIG_VECTOR = 8
};
float a() const {
return GetField<float>(VT_A, 0.0f);
}
bool mutate_a(float _a = 0.0f) {
return SetField<float>(VT_A, _a, 0.0f);
}
const ::flatbuffers::Vector<uint8_t> *b() const {
return GetPointer<const ::flatbuffers::Vector<uint8_t> *>(VT_B);
}
::flatbuffers::Vector<uint8_t> *mutable_b() {
return GetPointer<::flatbuffers::Vector<uint8_t> *>(VT_B);
}
const ::flatbuffers::Vector64<uint8_t> *big_vector() const {
return GetPointer64<const ::flatbuffers::Vector64<uint8_t> *>(VT_BIG_VECTOR);
}
::flatbuffers::Vector64<uint8_t> *mutable_big_vector() {
return GetPointer64<::flatbuffers::Vector64<uint8_t> *>(VT_BIG_VECTOR);
}
template <bool B = false>
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<float>(verifier, VT_A, 4) &&
VerifyOffset(verifier, VT_B) &&
verifier.VerifyVector(b()) &&
VerifyOffset64(verifier, VT_BIG_VECTOR) &&
verifier.VerifyVector(big_vector()) &&
verifier.EndTable();
}
RootTableT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
void UnPackTo(RootTableT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
static ::flatbuffers::Offset<RootTable> Pack(::flatbuffers::FlatBufferBuilder64 &_fbb, const RootTableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
};
struct RootTableBuilder {
typedef RootTable Table;
::flatbuffers::FlatBufferBuilder64 &fbb_;
::flatbuffers::uoffset_t start_;
void add_a(float a) {
fbb_.AddElement<float>(RootTable::VT_A, a, 0.0f);
}
void add_b(::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> b) {
fbb_.AddOffset(RootTable::VT_B, b);
}
void add_big_vector(::flatbuffers::Offset64<::flatbuffers::Vector64<uint8_t>> big_vector) {
fbb_.AddOffset(RootTable::VT_BIG_VECTOR, big_vector);
}
explicit RootTableBuilder(::flatbuffers::FlatBufferBuilder64 &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
::flatbuffers::Offset<RootTable> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = ::flatbuffers::Offset<RootTable>(end);
return o;
}
};
inline ::flatbuffers::Offset<RootTable> CreateRootTable(
::flatbuffers::FlatBufferBuilder64 &_fbb,
float a = 0.0f,
::flatbuffers::Offset<::flatbuffers::Vector<uint8_t>> b = 0,
::flatbuffers::Offset64<::flatbuffers::Vector64<uint8_t>> big_vector = 0) {
RootTableBuilder builder_(_fbb);
builder_.add_big_vector(big_vector);
builder_.add_b(b);
builder_.add_a(a);
return builder_.Finish();
}
inline ::flatbuffers::Offset<RootTable> CreateRootTableDirect(
::flatbuffers::FlatBufferBuilder64 &_fbb,
float a = 0.0f,
const std::vector<uint8_t> *b = nullptr,
const std::vector<uint8_t> *big_vector = nullptr) {
auto big_vector__ = big_vector ? _fbb.CreateVector64(*big_vector) : 0;
auto b__ = b ? _fbb.CreateVector<uint8_t>(*b) : 0;
return v2::CreateRootTable(
_fbb,
a,
b__,
big_vector__);
}
::flatbuffers::Offset<RootTable> CreateRootTable(::flatbuffers::FlatBufferBuilder64 &_fbb, const RootTableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
inline bool operator==(const RootTableT &lhs, const RootTableT &rhs) {
return
(lhs.a == rhs.a) &&
(lhs.b == rhs.b) &&
(lhs.big_vector == rhs.big_vector);
}
inline bool operator!=(const RootTableT &lhs, const RootTableT &rhs) {
return !(lhs == rhs);
}
inline RootTableT *RootTable::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
auto _o = std::unique_ptr<RootTableT>(new RootTableT());
UnPackTo(_o.get(), _resolver);
return _o.release();
}
inline void RootTable::UnPackTo(RootTableT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
{ auto _e = a(); _o->a = _e; }
{ auto _e = b(); if (_e) { _o->b.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->b.begin()); } }
{ auto _e = big_vector(); if (_e) { _o->big_vector.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->big_vector.begin()); } }
}
inline ::flatbuffers::Offset<RootTable> CreateRootTable(::flatbuffers::FlatBufferBuilder64 &_fbb, const RootTableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
return RootTable::Pack(_fbb, _o, _rehasher);
}
inline ::flatbuffers::Offset<RootTable> RootTable::Pack(::flatbuffers::FlatBufferBuilder64 &_fbb, const RootTableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
(void)_rehasher;
(void)_o;
struct _VectorArgs { ::flatbuffers::FlatBufferBuilder64 *__fbb; const RootTableT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
auto _a = _o->a;
auto _b = _o->b.size() ? _fbb.CreateVector(_o->b) : 0;
auto _big_vector = _o->big_vector.size() ? _fbb.CreateVector64(_o->big_vector) : 0;
return v2::CreateRootTable(
_fbb,
_a,
_b,
_big_vector);
}
inline const ::flatbuffers::TypeTable *RootTableTypeTable() {
static const ::flatbuffers::TypeCode type_codes[] = {
{ ::flatbuffers::ET_FLOAT, 0, -1 },
{ ::flatbuffers::ET_UCHAR, 1, -1 },
{ ::flatbuffers::ET_UCHAR, 1, -1 }
};
static const char * const names[] = {
"a",
"b",
"big_vector"
};
static const ::flatbuffers::TypeTable tt = {
::flatbuffers::ST_TABLE, 3, type_codes, nullptr, nullptr, nullptr, names
};
return &tt;
}
inline const v2::RootTable *GetRootTable(const void *buf) {
return ::flatbuffers::GetRoot<v2::RootTable>(buf);
}
inline const v2::RootTable *GetSizePrefixedRootTable(const void *buf) {
return ::flatbuffers::GetSizePrefixedRoot<v2::RootTable,::flatbuffers::uoffset64_t>(buf);
}
inline RootTable *GetMutableRootTable(void *buf) {
return ::flatbuffers::GetMutableRoot<RootTable>(buf);
}
inline v2::RootTable *GetMutableSizePrefixedRootTable(void *buf) {
return ::flatbuffers::GetMutableSizePrefixedRoot<v2::RootTable,::flatbuffers::uoffset64_t>(buf);
}
template <bool B = false>
inline bool VerifyRootTableBuffer(
::flatbuffers::VerifierTemplate<B> &verifier) {
return verifier.template VerifyBuffer<v2::RootTable>(nullptr);
}
template <bool B = false>
inline bool VerifySizePrefixedRootTableBuffer(
::flatbuffers::VerifierTemplate<B> &verifier) {
return verifier.template VerifySizePrefixedBuffer<v2::RootTable,::flatbuffers::uoffset64_t>(nullptr);
}
inline void FinishRootTableBuffer(
::flatbuffers::FlatBufferBuilder64 &fbb,
::flatbuffers::Offset<v2::RootTable> root) {
fbb.Finish(root);
}
inline void FinishSizePrefixedRootTableBuffer(
::flatbuffers::FlatBufferBuilder64 &fbb,
::flatbuffers::Offset<v2::RootTable> root) {
fbb.FinishSizePrefixed(root);
}
inline std::unique_ptr<v2::RootTableT> UnPackRootTable(
const void *buf,
const ::flatbuffers::resolver_function_t *res = nullptr) {
return std::unique_ptr<v2::RootTableT>(GetRootTable(buf)->UnPack(res));
}
inline std::unique_ptr<v2::RootTableT> UnPackSizePrefixedRootTable(
const void *buf,
const ::flatbuffers::resolver_function_t *res = nullptr) {
return std::unique_ptr<v2::RootTableT>(GetSizePrefixedRootTable(buf)->UnPack(res));
}
} // namespace v2
#endif // FLATBUFFERS_GENERATED_V2_V2_H_

View File

@@ -11,9 +11,9 @@
#include "flatbuffers/buffer.h" #include "flatbuffers/buffer.h"
#include "flatbuffers/flatbuffer_builder.h" #include "flatbuffers/flatbuffer_builder.h"
#include "flatbuffers/flatbuffers.h" #include "flatbuffers/flatbuffers.h"
#include "tests/64bit/evolution/v1_generated.h" #include "tests/64bit/evolution/v1.fbs.h"
#include "tests/64bit/evolution/v2_generated.h" #include "tests/64bit/evolution/v2.fbs.h"
#include "tests/64bit/test_64bit_generated.h" #include "tests/64bit/test_64bit.fbs.h"
#include "tests/test_assert.h" #include "tests/test_assert.h"
namespace flatbuffers { namespace flatbuffers {

View File

@@ -1,683 +0,0 @@
// automatically generated by the FlatBuffers compiler, do not modify
#ifndef FLATBUFFERS_GENERATED_TEST64BIT_H_
#define FLATBUFFERS_GENERATED_TEST64BIT_H_
#include "flatbuffers/flatbuffers.h"
// Ensure the included flatbuffers.h is the same version as when this file was
// generated, otherwise it may not be compatible.
static_assert(FLATBUFFERS_VERSION_MAJOR == 25 &&
FLATBUFFERS_VERSION_MINOR == 12 &&
FLATBUFFERS_VERSION_REVISION == 19,
"Non-compatible flatbuffers version included");
// For access to the binary schema that produced this file.
#include "test_64bit_bfbs_generated.h"
struct LeafStruct;
struct WrapperTable;
struct WrapperTableBuilder;
struct WrapperTableT;
struct RootTable;
struct RootTableBuilder;
struct RootTableT;
bool operator==(const LeafStruct &lhs, const LeafStruct &rhs);
bool operator!=(const LeafStruct &lhs, const LeafStruct &rhs);
bool operator==(const WrapperTableT &lhs, const WrapperTableT &rhs);
bool operator!=(const WrapperTableT &lhs, const WrapperTableT &rhs);
bool operator==(const RootTableT &lhs, const RootTableT &rhs);
bool operator!=(const RootTableT &lhs, const RootTableT &rhs);
inline const ::flatbuffers::TypeTable *LeafStructTypeTable();
inline const ::flatbuffers::TypeTable *WrapperTableTypeTable();
inline const ::flatbuffers::TypeTable *RootTableTypeTable();
FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) LeafStruct FLATBUFFERS_FINAL_CLASS {
private:
int32_t a_;
int32_t padding0__;
double b_;
public:
static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
return LeafStructTypeTable();
}
LeafStruct()
: a_(0),
padding0__(0),
b_(0) {
(void)padding0__;
}
LeafStruct(int32_t _a, double _b)
: a_(::flatbuffers::EndianScalar(_a)),
padding0__(0),
b_(::flatbuffers::EndianScalar(_b)) {
(void)padding0__;
}
int32_t a() const {
return ::flatbuffers::EndianScalar(a_);
}
void mutate_a(int32_t _a) {
::flatbuffers::WriteScalar(&a_, _a);
}
double b() const {
return ::flatbuffers::EndianScalar(b_);
}
void mutate_b(double _b) {
::flatbuffers::WriteScalar(&b_, _b);
}
};
FLATBUFFERS_STRUCT_END(LeafStruct, 16);
inline bool operator==(const LeafStruct &lhs, const LeafStruct &rhs) {
return
(lhs.a() == rhs.a()) &&
(lhs.b() == rhs.b());
}
inline bool operator!=(const LeafStruct &lhs, const LeafStruct &rhs) {
return !(lhs == rhs);
}
struct WrapperTableT : public ::flatbuffers::NativeTable {
typedef WrapperTable TableType;
std::vector<int8_t> vector{};
};
struct WrapperTable FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
typedef WrapperTableT NativeTableType;
typedef WrapperTableBuilder Builder;
typedef RootTableBinarySchema BinarySchema;
static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
return WrapperTableTypeTable();
}
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_VECTOR = 4
};
const ::flatbuffers::Vector<int8_t> *vector() const {
return GetPointer64<const ::flatbuffers::Vector<int8_t> *>(VT_VECTOR);
}
::flatbuffers::Vector<int8_t> *mutable_vector() {
return GetPointer64<::flatbuffers::Vector<int8_t> *>(VT_VECTOR);
}
template <bool B = false>
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
return VerifyTableStart(verifier) &&
VerifyOffset64(verifier, VT_VECTOR) &&
verifier.VerifyVector(vector()) &&
verifier.EndTable();
}
WrapperTableT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
void UnPackTo(WrapperTableT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
static ::flatbuffers::Offset<WrapperTable> Pack(::flatbuffers::FlatBufferBuilder64 &_fbb, const WrapperTableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
};
struct WrapperTableBuilder {
typedef WrapperTable Table;
::flatbuffers::FlatBufferBuilder64 &fbb_;
::flatbuffers::uoffset_t start_;
void add_vector(::flatbuffers::Offset64<::flatbuffers::Vector<int8_t>> vector) {
fbb_.AddOffset(WrapperTable::VT_VECTOR, vector);
}
explicit WrapperTableBuilder(::flatbuffers::FlatBufferBuilder64 &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
::flatbuffers::Offset<WrapperTable> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = ::flatbuffers::Offset<WrapperTable>(end);
return o;
}
};
inline ::flatbuffers::Offset<WrapperTable> CreateWrapperTable(
::flatbuffers::FlatBufferBuilder64 &_fbb,
::flatbuffers::Offset64<::flatbuffers::Vector<int8_t>> vector = 0) {
WrapperTableBuilder builder_(_fbb);
builder_.add_vector(vector);
return builder_.Finish();
}
inline ::flatbuffers::Offset<WrapperTable> CreateWrapperTableDirect(
::flatbuffers::FlatBufferBuilder64 &_fbb,
const std::vector<int8_t> *vector = nullptr) {
auto vector__ = vector ? _fbb.CreateVector64<::flatbuffers::Vector>(*vector) : 0;
return CreateWrapperTable(
_fbb,
vector__);
}
::flatbuffers::Offset<WrapperTable> CreateWrapperTable(::flatbuffers::FlatBufferBuilder64 &_fbb, const WrapperTableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
struct RootTableT : public ::flatbuffers::NativeTable {
typedef RootTable TableType;
std::vector<uint8_t> far_vector{};
int32_t a = 0;
std::string far_string{};
std::vector<uint8_t> big_bool_vector{};
std::vector<uint8_t> big_vector{};
std::string near_string{};
std::vector<uint8_t> nested_root{};
std::vector<LeafStruct> far_struct_vector{};
std::vector<LeafStruct> big_struct_vector{};
std::vector<std::unique_ptr<WrapperTableT>> many_vectors{};
std::vector<uint8_t> forced_aligned_vector{};
RootTableT() = default;
RootTableT(const RootTableT &o);
RootTableT(RootTableT&&) FLATBUFFERS_NOEXCEPT = default;
RootTableT &operator=(RootTableT o) FLATBUFFERS_NOEXCEPT;
};
struct RootTable FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
typedef RootTableT NativeTableType;
typedef RootTableBuilder Builder;
typedef RootTableBinarySchema BinarySchema;
static const ::flatbuffers::TypeTable *MiniReflectTypeTable() {
return RootTableTypeTable();
}
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_FAR_VECTOR = 4,
VT_A = 6,
VT_FAR_STRING = 8,
VT_BIG_BOOL_VECTOR = 10,
VT_BIG_VECTOR = 12,
VT_NEAR_STRING = 14,
VT_NESTED_ROOT = 16,
VT_FAR_STRUCT_VECTOR = 18,
VT_BIG_STRUCT_VECTOR = 20,
VT_MANY_VECTORS = 22,
VT_FORCED_ALIGNED_VECTOR = 24
};
const ::flatbuffers::Vector<uint8_t> *far_vector() const {
return GetPointer64<const ::flatbuffers::Vector<uint8_t> *>(VT_FAR_VECTOR);
}
::flatbuffers::Vector<uint8_t> *mutable_far_vector() {
return GetPointer64<::flatbuffers::Vector<uint8_t> *>(VT_FAR_VECTOR);
}
int32_t a() const {
return GetField<int32_t>(VT_A, 0);
}
bool mutate_a(int32_t _a = 0) {
return SetField<int32_t>(VT_A, _a, 0);
}
const ::flatbuffers::String *far_string() const {
return GetPointer64<const ::flatbuffers::String *>(VT_FAR_STRING);
}
::flatbuffers::String *mutable_far_string() {
return GetPointer64<::flatbuffers::String *>(VT_FAR_STRING);
}
const ::flatbuffers::Vector64<uint8_t> *big_bool_vector() const {
return GetPointer64<const ::flatbuffers::Vector64<uint8_t> *>(VT_BIG_BOOL_VECTOR);
}
::flatbuffers::Vector64<uint8_t> *mutable_big_bool_vector() {
return GetPointer64<::flatbuffers::Vector64<uint8_t> *>(VT_BIG_BOOL_VECTOR);
}
const ::flatbuffers::Vector64<uint8_t> *big_vector() const {
return GetPointer64<const ::flatbuffers::Vector64<uint8_t> *>(VT_BIG_VECTOR);
}
::flatbuffers::Vector64<uint8_t> *mutable_big_vector() {
return GetPointer64<::flatbuffers::Vector64<uint8_t> *>(VT_BIG_VECTOR);
}
const ::flatbuffers::String *near_string() const {
return GetPointer<const ::flatbuffers::String *>(VT_NEAR_STRING);
}
::flatbuffers::String *mutable_near_string() {
return GetPointer<::flatbuffers::String *>(VT_NEAR_STRING);
}
const ::flatbuffers::Vector64<uint8_t> *nested_root() const {
return GetPointer64<const ::flatbuffers::Vector64<uint8_t> *>(VT_NESTED_ROOT);
}
::flatbuffers::Vector64<uint8_t> *mutable_nested_root() {
return GetPointer64<::flatbuffers::Vector64<uint8_t> *>(VT_NESTED_ROOT);
}
const RootTable *nested_root_nested_root() const {
const auto _f = nested_root();
return _f ? ::flatbuffers::GetRoot<RootTable>(_f->Data())
: nullptr;
}
const ::flatbuffers::Vector<const LeafStruct *> *far_struct_vector() const {
return GetPointer64<const ::flatbuffers::Vector<const LeafStruct *> *>(VT_FAR_STRUCT_VECTOR);
}
::flatbuffers::Vector<const LeafStruct *> *mutable_far_struct_vector() {
return GetPointer64<::flatbuffers::Vector<const LeafStruct *> *>(VT_FAR_STRUCT_VECTOR);
}
const ::flatbuffers::Vector64<const LeafStruct *> *big_struct_vector() const {
return GetPointer64<const ::flatbuffers::Vector64<const LeafStruct *> *>(VT_BIG_STRUCT_VECTOR);
}
::flatbuffers::Vector64<const LeafStruct *> *mutable_big_struct_vector() {
return GetPointer64<::flatbuffers::Vector64<const LeafStruct *> *>(VT_BIG_STRUCT_VECTOR);
}
const ::flatbuffers::Vector<::flatbuffers::Offset<WrapperTable>> *many_vectors() const {
return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<WrapperTable>> *>(VT_MANY_VECTORS);
}
::flatbuffers::Vector<::flatbuffers::Offset<WrapperTable>> *mutable_many_vectors() {
return GetPointer<::flatbuffers::Vector<::flatbuffers::Offset<WrapperTable>> *>(VT_MANY_VECTORS);
}
const ::flatbuffers::Vector64<uint8_t> *forced_aligned_vector() const {
return GetPointer64<const ::flatbuffers::Vector64<uint8_t> *>(VT_FORCED_ALIGNED_VECTOR);
}
::flatbuffers::Vector64<uint8_t> *mutable_forced_aligned_vector() {
return GetPointer64<::flatbuffers::Vector64<uint8_t> *>(VT_FORCED_ALIGNED_VECTOR);
}
template <bool B = false>
bool Verify(::flatbuffers::VerifierTemplate<B> &verifier) const {
return VerifyTableStart(verifier) &&
VerifyOffset64(verifier, VT_FAR_VECTOR) &&
verifier.VerifyVector(far_vector()) &&
VerifyField<int32_t>(verifier, VT_A, 4) &&
VerifyOffset64(verifier, VT_FAR_STRING) &&
verifier.VerifyString(far_string()) &&
VerifyOffset64(verifier, VT_BIG_BOOL_VECTOR) &&
verifier.VerifyVector(big_bool_vector()) &&
VerifyOffset64(verifier, VT_BIG_VECTOR) &&
verifier.VerifyVector(big_vector()) &&
VerifyOffset(verifier, VT_NEAR_STRING) &&
verifier.VerifyString(near_string()) &&
VerifyOffset64(verifier, VT_NESTED_ROOT) &&
verifier.VerifyVector(nested_root()) &&
verifier.template VerifyNestedFlatBuffer<RootTable>(nested_root(), nullptr) &&
VerifyOffset64(verifier, VT_FAR_STRUCT_VECTOR) &&
verifier.VerifyVector(far_struct_vector()) &&
VerifyOffset64(verifier, VT_BIG_STRUCT_VECTOR) &&
verifier.VerifyVector(big_struct_vector()) &&
VerifyOffset(verifier, VT_MANY_VECTORS) &&
verifier.VerifyVector(many_vectors()) &&
verifier.VerifyVectorOfTables(many_vectors()) &&
VerifyOffset64(verifier, VT_FORCED_ALIGNED_VECTOR) &&
verifier.VerifyVector(forced_aligned_vector()) &&
verifier.EndTable();
}
RootTableT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
void UnPackTo(RootTableT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
static ::flatbuffers::Offset<RootTable> Pack(::flatbuffers::FlatBufferBuilder64 &_fbb, const RootTableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
};
struct RootTableBuilder {
typedef RootTable Table;
::flatbuffers::FlatBufferBuilder64 &fbb_;
::flatbuffers::uoffset_t start_;
void add_far_vector(::flatbuffers::Offset64<::flatbuffers::Vector<uint8_t>> far_vector) {
fbb_.AddOffset(RootTable::VT_FAR_VECTOR, far_vector);
}
void add_a(int32_t a) {
fbb_.AddElement<int32_t>(RootTable::VT_A, a, 0);
}
void add_far_string(::flatbuffers::Offset64<::flatbuffers::String> far_string) {
fbb_.AddOffset(RootTable::VT_FAR_STRING, far_string);
}
void add_big_bool_vector(::flatbuffers::Offset64<::flatbuffers::Vector64<uint8_t>> big_bool_vector) {
fbb_.AddOffset(RootTable::VT_BIG_BOOL_VECTOR, big_bool_vector);
}
void add_big_vector(::flatbuffers::Offset64<::flatbuffers::Vector64<uint8_t>> big_vector) {
fbb_.AddOffset(RootTable::VT_BIG_VECTOR, big_vector);
}
void add_near_string(::flatbuffers::Offset<::flatbuffers::String> near_string) {
fbb_.AddOffset(RootTable::VT_NEAR_STRING, near_string);
}
void add_nested_root(::flatbuffers::Offset64<::flatbuffers::Vector64<uint8_t>> nested_root) {
fbb_.AddOffset(RootTable::VT_NESTED_ROOT, nested_root);
}
void add_far_struct_vector(::flatbuffers::Offset64<::flatbuffers::Vector<const LeafStruct *>> far_struct_vector) {
fbb_.AddOffset(RootTable::VT_FAR_STRUCT_VECTOR, far_struct_vector);
}
void add_big_struct_vector(::flatbuffers::Offset64<::flatbuffers::Vector64<const LeafStruct *>> big_struct_vector) {
fbb_.AddOffset(RootTable::VT_BIG_STRUCT_VECTOR, big_struct_vector);
}
void add_many_vectors(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<WrapperTable>>> many_vectors) {
fbb_.AddOffset(RootTable::VT_MANY_VECTORS, many_vectors);
}
void add_forced_aligned_vector(::flatbuffers::Offset64<::flatbuffers::Vector64<uint8_t>> forced_aligned_vector) {
fbb_.AddOffset(RootTable::VT_FORCED_ALIGNED_VECTOR, forced_aligned_vector);
}
explicit RootTableBuilder(::flatbuffers::FlatBufferBuilder64 &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
::flatbuffers::Offset<RootTable> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = ::flatbuffers::Offset<RootTable>(end);
return o;
}
};
inline ::flatbuffers::Offset<RootTable> CreateRootTable(
::flatbuffers::FlatBufferBuilder64 &_fbb,
::flatbuffers::Offset64<::flatbuffers::Vector<uint8_t>> far_vector = 0,
int32_t a = 0,
::flatbuffers::Offset64<::flatbuffers::String> far_string = 0,
::flatbuffers::Offset64<::flatbuffers::Vector64<uint8_t>> big_bool_vector = 0,
::flatbuffers::Offset64<::flatbuffers::Vector64<uint8_t>> big_vector = 0,
::flatbuffers::Offset<::flatbuffers::String> near_string = 0,
::flatbuffers::Offset64<::flatbuffers::Vector64<uint8_t>> nested_root = 0,
::flatbuffers::Offset64<::flatbuffers::Vector<const LeafStruct *>> far_struct_vector = 0,
::flatbuffers::Offset64<::flatbuffers::Vector64<const LeafStruct *>> big_struct_vector = 0,
::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<WrapperTable>>> many_vectors = 0,
::flatbuffers::Offset64<::flatbuffers::Vector64<uint8_t>> forced_aligned_vector = 0) {
RootTableBuilder builder_(_fbb);
builder_.add_forced_aligned_vector(forced_aligned_vector);
builder_.add_big_struct_vector(big_struct_vector);
builder_.add_nested_root(nested_root);
builder_.add_big_vector(big_vector);
builder_.add_big_bool_vector(big_bool_vector);
builder_.add_many_vectors(many_vectors);
builder_.add_far_struct_vector(far_struct_vector);
builder_.add_near_string(near_string);
builder_.add_far_string(far_string);
builder_.add_a(a);
builder_.add_far_vector(far_vector);
return builder_.Finish();
}
inline ::flatbuffers::Offset<RootTable> CreateRootTableDirect(
::flatbuffers::FlatBufferBuilder64 &_fbb,
const std::vector<uint8_t> *far_vector = nullptr,
int32_t a = 0,
const char *far_string = nullptr,
const std::vector<uint8_t> *big_bool_vector = nullptr,
const std::vector<uint8_t> *big_vector = nullptr,
const char *near_string = nullptr,
const std::vector<uint8_t> *nested_root = nullptr,
const std::vector<LeafStruct> *far_struct_vector = nullptr,
const std::vector<LeafStruct> *big_struct_vector = nullptr,
const std::vector<::flatbuffers::Offset<WrapperTable>> *many_vectors = nullptr,
const std::vector<uint8_t> *forced_aligned_vector = nullptr) {
auto far_vector__ = far_vector ? _fbb.CreateVector64<::flatbuffers::Vector>(*far_vector) : 0;
auto far_string__ = far_string ? _fbb.CreateString<::flatbuffers::Offset64>(far_string) : 0;
auto big_bool_vector__ = big_bool_vector ? _fbb.CreateVector64(*big_bool_vector) : 0;
auto big_vector__ = big_vector ? _fbb.CreateVector64(*big_vector) : 0;
auto nested_root__ = nested_root ? _fbb.CreateVector64(*nested_root) : 0;
auto far_struct_vector__ = far_struct_vector ? _fbb.CreateVectorOfStructs64<::flatbuffers::Vector>(*far_struct_vector) : 0;
auto big_struct_vector__ = big_struct_vector ? _fbb.CreateVectorOfStructs64(*big_struct_vector) : 0;
if (forced_aligned_vector) { _fbb.ForceVectorAlignment64(forced_aligned_vector->size(), sizeof(uint8_t), 32); }
auto forced_aligned_vector__ = forced_aligned_vector ? _fbb.CreateVector64(*forced_aligned_vector) : 0;
auto near_string__ = near_string ? _fbb.CreateString(near_string) : 0;
auto many_vectors__ = many_vectors ? _fbb.CreateVector<::flatbuffers::Offset<WrapperTable>>(*many_vectors) : 0;
return CreateRootTable(
_fbb,
far_vector__,
a,
far_string__,
big_bool_vector__,
big_vector__,
near_string__,
nested_root__,
far_struct_vector__,
big_struct_vector__,
many_vectors__,
forced_aligned_vector__);
}
::flatbuffers::Offset<RootTable> CreateRootTable(::flatbuffers::FlatBufferBuilder64 &_fbb, const RootTableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
inline bool operator==(const WrapperTableT &lhs, const WrapperTableT &rhs) {
return
(lhs.vector == rhs.vector);
}
inline bool operator!=(const WrapperTableT &lhs, const WrapperTableT &rhs) {
return !(lhs == rhs);
}
inline WrapperTableT *WrapperTable::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
auto _o = std::unique_ptr<WrapperTableT>(new WrapperTableT());
UnPackTo(_o.get(), _resolver);
return _o.release();
}
inline void WrapperTable::UnPackTo(WrapperTableT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
{ auto _e = vector(); if (_e) { _o->vector.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->vector.begin()); } }
}
inline ::flatbuffers::Offset<WrapperTable> CreateWrapperTable(::flatbuffers::FlatBufferBuilder64 &_fbb, const WrapperTableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
return WrapperTable::Pack(_fbb, _o, _rehasher);
}
inline ::flatbuffers::Offset<WrapperTable> WrapperTable::Pack(::flatbuffers::FlatBufferBuilder64 &_fbb, const WrapperTableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
(void)_rehasher;
(void)_o;
struct _VectorArgs { ::flatbuffers::FlatBufferBuilder64 *__fbb; const WrapperTableT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
auto _vector = _o->vector.size() ? _fbb.CreateVector64<::flatbuffers::Vector>(_o->vector) : 0;
return CreateWrapperTable(
_fbb,
_vector);
}
inline bool operator==(const RootTableT &lhs, const RootTableT &rhs) {
return
(lhs.far_vector == rhs.far_vector) &&
(lhs.a == rhs.a) &&
(lhs.far_string == rhs.far_string) &&
(lhs.big_bool_vector == rhs.big_bool_vector) &&
(lhs.big_vector == rhs.big_vector) &&
(lhs.near_string == rhs.near_string) &&
(lhs.nested_root == rhs.nested_root) &&
(lhs.far_struct_vector == rhs.far_struct_vector) &&
(lhs.big_struct_vector == rhs.big_struct_vector) &&
(lhs.many_vectors.size() == rhs.many_vectors.size() && std::equal(lhs.many_vectors.cbegin(), lhs.many_vectors.cend(), rhs.many_vectors.cbegin(), [](std::unique_ptr<WrapperTableT> const &a, std::unique_ptr<WrapperTableT> const &b) { return (a == b) || (a && b && *a == *b); })) &&
(lhs.forced_aligned_vector == rhs.forced_aligned_vector);
}
inline bool operator!=(const RootTableT &lhs, const RootTableT &rhs) {
return !(lhs == rhs);
}
inline RootTableT::RootTableT(const RootTableT &o)
: far_vector(o.far_vector),
a(o.a),
far_string(o.far_string),
big_bool_vector(o.big_bool_vector),
big_vector(o.big_vector),
near_string(o.near_string),
nested_root(o.nested_root),
far_struct_vector(o.far_struct_vector),
big_struct_vector(o.big_struct_vector),
forced_aligned_vector(o.forced_aligned_vector) {
many_vectors.reserve(o.many_vectors.size());
for (const auto &many_vectors_ : o.many_vectors) { many_vectors.emplace_back((many_vectors_) ? new WrapperTableT(*many_vectors_) : nullptr); }
}
inline RootTableT &RootTableT::operator=(RootTableT o) FLATBUFFERS_NOEXCEPT {
std::swap(far_vector, o.far_vector);
std::swap(a, o.a);
std::swap(far_string, o.far_string);
std::swap(big_bool_vector, o.big_bool_vector);
std::swap(big_vector, o.big_vector);
std::swap(near_string, o.near_string);
std::swap(nested_root, o.nested_root);
std::swap(far_struct_vector, o.far_struct_vector);
std::swap(big_struct_vector, o.big_struct_vector);
std::swap(many_vectors, o.many_vectors);
std::swap(forced_aligned_vector, o.forced_aligned_vector);
return *this;
}
inline RootTableT *RootTable::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const {
auto _o = std::unique_ptr<RootTableT>(new RootTableT());
UnPackTo(_o.get(), _resolver);
return _o.release();
}
inline void RootTable::UnPackTo(RootTableT *_o, const ::flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
{ auto _e = far_vector(); if (_e) { _o->far_vector.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->far_vector.begin()); } }
{ auto _e = a(); _o->a = _e; }
{ auto _e = far_string(); if (_e) _o->far_string = _e->str(); }
{ auto _e = big_bool_vector(); if (_e) { _o->big_bool_vector.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->big_bool_vector.begin()); } }
{ auto _e = big_vector(); if (_e) { _o->big_vector.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->big_vector.begin()); } }
{ auto _e = near_string(); if (_e) _o->near_string = _e->str(); }
{ auto _e = nested_root(); if (_e) { _o->nested_root.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->nested_root.begin()); } }
{ auto _e = far_struct_vector(); if (_e) { _o->far_struct_vector.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->far_struct_vector[_i] = *_e->Get(_i); } } else { _o->far_struct_vector.resize(0); } }
{ auto _e = big_struct_vector(); if (_e) { _o->big_struct_vector.resize(_e->size()); for (::flatbuffers::uoffset64_t _i = 0; _i < _e->size(); _i++) { _o->big_struct_vector[_i] = *_e->Get(_i); } } else { _o->big_struct_vector.resize(0); } }
{ auto _e = many_vectors(); if (_e) { _o->many_vectors.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->many_vectors[_i]) { _e->Get(_i)->UnPackTo(_o->many_vectors[_i].get(), _resolver); } else { _o->many_vectors[_i] = std::unique_ptr<WrapperTableT>(_e->Get(_i)->UnPack(_resolver)); } } } else { _o->many_vectors.resize(0); } }
{ auto _e = forced_aligned_vector(); if (_e) { _o->forced_aligned_vector.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->forced_aligned_vector.begin()); } }
}
inline ::flatbuffers::Offset<RootTable> CreateRootTable(::flatbuffers::FlatBufferBuilder64 &_fbb, const RootTableT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) {
return RootTable::Pack(_fbb, _o, _rehasher);
}
inline ::flatbuffers::Offset<RootTable> RootTable::Pack(::flatbuffers::FlatBufferBuilder64 &_fbb, const RootTableT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
(void)_rehasher;
(void)_o;
struct _VectorArgs { ::flatbuffers::FlatBufferBuilder64 *__fbb; const RootTableT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
auto _far_vector = _o->far_vector.size() ? _fbb.CreateVector64<::flatbuffers::Vector>(_o->far_vector) : 0;
auto _a = _o->a;
auto _far_string = _o->far_string.empty() ? 0 : _fbb.CreateString<::flatbuffers::Offset64>(_o->far_string);
auto _big_bool_vector = _o->big_bool_vector.size() ? _fbb.CreateVector64(_o->big_bool_vector) : 0;
auto _big_vector = _o->big_vector.size() ? _fbb.CreateVector64(_o->big_vector) : 0;
auto _near_string = _o->near_string.empty() ? 0 : _fbb.CreateString(_o->near_string);
auto _nested_root = _o->nested_root.size() ? _fbb.CreateVector64(_o->nested_root) : 0;
auto _far_struct_vector = _o->far_struct_vector.size() ? _fbb.CreateVectorOfStructs64<::flatbuffers::Vector>(_o->far_struct_vector) : 0;
auto _big_struct_vector = _o->big_struct_vector.size() ? _fbb.CreateVectorOfStructs64(_o->big_struct_vector) : 0;
auto _many_vectors = _o->many_vectors.size() ? _fbb.CreateVector<::flatbuffers::Offset<WrapperTable>> (_o->many_vectors.size(), [](size_t i, _VectorArgs *__va) { return CreateWrapperTable(*__va->__fbb, __va->__o->many_vectors[i].get(), __va->__rehasher); }, &_va ) : 0;
_fbb.ForceVectorAlignment64(_o->forced_aligned_vector.size(), sizeof(uint8_t), 32);
auto _forced_aligned_vector = _o->forced_aligned_vector.size() ? _fbb.CreateVector64(_o->forced_aligned_vector) : 0;
return CreateRootTable(
_fbb,
_far_vector,
_a,
_far_string,
_big_bool_vector,
_big_vector,
_near_string,
_nested_root,
_far_struct_vector,
_big_struct_vector,
_many_vectors,
_forced_aligned_vector);
}
inline const ::flatbuffers::TypeTable *LeafStructTypeTable() {
static const ::flatbuffers::TypeCode type_codes[] = {
{ ::flatbuffers::ET_INT, 0, -1 },
{ ::flatbuffers::ET_DOUBLE, 0, -1 }
};
static const int64_t values[] = { 0, 8, 16 };
static const char * const names[] = {
"a",
"b"
};
static const ::flatbuffers::TypeTable tt = {
::flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names
};
return &tt;
}
inline const ::flatbuffers::TypeTable *WrapperTableTypeTable() {
static const ::flatbuffers::TypeCode type_codes[] = {
{ ::flatbuffers::ET_CHAR, 1, -1 }
};
static const char * const names[] = {
"vector"
};
static const ::flatbuffers::TypeTable tt = {
::flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names
};
return &tt;
}
inline const ::flatbuffers::TypeTable *RootTableTypeTable() {
static const ::flatbuffers::TypeCode type_codes[] = {
{ ::flatbuffers::ET_UCHAR, 1, -1 },
{ ::flatbuffers::ET_INT, 0, -1 },
{ ::flatbuffers::ET_STRING, 0, -1 },
{ ::flatbuffers::ET_UCHAR, 1, -1 },
{ ::flatbuffers::ET_UCHAR, 1, -1 },
{ ::flatbuffers::ET_STRING, 0, -1 },
{ ::flatbuffers::ET_UCHAR, 1, -1 },
{ ::flatbuffers::ET_SEQUENCE, 1, 0 },
{ ::flatbuffers::ET_SEQUENCE, 1, 0 },
{ ::flatbuffers::ET_SEQUENCE, 1, 1 },
{ ::flatbuffers::ET_UCHAR, 1, -1 }
};
static const ::flatbuffers::TypeFunction type_refs[] = {
LeafStructTypeTable,
WrapperTableTypeTable
};
static const char * const names[] = {
"far_vector",
"a",
"far_string",
"big_bool_vector",
"big_vector",
"near_string",
"nested_root",
"far_struct_vector",
"big_struct_vector",
"many_vectors",
"forced_aligned_vector"
};
static const ::flatbuffers::TypeTable tt = {
::flatbuffers::ST_TABLE, 11, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
inline const RootTable *GetRootTable(const void *buf) {
return ::flatbuffers::GetRoot<RootTable>(buf);
}
inline const RootTable *GetSizePrefixedRootTable(const void *buf) {
return ::flatbuffers::GetSizePrefixedRoot<RootTable,::flatbuffers::uoffset64_t>(buf);
}
inline RootTable *GetMutableRootTable(void *buf) {
return ::flatbuffers::GetMutableRoot<RootTable>(buf);
}
inline RootTable *GetMutableSizePrefixedRootTable(void *buf) {
return ::flatbuffers::GetMutableSizePrefixedRoot<RootTable,::flatbuffers::uoffset64_t>(buf);
}
template <bool B = false>
inline bool VerifyRootTableBuffer(
::flatbuffers::VerifierTemplate<B> &verifier) {
return verifier.template VerifyBuffer<RootTable>(nullptr);
}
template <bool B = false>
inline bool VerifySizePrefixedRootTableBuffer(
::flatbuffers::VerifierTemplate<B> &verifier) {
return verifier.template VerifySizePrefixedBuffer<RootTable,::flatbuffers::uoffset64_t>(nullptr);
}
inline void FinishRootTableBuffer(
::flatbuffers::FlatBufferBuilder64 &fbb,
::flatbuffers::Offset<RootTable> root) {
fbb.Finish(root);
}
inline void FinishSizePrefixedRootTableBuffer(
::flatbuffers::FlatBufferBuilder64 &fbb,
::flatbuffers::Offset<RootTable> root) {
fbb.FinishSizePrefixed(root);
}
inline std::unique_ptr<RootTableT> UnPackRootTable(
const void *buf,
const ::flatbuffers::resolver_function_t *res = nullptr) {
return std::unique_ptr<RootTableT>(GetRootTable(buf)->UnPack(res));
}
inline std::unique_ptr<RootTableT> UnPackSizePrefixedRootTable(
const void *buf,
const ::flatbuffers::resolver_function_t *res = nullptr) {
return std::unique_ptr<RootTableT>(GetSizePrefixedRootTable(buf)->UnPack(res));
}
#endif // FLATBUFFERS_GENERATED_TEST64BIT_H_

View File

@@ -24,21 +24,12 @@ cc_test(
name = "flatbuffers_test", name = "flatbuffers_test",
testonly = 1, testonly = 1,
srcs = [ srcs = [
"64bit/evolution/v1_generated.h",
"64bit/evolution/v2_generated.h",
"64bit/offset64_test.cpp",
"64bit/offset64_test.h",
"64bit/test_64bit_bfbs_generated.h",
"64bit/test_64bit_generated.h",
"alignment_test.cpp", "alignment_test.cpp",
"alignment_test.h", "alignment_test.h",
"alignment_test_generated.h",
"default_vectors_strings_test.cpp", "default_vectors_strings_test.cpp",
"default_vectors_strings_test.h", "default_vectors_strings_test.h",
"evolution_test.cpp", "evolution_test.cpp",
"evolution_test.h", "evolution_test.h",
"evolution_test/evolution_v1_generated.h",
"evolution_test/evolution_v2_generated.h",
"flexbuffers_test.cpp", "flexbuffers_test.cpp",
"flexbuffers_test.h", "flexbuffers_test.h",
"fuzz_test.cpp", "fuzz_test.cpp",
@@ -46,19 +37,13 @@ cc_test(
"is_quiet_nan.h", "is_quiet_nan.h",
"json_test.cpp", "json_test.cpp",
"json_test.h", "json_test.h",
"key_field/key_field_sample_generated.h",
"key_field_test.cpp", "key_field_test.cpp",
"key_field_test.h", "key_field_test.h",
"monster_test.cpp", "monster_test.cpp",
"monster_test.h", "monster_test.h",
"monster_test_bfbs_generated.h", "monster_test_bfbs_generated.h",
"cross_namespace_pack_test_generated.h",
"namespace_test/namespace_test1_generated.h",
"namespace_test/namespace_test2_generated.h",
"native_inline_table_test_generated.h",
"native_type_test_impl.cpp", "native_type_test_impl.cpp",
"native_type_test_impl.h", "native_type_test_impl.h",
"optional_scalars_generated.h",
"optional_scalars_test.cpp", "optional_scalars_test.cpp",
"optional_scalars_test.h", "optional_scalars_test.h",
"parser_test.cpp", "parser_test.cpp",
@@ -72,13 +57,10 @@ cc_test(
"test_assert.h", "test_assert.h",
"test_builder.cpp", "test_builder.cpp",
"test_builder.h", "test_builder.h",
"union_underlying_type_test_generated.h",
"union_vector/union_vector_generated.h",
"util_test.cpp", "util_test.cpp",
"util_test.h", "util_test.h",
"vector_table_naked_ptr/vector_table_naked_ptr_generated.h",
"vector_table_naked_ptr_test.h",
"vector_table_naked_ptr_test.cpp", "vector_table_naked_ptr_test.cpp",
"vector_table_naked_ptr_test.h",
], ],
copts = [ copts = [
"-DFLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE", "-DFLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE",
@@ -88,13 +70,8 @@ cc_test(
":arrays_test.bfbs", ":arrays_test.bfbs",
":arrays_test.fbs", ":arrays_test.fbs",
":arrays_test.golden", ":arrays_test.golden",
":evolution_test/evolution_v1.fbs",
":evolution_test/evolution_v1.json",
":evolution_test/evolution_v2.fbs",
":evolution_test/evolution_v2.json",
":include_test/include_test1.fbs", ":include_test/include_test1.fbs",
":include_test/sub/include_test2.fbs", ":include_test/sub/include_test2.fbs",
":key_field/key_field_sample.fbs",
":monster_extra.fbs", ":monster_extra.fbs",
":monster_test.bfbs", ":monster_test.bfbs",
":monster_test.fbs", ":monster_test.fbs",
@@ -105,7 +82,6 @@ cc_test(
":name_clash_test/invalid_test2.fbs", ":name_clash_test/invalid_test2.fbs",
":name_clash_test/valid_test1.fbs", ":name_clash_test/valid_test1.fbs",
":name_clash_test/valid_test2.fbs", ":name_clash_test/valid_test2.fbs",
":native_type_test.fbs",
":optional_scalars.fbs", ":optional_scalars.fbs",
":optional_scalars.json", ":optional_scalars.json",
":optional_scalars_defaults.json", ":optional_scalars_defaults.json",
@@ -127,8 +103,8 @@ cc_test(
":prototest/twice-id.proto", ":prototest/twice-id.proto",
":prototest/use-reserved-id.proto", ":prototest/use-reserved-id.proto",
":unicode_test.json", ":unicode_test.json",
":union_vector/union_vector.fbs", "//tests/evolution_test:test_data",
":union_vector/union_vector.json", "//tests/union_vector:test_data",
], ],
includes = [ includes = [
"", "",
@@ -137,13 +113,21 @@ cc_test(
deps = [ deps = [
":alignment_test_cc_fbs", ":alignment_test_cc_fbs",
":arrays_test_cc_fbs", ":arrays_test_cc_fbs",
":cross_namespace_pack_test_cc_fbs",
":default_vectors_strings_test_cc_fbs", ":default_vectors_strings_test_cc_fbs",
":monster_extra_cc_fbs", ":monster_extra_cc_fbs",
":monster_test_cc_fbs", ":monster_test_cc_fbs",
":native_inline_table_test_cc_fbs",
":native_type_test_cc_fbs", ":native_type_test_cc_fbs",
":optional_scalars_cc_fbs",
":union_underlying_type_test_cc_fbs",
":vector_table_naked_ptr_cc_fbs",
"//:flatbuffers", "//:flatbuffers",
"//src:generate_fbs", "//src:generate_fbs",
"//tests/64bit:offset64_test",
"//tests/evolution_test:evolution_v1_cc_fbs",
"//tests/evolution_test:evolution_v2_cc_fbs",
"//tests/key_field:key_field_sample_cc_fbs",
"//tests/union_vector:union_vector_cc_fbs",
], ],
) )
@@ -153,7 +137,10 @@ cc_library(
name = "test_assert", name = "test_assert",
srcs = ["test_assert.cpp"], srcs = ["test_assert.cpp"],
hdrs = ["test_assert.h"], hdrs = ["test_assert.h"],
visibility = ["//grpc/tests:__subpackages__"], visibility = [
"//grpc/tests:__subpackages__",
"//tests:__subpackages__",
],
deps = ["//:flatbuffers"], deps = ["//:flatbuffers"],
) )
@@ -247,11 +234,20 @@ cc_library(
flatbuffer_cc_library( flatbuffer_cc_library(
name = "monster_extra_cc_fbs", name = "monster_extra_cc_fbs",
srcs = ["monster_extra.fbs"], srcs = ["monster_extra.fbs"],
filename_suffix = ".fbs",
flatc_args = [
"--gen-compare",
"--gen-mutable",
"--gen-object-api",
"--reflect-names",
"--filename-suffix .fbs",
],
) )
flatbuffer_cc_library( flatbuffer_cc_library(
name = "arrays_test_cc_fbs", name = "arrays_test_cc_fbs",
srcs = ["arrays_test.fbs"], srcs = ["arrays_test.fbs"],
filename_suffix = ".fbs",
flatc_args = [ flatc_args = [
"--gen-object-api", "--gen-object-api",
"--gen-compare", "--gen-compare",
@@ -260,38 +256,26 @@ flatbuffer_cc_library(
"--reflect-names", "--reflect-names",
"--cpp-ptr-type flatbuffers::unique_ptr", "--cpp-ptr-type flatbuffers::unique_ptr",
"--scoped-enums", "--scoped-enums",
], "--filename-suffix .fbs",
)
flatbuffer_cc_library(
name = "cross_namespace_pack_test_cc_fbs",
srcs = ["cross_namespace_pack_test.fbs"],
flatc_args = [
"--gen-object-api",
"--gen-mutable",
"--gen-compare",
"--reflect-names",
], ],
) )
flatbuffer_cc_library( flatbuffer_cc_library(
name = "native_type_test_cc_fbs", name = "native_type_test_cc_fbs",
srcs = ["native_type_test.fbs"], srcs = ["native_type_test.fbs"],
filename_suffix = ".fbs",
flatc_args = [ flatc_args = [
"--gen-object-api", "--gen-object-api",
"--gen-mutable", "--gen-mutable",
"--cpp-ptr-type flatbuffers::unique_ptr", "--cpp-ptr-type flatbuffers::unique_ptr",
"--filename-suffix .fbs",
], ],
) )
flatbuffer_cc_library( flatbuffer_cc_library(
name = "alignment_test_cc_fbs", name = "alignment_test_cc_fbs",
srcs = ["alignment_test.fbs"], srcs = ["alignment_test.fbs"],
) filename_suffix = ".fbs",
flatbuffer_cc_library(
name = "default_vectors_strings_test_cc_fbs",
srcs = ["default_vectors_strings_test.fbs"],
flatc_args = [ flatc_args = [
"--gen-compare", "--gen-compare",
"--gen-mutable", "--gen-mutable",
@@ -299,5 +283,71 @@ flatbuffer_cc_library(
"--reflect-names", "--reflect-names",
"--filename-suffix .fbs", "--filename-suffix .fbs",
], ],
filename_suffix = ".fbs" )
flatbuffer_cc_library(
name = "default_vectors_strings_test_cc_fbs",
srcs = ["default_vectors_strings_test.fbs"],
filename_suffix = ".fbs",
flatc_args = [
"--gen-compare",
"--gen-mutable",
"--gen-object-api",
"--reflect-names",
"--filename-suffix .fbs",
],
)
flatbuffer_cc_library(
name = "native_inline_table_test_cc_fbs",
srcs = ["native_inline_table_test.fbs"],
filename_suffix = ".fbs",
flatc_args = [
"--gen-compare",
"--gen-mutable",
"--gen-object-api",
"--reflect-names",
"--filename-suffix .fbs",
],
)
flatbuffer_cc_library(
name = "optional_scalars_cc_fbs",
srcs = ["optional_scalars.fbs"],
filename_suffix = ".fbs",
flatc_args = [
"--gen-compare",
"--gen-mutable",
"--gen-object-api",
"--reflect-names",
"--filename-suffix .fbs",
],
)
flatbuffer_cc_library(
name = "union_underlying_type_test_cc_fbs",
srcs = ["union_underlying_type_test.fbs"],
filename_suffix = ".fbs",
flatc_args = [
"--gen-compare",
"--gen-mutable",
"--gen-object-api",
"--reflect-names",
"--filename-suffix .fbs",
"--scoped-enums",
],
)
flatbuffer_cc_library(
name = "vector_table_naked_ptr_cc_fbs",
srcs = ["vector_table_naked_ptr.fbs"],
filename_suffix = ".fbs",
flatc_args = [
"--gen-compare",
"--gen-mutable",
"--gen-object-api",
"--reflect-names",
"--filename-suffix .fbs",
"--cpp-ptr-type naked",
],
) )

View File

@@ -106,9 +106,6 @@
<Compile Include="..\MyGame\Example\NestedStruct.cs"> <Compile Include="..\MyGame\Example\NestedStruct.cs">
<Link>MyGame\Example\NestedStruct.cs</Link> <Link>MyGame\Example\NestedStruct.cs</Link>
</Compile> </Compile>
<Compile Include="..\MyGame\Example\LargeArrayStruct.cs">
<Link>MyGame\Example\LargeArrayStruct.cs</Link>
</Compile>
<Compile Include="..\MyGame\Example\LongEnum.cs"> <Compile Include="..\MyGame\Example\LongEnum.cs">
<Link>MyGame\Example\LongEnum.cs</Link> <Link>MyGame\Example\LongEnum.cs</Link>
</Compile> </Compile>

View File

@@ -1,4 +1,4 @@
/* /*
* Copyright 2014 Google Inc. All rights reserved. * Copyright 2014 Google Inc. All rights reserved.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@@ -90,9 +90,6 @@ namespace Google.FlatBuffers.Test
fbb.AddOffset(test1.Value); fbb.AddOffset(test1.Value);
var testArrayOfString = fbb.EndVector(); var testArrayOfString = fbb.EndVector();
var longsVector = Monster.CreateVectorOfLongsVector(fbb, new long[] { 1, 100, 10000, 1000000, 100000000 });
var doublesVector = Monster.CreateVectorOfDoublesVector(fbb, new double[] { -1.7976931348623157e+308, 0, 1.7976931348623157e+308 });
Monster.StartMonster(fbb); Monster.StartMonster(fbb);
Monster.AddPos(fbb, Vec3.CreateVec3(fbb, 1.0f, 2.0f, 3.0f, 3.0, Monster.AddPos(fbb, Vec3.CreateVec3(fbb, 1.0f, 2.0f, 3.0f, 3.0,
Color.Green, (short)5, (sbyte)6)); Color.Green, (short)5, (sbyte)6));
@@ -105,8 +102,6 @@ namespace Google.FlatBuffers.Test
Monster.AddTestarrayofstring(fbb, testArrayOfString); Monster.AddTestarrayofstring(fbb, testArrayOfString);
Monster.AddTestbool(fbb, true); Monster.AddTestbool(fbb, true);
Monster.AddTestarrayoftables(fbb, sortMons); Monster.AddTestarrayoftables(fbb, sortMons);
Monster.AddVectorOfLongs(fbb, longsVector);
Monster.AddVectorOfDoubles(fbb, doublesVector);
var mon = Monster.EndMonster(fbb); var mon = Monster.EndMonster(fbb);
if (sizePrefix) if (sizePrefix)
@@ -290,13 +285,6 @@ namespace Google.FlatBuffers.Test
Assert.IsTrue(monster.GetTestarrayofboolsBytes().HasValue); Assert.IsTrue(monster.GetTestarrayofboolsBytes().HasValue);
} }
#endif #endif
var longArray = monster.GetVectorOfLongsArray();
Assert.AreEqual(5, longArray.Length);
Assert.AreEqual(100, longArray[1]);
var doublesArray = monster.GetVectorOfDoublesArray();
Assert.AreEqual(3, doublesArray.Length);
} }
[FlatBuffersTestMethod] [FlatBuffersTestMethod]

View File

@@ -1,249 +0,0 @@
/*
* Copyright 2025 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.
*/
using System;
using System.Linq;
using MyGame.Example;
namespace Google.FlatBuffers.Test
{
[FlatBuffersTestClass]
public class FlatBuffersFixedLengthArrayTests
{
[FlatBuffersTestMethod]
public void FixedLengthArray_LengthConstantsMatchSchema_ReturnTrue()
{
const int nestedALength = NestedStruct.ALength;
const int nestedCLength = NestedStruct.CLength;
const int nestedDLength = NestedStruct.DLength;
const int arrayBLength = ArrayStruct.BLength;
const int arrayFLength = ArrayStruct.FLength;
Assert.AreEqual(2, nestedALength);
Assert.AreEqual(2, nestedCLength);
Assert.AreEqual(2, nestedDLength);
Assert.AreEqual(15, arrayBLength);
Assert.AreEqual(2, arrayFLength);
}
#if ENABLE_SPAN_T
[FlatBuffersTestMethod]
public void FixedLengthArray_GetBytesSpanLengthIsCorrect_ReturnTrue()
{
var builder = new FlatBufferBuilder(1024);
var ints = new int[] { 1, 2 };
var enumB = TestEnum.A;
var enums = new TestEnum[] { TestEnum.B, TestEnum.C };
var longs = new long[] { 10L, 20L };
var structOffset = NestedStruct.CreateNestedStruct(builder, ints, enumB, enums, longs);
builder.Finish(structOffset.Value);
var bb = builder.DataBuffer;
var nestedStruct = new NestedStruct();
nestedStruct.__assign(bb.Length - builder.Offset, bb);
Span<int> intSpan = nestedStruct.GetABytes();
Span<TestEnum> enumSpan = nestedStruct.GetCBytes();
Span<long> longSpan = nestedStruct.GetDBytes();
Assert.AreEqual(intSpan.Length, NestedStruct.ALength);
Assert.AreEqual(enumSpan.Length, NestedStruct.CLength);
Assert.AreEqual(longSpan.Length, NestedStruct.DLength);
}
#endif
#if !ENABLE_SPAN_T
[FlatBuffersTestMethod]
public void FixedLengthArray_GetBytesArraySegmentLengthIsCorrect_ReturnTrue()
{
var builder = new FlatBufferBuilder(1024);
var ints = new int[] { 1, 2 };
var enumB = TestEnum.A;
var enums = new TestEnum[] { TestEnum.B, TestEnum.C };
var longs = new long[] { 10L, 20L };
var structOffset = NestedStruct.CreateNestedStruct(builder, ints, enumB, enums, longs);
builder.Finish(structOffset.Value);
var buffer = builder.DataBuffer;
var nestedStruct = new NestedStruct();
nestedStruct.__assign(buffer.Length - builder.Offset, buffer);
Assert.IsTrue(nestedStruct.GetABytes().HasValue);
Assert.IsTrue(nestedStruct.GetCBytes().HasValue);
Assert.IsTrue(nestedStruct.GetDBytes().HasValue);
ArraySegment<byte> intSegment = nestedStruct.GetABytes().Value;
ArraySegment<byte> enumSegment = nestedStruct.GetCBytes().Value;
ArraySegment<byte> longSegment = nestedStruct.GetDBytes().Value;
Assert.AreEqual(intSegment.Count, NestedStruct.ALength * sizeof(int));
Assert.AreEqual(enumSegment.Count, NestedStruct.CLength * sizeof(sbyte));
Assert.AreEqual(longSegment.Count, NestedStruct.DLength * sizeof(long));
}
#endif
#if ENABLE_SPAN_T
[FlatBuffersTestMethod]
public void FixedLengthArray_GetBytesSpanEquality_ReturnTrue()
{
var builder = new FlatBufferBuilder(1024);
var floatA = 3.14f;
var intArray = Enumerable.Range(1, 15).ToArray();
var byteC = (sbyte)42;
var intE = 999;
var longArray = new long[] { 5000L, 6000L };
var nestedInts = new int[2, 2] { { 10, 20 }, { 30, 40 } };
var nestedEnumB = new TestEnum[] { TestEnum.A, TestEnum.B };
var nestedEnums = new TestEnum[2, 2] { { TestEnum.A, TestEnum.B }, { TestEnum.C, TestEnum.A } };
var nestedLongs = new long[2, 2] { { 100L, 200L }, { 300L, 400L } };
var structOffset = ArrayStruct.CreateArrayStruct(builder, floatA, intArray, byteC,
nestedInts, nestedEnumB, nestedEnums, nestedLongs, intE, longArray);
ArrayTable.StartArrayTable(builder);
ArrayTable.AddA(builder, structOffset);
var rootTable = ArrayTable.EndArrayTable(builder);
builder.Finish(rootTable.Value);
var finishedBytes = builder.SizedByteArray();
ByteBuffer bb = new ByteBuffer(finishedBytes);
ArrayTable arrayTable = ArrayTable.GetRootAsArrayTable(bb);
ArrayStruct arrayStruct = arrayTable.A.Value;
Assert.AreEqual(byteC, arrayStruct.C);
Assert.AreEqual(intE, arrayStruct.E);
Assert.IsTrue(arrayStruct.GetBBytes().SequenceEqual(intArray));
Assert.IsTrue(arrayStruct.GetFBytes().SequenceEqual(longArray));
// Test nested struct arrays
for (int i = 0; i < 2; i++)
{
var nestedStruct = arrayStruct.D(i);
var nestedIntSpan = nestedStruct.GetABytes();
var expectedNestedInts = new int[] { nestedInts[i, 0], nestedInts[i, 1] };
Assert.IsTrue(nestedIntSpan.SequenceEqual(expectedNestedInts));
Assert.AreEqual(nestedEnumB[i], nestedStruct.B);
var nestedEnumSpan = nestedStruct.GetCBytes();
var expectedNestedEnums = new TestEnum[] { nestedEnums[i, 0], nestedEnums[i, 1] };
Assert.IsTrue(nestedEnumSpan.SequenceEqual(expectedNestedEnums));
var nestedLongSpan = nestedStruct.GetDBytes();
var expectedNestedLongs = new long[] { nestedLongs[i, 0], nestedLongs[i, 1] };
Assert.IsTrue(nestedLongSpan.SequenceEqual(expectedNestedLongs));
}
}
#endif
#if !ENABLE_SPAN_T
[FlatBuffersTestMethod]
public void FixedLengthArray_GetBytesArraySegmentEquality_ReturnTrue()
{
var builder = new FlatBufferBuilder(1024);
var floatA = 3.14f;
var intArray = Enumerable.Range(1, 15).ToArray();
var byteC = (sbyte)42;
var intE = 999;
var longArray = new long[] { 5000L, 6000L };
var nestedInts = new int[2, 2] { { 10, 20 }, { 30, 40 } };
var nestedEnumB = new TestEnum[] { TestEnum.A, TestEnum.B };
var nestedEnums = new TestEnum[2, 2] { { TestEnum.A, TestEnum.B }, { TestEnum.C, TestEnum.A } };
var nestedLongs = new long[2, 2] { { 100L, 200L }, { 300L, 400L } };
var structOffset = ArrayStruct.CreateArrayStruct(builder, floatA, intArray, byteC,
nestedInts, nestedEnumB, nestedEnums, nestedLongs, intE, longArray);
ArrayTable.StartArrayTable(builder);
ArrayTable.AddA(builder, structOffset);
var rootTable = ArrayTable.EndArrayTable(builder);
builder.Finish(rootTable.Value);
var finishedBytes = builder.SizedByteArray();
ByteBuffer bb = new ByteBuffer(finishedBytes);
ArrayTable arrayTable = ArrayTable.GetRootAsArrayTable(bb);
ArrayStruct arrayStruct = arrayTable.A.Value;
// Test that we can read basic scalars correctly
Assert.AreEqual(byteC, arrayStruct.C);
Assert.AreEqual(intE, arrayStruct.E);
Assert.IsTrue(arrayStruct.GetBBytes().HasValue);
var intSegment = arrayStruct.GetBBytes().Value;
for (int i = 0, offset = 0; i < intArray.Length; i++, offset += sizeof(int))
{
var segmentValue = BitConverter.ToInt32(intSegment.Array,
intSegment.Offset + offset);
Assert.AreEqual(intArray[i], segmentValue);
}
Assert.IsTrue(arrayStruct.GetFBytes().HasValue);
var longSegment = arrayStruct.GetFBytes().Value;
for (int i = 0, offset = 0; i < longArray.Length; i++, offset += sizeof(long))
{
var segmentValue = BitConverter.ToInt64(longSegment.Array,
longSegment.Offset + offset);
Assert.AreEqual(longArray[i], segmentValue);
}
// Test nested struct arrays
for (int i = 0; i < 2; i++)
{
var nestedStruct = arrayStruct.D(i);
Assert.IsTrue(nestedStruct.GetABytes().HasValue);
var nestedIntSegment = nestedStruct.GetABytes().Value;
var expectedNestedInts = new int[] { nestedInts[i, 0], nestedInts[i, 1] };
for (int ii = 0, offset = 0; ii < NestedStruct.ALength; ii++, offset += sizeof(int))
{
var segmentValue = BitConverter.ToInt32(nestedIntSegment.Array,
nestedIntSegment.Offset + offset);
Assert.AreEqual(expectedNestedInts[ii], segmentValue);
}
Assert.AreEqual(nestedEnumB[i], nestedStruct.B);
Assert.IsTrue(nestedStruct.GetCBytes().HasValue);
var nestedEnumSegment = nestedStruct.GetCBytes().Value;
var expectedNestedEnums = new TestEnum[] { nestedEnums[i, 0], nestedEnums[i, 1] };
for (int ii = 0, offset = 0; ii < NestedStruct.CLength; ii++, offset += sizeof(sbyte))
{
var segmentValue = (TestEnum)nestedEnumSegment.Array[nestedEnumSegment.Offset + offset];
Assert.AreEqual(expectedNestedEnums[ii], segmentValue);
}
Assert.IsTrue(nestedStruct.GetDBytes().HasValue);
var nestedLongSegment = nestedStruct.GetDBytes().Value;
var expectedNestedLongs = new long[] { nestedLongs[i, 0], nestedLongs[i, 1] };
for (int ii = 0, offset = 0; ii < NestedStruct.DLength; ii++, offset += sizeof(long))
{
var segmentValue = BitConverter.ToInt64(nestedLongSegment.Array,
nestedLongSegment.Offset + offset);
Assert.AreEqual(expectedNestedLongs[ii], segmentValue);
}
}
}
#endif
}
}

View File

@@ -19,12 +19,6 @@ public struct ArrayStruct : IFlatbufferObject
public float A { get { return __p.bb.GetFloat(__p.bb_pos + 0); } } public float A { get { return __p.bb.GetFloat(__p.bb_pos + 0); } }
public void MutateA(float a) { __p.bb.PutFloat(__p.bb_pos + 0, a); } public void MutateA(float a) { __p.bb.PutFloat(__p.bb_pos + 0, a); }
public int B(int j) { return __p.bb.GetInt(__p.bb_pos + 4 + j * 4); } public int B(int j) { return __p.bb.GetInt(__p.bb_pos + 4 + j * 4); }
public const int BLength = 15;
#if ENABLE_SPAN_T
public Span<int> GetBBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, int>(__p.bb.ToSpan(__p.bb_pos + 4, 60)); }
#else
public ArraySegment<byte>? GetBBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 4, 60);}
#endif
public void MutateB(int j, int b) { __p.bb.PutInt(__p.bb_pos + 4 + j * 4, b); } public void MutateB(int j, int b) { __p.bb.PutInt(__p.bb_pos + 4 + j * 4, b); }
public sbyte C { get { return __p.bb.GetSbyte(__p.bb_pos + 64); } } public sbyte C { get { return __p.bb.GetSbyte(__p.bb_pos + 64); } }
public void MutateC(sbyte c) { __p.bb.PutSbyte(__p.bb_pos + 64, c); } public void MutateC(sbyte c) { __p.bb.PutSbyte(__p.bb_pos + 64, c); }
@@ -32,12 +26,6 @@ public struct ArrayStruct : IFlatbufferObject
public int E { get { return __p.bb.GetInt(__p.bb_pos + 136); } } public int E { get { return __p.bb.GetInt(__p.bb_pos + 136); } }
public void MutateE(int e) { __p.bb.PutInt(__p.bb_pos + 136, e); } public void MutateE(int e) { __p.bb.PutInt(__p.bb_pos + 136, e); }
public long F(int j) { return __p.bb.GetLong(__p.bb_pos + 144 + j * 8); } public long F(int j) { return __p.bb.GetLong(__p.bb_pos + 144 + j * 8); }
public const int FLength = 2;
#if ENABLE_SPAN_T
public Span<long> GetFBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, long>(__p.bb.ToSpan(__p.bb_pos + 144, 16)); }
#else
public ArraySegment<byte>? GetFBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 144, 16);}
#endif
public void MutateF(int j, long f) { __p.bb.PutLong(__p.bb_pos + 144 + j * 8, f); } public void MutateF(int j, long f) { __p.bb.PutLong(__p.bb_pos + 144 + j * 8, f); }
public static Offset<MyGame.Example.ArrayStruct> CreateArrayStruct(FlatBufferBuilder builder, float A, int[] B, sbyte C, int[,] d_A, MyGame.Example.TestEnum[] d_B, MyGame.Example.TestEnum[,] d_C, long[,] d_D, int E, long[] F) { public static Offset<MyGame.Example.ArrayStruct> CreateArrayStruct(FlatBufferBuilder builder, float A, int[] B, sbyte C, int[,] d_A, MyGame.Example.TestEnum[] d_B, MyGame.Example.TestEnum[,] d_C, long[,] d_D, int E, long[] F) {

View File

@@ -1,150 +0,0 @@
// <auto-generated>
// automatically generated by the FlatBuffers compiler, do not modify
// </auto-generated>
namespace MyGame.Example
{
using global::System;
using global::System.Collections.Generic;
using global::Google.FlatBuffers;
public struct LargeArrayStruct : IFlatbufferObject
{
private Struct __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); }
public LargeArrayStruct __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
public byte D(int j) { return __p.bb.Get(__p.bb_pos + 0 + j * 1); }
public const int DLength = 64;
#if ENABLE_SPAN_T
public Span<byte> GetDBytes() { return __p.bb.ToSpan(__p.bb_pos + 0, 64); }
#else
public ArraySegment<byte>? GetDBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 0, 64);}
#endif
public void MutateD(int j, byte d) { __p.bb.Put(__p.bb_pos + 0 + j * 1, d); }
public float E(int j) { return __p.bb.GetFloat(__p.bb_pos + 64 + j * 4); }
public const int ELength = 64;
#if ENABLE_SPAN_T
public Span<float> GetEBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, float>(__p.bb.ToSpan(__p.bb_pos + 64, 256)); }
#else
public ArraySegment<byte>? GetEBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 64, 256);}
#endif
public void MutateE(int j, float e) { __p.bb.PutFloat(__p.bb_pos + 64 + j * 4, e); }
public bool F(int j) { return 0!=__p.bb.Get(__p.bb_pos + 320 + j * 1); }
public const int FLength = 64;
#if ENABLE_SPAN_T
public Span<bool> GetFBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, bool>(__p.bb.ToSpan(__p.bb_pos + 320, 64)); }
#else
public ArraySegment<byte>? GetFBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 320, 64);}
#endif
public void MutateF(int j, bool f) { __p.bb.Put(__p.bb_pos + 320 + j * 1, (byte)(f ? 1 : 0)); }
public MyGame.Example.NestedStruct G(int j) { return (new MyGame.Example.NestedStruct()).__assign(__p.bb_pos + 384 + j * 32, __p.bb); }
public MyGame.Example.TestEnum H(int j) { return (MyGame.Example.TestEnum)__p.bb.GetSbyte(__p.bb_pos + 2432 + j * 1); }
public const int HLength = 64;
#if ENABLE_SPAN_T
public Span<MyGame.Example.TestEnum> GetHBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, MyGame.Example.TestEnum>(__p.bb.ToSpan(__p.bb_pos + 2432, 64)); }
#else
public ArraySegment<byte>? GetHBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 2432, 64);}
#endif
public void MutateH(int j, MyGame.Example.TestEnum h) { __p.bb.PutSbyte(__p.bb_pos + 2432 + j * 1, (sbyte)h); }
public static Offset<MyGame.Example.LargeArrayStruct> CreateLargeArrayStruct(FlatBufferBuilder builder, byte[] D, float[] E, bool[] F, int[,] g_A, MyGame.Example.TestEnum[] g_B, MyGame.Example.TestEnum[,] g_C, long[,] g_D, MyGame.Example.TestEnum[] H) {
builder.Prep(8, 2496);
for (int _idx0 = 64; _idx0 > 0; _idx0--) {
builder.PutSbyte((sbyte)H[_idx0-1]);
}
for (int _idx0 = 64; _idx0 > 0; _idx0--) {
builder.Prep(8, 32);
for (int _idx1 = 2; _idx1 > 0; _idx1--) {
builder.PutLong(g_D[_idx0-1,_idx1-1]);
}
builder.Pad(5);
for (int _idx1 = 2; _idx1 > 0; _idx1--) {
builder.PutSbyte((sbyte)g_C[_idx0-1,_idx1-1]);
}
builder.PutSbyte((sbyte)g_B[_idx0-1]);
for (int _idx1 = 2; _idx1 > 0; _idx1--) {
builder.PutInt(g_A[_idx0-1,_idx1-1]);
}
}
for (int _idx0 = 64; _idx0 > 0; _idx0--) {
builder.PutBool(F[_idx0-1]);
}
for (int _idx0 = 64; _idx0 > 0; _idx0--) {
builder.PutFloat(E[_idx0-1]);
}
for (int _idx0 = 64; _idx0 > 0; _idx0--) {
builder.PutByte(D[_idx0-1]);
}
return new Offset<MyGame.Example.LargeArrayStruct>(builder.Offset);
}
public LargeArrayStructT UnPack() {
var _o = new LargeArrayStructT();
this.UnPackTo(_o);
return _o;
}
public void UnPackTo(LargeArrayStructT _o) {
_o.D = new byte[64];
for (var _j = 0; _j < 64; ++_j) { _o.D[_j] = this.D(_j); }
_o.E = new float[64];
for (var _j = 0; _j < 64; ++_j) { _o.E[_j] = this.E(_j); }
_o.F = new bool[64];
for (var _j = 0; _j < 64; ++_j) { _o.F[_j] = this.F(_j); }
_o.G = new MyGame.Example.NestedStructT[64];
for (var _j = 0; _j < 64; ++_j) { _o.G[_j] = this.G(_j).UnPack(); }
_o.H = new MyGame.Example.TestEnum[64];
for (var _j = 0; _j < 64; ++_j) { _o.H[_j] = this.H(_j); }
}
public static Offset<MyGame.Example.LargeArrayStruct> Pack(FlatBufferBuilder builder, LargeArrayStructT _o) {
if (_o == null) return default(Offset<MyGame.Example.LargeArrayStruct>);
var _d = _o.D;
var _e = _o.E;
var _f = _o.F;
var _g_a = new int[64,2];
for (var idx0 = 0; idx0 < 64; ++idx0) {for (var idx1 = 0; idx1 < 2; ++idx1) {_g_a[idx0,idx1] = _o.G[idx0].A[idx1];}}
var _g_b = new MyGame.Example.TestEnum[64];
for (var idx0 = 0; idx0 < 64; ++idx0) {_g_b[idx0] = _o.G[idx0].B;}
var _g_c = new MyGame.Example.TestEnum[64,2];
for (var idx0 = 0; idx0 < 64; ++idx0) {for (var idx1 = 0; idx1 < 2; ++idx1) {_g_c[idx0,idx1] = _o.G[idx0].C[idx1];}}
var _g_d = new long[64,2];
for (var idx0 = 0; idx0 < 64; ++idx0) {for (var idx1 = 0; idx1 < 2; ++idx1) {_g_d[idx0,idx1] = _o.G[idx0].D[idx1];}}
var _h = _o.H;
return CreateLargeArrayStruct(
builder,
_d,
_e,
_f,
_g_a,
_g_b,
_g_c,
_g_d,
_h);
}
}
public class LargeArrayStructT
{
[Newtonsoft.Json.JsonProperty("d")]
public byte[] D { get; set; }
[Newtonsoft.Json.JsonProperty("e")]
public float[] E { get; set; }
[Newtonsoft.Json.JsonProperty("f")]
public bool[] F { get; set; }
[Newtonsoft.Json.JsonProperty("g")]
public MyGame.Example.NestedStructT[] G { get; set; }
[Newtonsoft.Json.JsonProperty("h")]
public MyGame.Example.TestEnum[] H { get; set; }
public LargeArrayStructT() {
this.D = new byte[64];
this.E = new float[64];
this.F = new bool[64];
this.G = new MyGame.Example.NestedStructT[64];
this.H = new MyGame.Example.TestEnum[64];
}
}
}

View File

@@ -1,117 +0,0 @@
// automatically generated by the FlatBuffers compiler, do not modify
package MyGame.Example;
import com.google.flatbuffers.BaseVector;
import com.google.flatbuffers.BooleanVector;
import com.google.flatbuffers.ByteVector;
import com.google.flatbuffers.Constants;
import com.google.flatbuffers.DoubleVector;
import com.google.flatbuffers.FlatBufferBuilder;
import com.google.flatbuffers.FloatVector;
import com.google.flatbuffers.IntVector;
import com.google.flatbuffers.LongVector;
import com.google.flatbuffers.ShortVector;
import com.google.flatbuffers.StringVector;
import com.google.flatbuffers.Struct;
import com.google.flatbuffers.UnionVector;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
@SuppressWarnings("unused")
public final class LargeArrayStruct extends Struct {
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
public LargeArrayStruct __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
public int d(int j) { return bb.get(bb_pos + 0 + j * 1); }
public void mutateD(int j, int d) { bb.put(bb_pos + 0 + j * 1, (byte) d); }
public float e(int j) { return bb.getFloat(bb_pos + 64 + j * 4); }
public void mutateE(int j, float e) { bb.putFloat(bb_pos + 64 + j * 4, e); }
public boolean f(int j) { return 0!=bb.get(bb_pos + 320 + j * 1); }
public void mutateF(int j, boolean f) { bb.put(bb_pos + 320 + j * 1, (byte)(f ? 1 : 0)); }
public MyGame.Example.NestedStruct g(int j) { return g(new MyGame.Example.NestedStruct(), j); }
public MyGame.Example.NestedStruct g(MyGame.Example.NestedStruct obj, int j) { return obj.__assign(bb_pos + 384 + j * 32, bb); }
public byte h(int j) { return bb.get(bb_pos + 2432 + j * 1); }
public void mutateH(int j, byte h) { bb.put(bb_pos + 2432 + j * 1, h); }
public static int createLargeArrayStruct(FlatBufferBuilder builder, int[] d, float[] e, boolean[] f, int[][] g_a, byte[] g_b, byte[][] g_c, long[][] g_d, byte[] h) {
builder.prep(8, 2496);
for (int _idx0 = 64; _idx0 > 0; _idx0--) {
builder.putByte(h[_idx0-1]);
}
for (int _idx0 = 64; _idx0 > 0; _idx0--) {
builder.prep(8, 32);
for (int _idx1 = 2; _idx1 > 0; _idx1--) {
builder.putLong(g_d[_idx0-1][_idx1-1]);
}
builder.pad(5);
for (int _idx1 = 2; _idx1 > 0; _idx1--) {
builder.putByte(g_c[_idx0-1][_idx1-1]);
}
builder.putByte(g_b[_idx0-1]);
for (int _idx1 = 2; _idx1 > 0; _idx1--) {
builder.putInt(g_a[_idx0-1][_idx1-1]);
}
}
for (int _idx0 = 64; _idx0 > 0; _idx0--) {
builder.putBoolean(f[_idx0-1]);
}
for (int _idx0 = 64; _idx0 > 0; _idx0--) {
builder.putFloat(e[_idx0-1]);
}
for (int _idx0 = 64; _idx0 > 0; _idx0--) {
builder.putByte((byte) d[_idx0-1]);
}
return builder.offset();
}
public static final class Vector extends BaseVector {
public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
public LargeArrayStruct get(int j) { return get(new LargeArrayStruct(), j); }
public LargeArrayStruct get(LargeArrayStruct obj, int j) { return obj.__assign(__element(j), bb); }
}
public LargeArrayStructT unpack() {
LargeArrayStructT _o = new LargeArrayStructT();
unpackTo(_o);
return _o;
}
public void unpackTo(LargeArrayStructT _o) {
int[] _oD = _o.getD();
for (int _j = 0; _j < 64; ++_j) { _oD[_j] = d(_j); }
float[] _oE = _o.getE();
for (int _j = 0; _j < 64; ++_j) { _oE[_j] = e(_j); }
boolean[] _oF = _o.getF();
for (int _j = 0; _j < 64; ++_j) { _oF[_j] = f(_j); }
MyGame.Example.NestedStructT[] _oG = _o.getG();
for (int _j = 0; _j < 64; ++_j) { _oG[_j] = g(_j).unpack(); }
byte[] _oH = _o.getH();
for (int _j = 0; _j < 64; ++_j) { _oH[_j] = h(_j); }
}
public static int pack(FlatBufferBuilder builder, LargeArrayStructT _o) {
if (_o == null) return 0;
int[] _d = _o.getD();
float[] _e = _o.getE();
boolean[] _f = _o.getF();
int[][] _g_a = new int[64][2];
for (int idx0 = 0; idx0 < 64; ++idx0) {for (int idx1 = 0; idx1 < 2; ++idx1) {_g_a[idx0][idx1] = _o.getG()[idx0].getA()[idx1];}}
byte[] _g_b = new byte[64];
for (int idx0 = 0; idx0 < 64; ++idx0) {_g_b[idx0] = _o.getG()[idx0].getB();}
byte[][] _g_c = new byte[64][2];
for (int idx0 = 0; idx0 < 64; ++idx0) {for (int idx1 = 0; idx1 < 2; ++idx1) {_g_c[idx0][idx1] = _o.getG()[idx0].getC()[idx1];}}
long[][] _g_d = new long[64][2];
for (int idx0 = 0; idx0 < 64; ++idx0) {for (int idx1 = 0; idx1 < 2; ++idx1) {_g_d[idx0][idx1] = _o.getG()[idx0].getD()[idx1];}}
byte[] _h = _o.getH();
return createLargeArrayStruct(
builder,
_d,
_e,
_f,
_g_a,
_g_b,
_g_c,
_g_d,
_h);
}
}

View File

@@ -1,226 +0,0 @@
# automatically generated by the FlatBuffers compiler, do not modify
# namespace: Example
import flatbuffers
from flatbuffers.compat import import_numpy
from typing import Any
from MyGame.Example.NestedStruct import NestedStruct
np = import_numpy()
class LargeArrayStruct(object):
__slots__ = ['_tab']
@classmethod
def SizeOf(cls) -> int:
return 2496
# LargeArrayStruct
def Init(self, buf: bytes, pos: int):
self._tab = flatbuffers.table.Table(buf, pos)
# LargeArrayStruct
def D(self, j = None):
if j is None:
return [self._tab.Get(flatbuffers.number_types.Uint8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0 + i * 1)) for i in range(self.DLength())]
elif j >= 0 and j < self.DLength():
return self._tab.Get(flatbuffers.number_types.Uint8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0 + j * 1))
else:
return None
# LargeArrayStruct
def DAsNumpy(self):
return self._tab.GetArrayAsNumpy(flatbuffers.number_types.Uint8Flags, self._tab.Pos + 0, self.DLength())
# LargeArrayStruct
def DLength(self) -> int:
return 64
# LargeArrayStruct
def DIsNone(self) -> bool:
return False
# LargeArrayStruct
def E(self, j = None):
if j is None:
return [self._tab.Get(flatbuffers.number_types.Float32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(64 + i * 4)) for i in range(self.ELength())]
elif j >= 0 and j < self.ELength():
return self._tab.Get(flatbuffers.number_types.Float32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(64 + j * 4))
else:
return None
# LargeArrayStruct
def EAsNumpy(self):
return self._tab.GetArrayAsNumpy(flatbuffers.number_types.Float32Flags, self._tab.Pos + 64, self.ELength())
# LargeArrayStruct
def ELength(self) -> int:
return 64
# LargeArrayStruct
def EIsNone(self) -> bool:
return False
# LargeArrayStruct
def F(self, j = None):
if j is None:
return [self._tab.Get(flatbuffers.number_types.BoolFlags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(320 + i * 1)) for i in range(self.FLength())]
elif j >= 0 and j < self.FLength():
return self._tab.Get(flatbuffers.number_types.BoolFlags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(320 + j * 1))
else:
return None
# LargeArrayStruct
def FAsNumpy(self):
return self._tab.GetArrayAsNumpy(flatbuffers.number_types.BoolFlags, self._tab.Pos + 320, self.FLength())
# LargeArrayStruct
def FLength(self) -> int:
return 64
# LargeArrayStruct
def FIsNone(self) -> bool:
return False
# LargeArrayStruct
def G(self, i: int) -> NestedStruct:
obj = NestedStruct()
obj.Init(self._tab.Bytes, self._tab.Pos + 384 + i * 32)
return obj
# LargeArrayStruct
def GLength(self) -> int:
return 64
# LargeArrayStruct
def GIsNone(self) -> bool:
return False
# LargeArrayStruct
def H(self, j = None):
if j is None:
return [self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(2432 + i * 1)) for i in range(self.HLength())]
elif j >= 0 and j < self.HLength():
return self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(2432 + j * 1))
else:
return None
# LargeArrayStruct
def HAsNumpy(self):
return self._tab.GetArrayAsNumpy(flatbuffers.number_types.Int8Flags, self._tab.Pos + 2432, self.HLength())
# LargeArrayStruct
def HLength(self) -> int:
return 64
# LargeArrayStruct
def HIsNone(self) -> bool:
return False
def CreateLargeArrayStruct(builder, d, e, f, g_a, g_b, g_c, g_d, h):
builder.Prep(8, 2496)
for _idx0 in range(64 , 0, -1):
builder.PrependInt8(h[_idx0-1])
for _idx0 in range(64 , 0, -1):
builder.Prep(8, 32)
for _idx1 in range(2 , 0, -1):
builder.PrependInt64(g_d[_idx0-1][_idx1-1])
builder.Pad(5)
for _idx1 in range(2 , 0, -1):
builder.PrependInt8(g_c[_idx0-1][_idx1-1])
builder.PrependInt8(g_b[_idx0-1])
for _idx1 in range(2 , 0, -1):
builder.PrependInt32(g_a[_idx0-1][_idx1-1])
for _idx0 in range(64 , 0, -1):
builder.PrependBool(f[_idx0-1])
for _idx0 in range(64 , 0, -1):
builder.PrependFloat32(e[_idx0-1])
for _idx0 in range(64 , 0, -1):
builder.PrependUint8(d[_idx0-1])
return builder.Offset()
import MyGame.Example.NestedStruct
try:
from typing import List
except:
pass
class LargeArrayStructT(object):
# LargeArrayStructT
def __init__(
self,
d = None,
e = None,
f = None,
g = None,
h = None,
):
self.d = d # type: Optional[List[int]]
self.e = e # type: Optional[List[float]]
self.f = f # type: Optional[List[bool]]
self.g = g # type: Optional[List[MyGame.Example.NestedStruct.NestedStructT]]
self.h = h # type: Optional[List[int]]
@classmethod
def InitFromBuf(cls, buf, pos):
largeArrayStruct = LargeArrayStruct()
largeArrayStruct.Init(buf, pos)
return cls.InitFromObj(largeArrayStruct)
@classmethod
def InitFromPackedBuf(cls, buf, pos=0):
n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)
return cls.InitFromBuf(buf, pos+n)
@classmethod
def InitFromObj(cls, largeArrayStruct):
x = LargeArrayStructT()
x._UnPack(largeArrayStruct)
return x
# LargeArrayStructT
def _UnPack(self, largeArrayStruct):
if largeArrayStruct is None:
return
if not largeArrayStruct.DIsNone():
if np is None:
self.d = []
for i in range(largeArrayStruct.DLength()):
self.d.append(largeArrayStruct.D(i))
else:
self.d = largeArrayStruct.DAsNumpy()
if not largeArrayStruct.EIsNone():
if np is None:
self.e = []
for i in range(largeArrayStruct.ELength()):
self.e.append(largeArrayStruct.E(i))
else:
self.e = largeArrayStruct.EAsNumpy()
if not largeArrayStruct.FIsNone():
if np is None:
self.f = []
for i in range(largeArrayStruct.FLength()):
self.f.append(largeArrayStruct.F(i))
else:
self.f = largeArrayStruct.FAsNumpy()
if not largeArrayStruct.GIsNone():
self.g = []
for i in range(largeArrayStruct.GLength()):
if largeArrayStruct.G(i) is None:
self.g.append(None)
else:
nestedStruct_ = MyGame.Example.NestedStruct.NestedStructT.InitFromObj(largeArrayStruct.G(i))
self.g.append(nestedStruct_)
if not largeArrayStruct.HIsNone():
if np is None:
self.h = []
for i in range(largeArrayStruct.HLength()):
self.h.append(largeArrayStruct.H(i))
else:
self.h = largeArrayStruct.HAsNumpy()
# LargeArrayStructT
def Pack(self, builder):
return CreateLargeArrayStruct(builder, self.d, self.e, self.f, self.g.a, self.g.b, self.g.c, self.g.d, self.h)

View File

@@ -1,60 +0,0 @@
from __future__ import annotations
import flatbuffers
import numpy as np
import typing
from MyGame.Example.NestedStruct import NestedStruct, NestedStructT
from MyGame.Example.TestEnum import TestEnum
uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type
class LargeArrayStruct(object):
@classmethod
def SizeOf(cls) -> int: ...
def Init(self, buf: bytes, pos: int) -> None: ...
def D(self, i: int) -> typing.List[int]: ...
def DAsNumpy(self) -> np.ndarray: ...
def DLength(self) -> int: ...
def DIsNone(self) -> bool: ...
def E(self, i: int) -> typing.List[float]: ...
def EAsNumpy(self) -> np.ndarray: ...
def ELength(self) -> int: ...
def EIsNone(self) -> bool: ...
def F(self, i: int) -> typing.List[bool]: ...
def FAsNumpy(self) -> np.ndarray: ...
def FLength(self) -> int: ...
def FIsNone(self) -> bool: ...
def G(self, i: int) -> NestedStruct | None: ...
def GLength(self) -> int: ...
def GIsNone(self) -> bool: ...
def H(self, i: int) -> typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]: ...
def HAsNumpy(self) -> np.ndarray: ...
def HLength(self) -> int: ...
def HIsNone(self) -> bool: ...
class LargeArrayStructT(object):
d: typing.List[int]
e: typing.List[float]
f: typing.List[bool]
g: typing.List[NestedStructT]
h: typing.List[typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]]
def __init__(
self,
d: typing.List[int] | None = ...,
e: typing.List[float] | None = ...,
f: typing.List[bool] | None = ...,
g: typing.List['NestedStructT'] | None = ...,
h: typing.List[typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]] | None = ...,
) -> None: ...
@classmethod
def InitFromBuf(cls, buf: bytes, pos: int) -> LargeArrayStructT: ...
@classmethod
def InitFromPackedBuf(cls, buf: bytes, pos: int = 0) -> LargeArrayStructT: ...
@classmethod
def InitFromObj(cls, largeArrayStruct: LargeArrayStruct) -> LargeArrayStructT: ...
def _UnPack(self, largeArrayStruct: LargeArrayStruct) -> None: ...
def Pack(self, builder: flatbuffers.Builder) -> None: ...
def CreateLargeArrayStruct(builder: flatbuffers.Builder, d: int, e: float, f: bool, g_a: int, g_b: typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C], g_c: typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C], g_d: int, h: typing.Literal[TestEnum.A, TestEnum.B, TestEnum.C]) -> uoffset: ...

View File

@@ -1,57 +0,0 @@
// automatically generated by the FlatBuffers compiler, do not modify
package MyGame.Example;
import com.google.flatbuffers.BaseVector;
import com.google.flatbuffers.BooleanVector;
import com.google.flatbuffers.ByteVector;
import com.google.flatbuffers.Constants;
import com.google.flatbuffers.DoubleVector;
import com.google.flatbuffers.FlatBufferBuilder;
import com.google.flatbuffers.FloatVector;
import com.google.flatbuffers.IntVector;
import com.google.flatbuffers.LongVector;
import com.google.flatbuffers.ShortVector;
import com.google.flatbuffers.StringVector;
import com.google.flatbuffers.Struct;
import com.google.flatbuffers.UnionVector;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class LargeArrayStructT {
private int[] d;
private float[] e;
private boolean[] f;
private MyGame.Example.NestedStructT[] g;
private byte[] h;
public int[] getD() { return d; }
public void setD(int[] d) { if (d != null && d.length == 64) this.d = d; }
public float[] getE() { return e; }
public void setE(float[] e) { if (e != null && e.length == 64) this.e = e; }
public boolean[] getF() { return f; }
public void setF(boolean[] f) { if (f != null && f.length == 64) this.f = f; }
public MyGame.Example.NestedStructT[] getG() { return g; }
public void setG(MyGame.Example.NestedStructT[] g) { if (g != null && g.length == 64) this.g = g; }
public byte[] getH() { return h; }
public void setH(byte[] h) { if (h != null && h.length == 64) this.h = h; }
public LargeArrayStructT() {
this.d = new int[64];
this.e = new float[64];
this.f = new boolean[64];
this.g = new MyGame.Example.NestedStructT[64];
this.h = new byte[64];
}
}

View File

@@ -28,8 +28,6 @@ function Monster.New()
return o return o
end end
local FileIdentifier = "MONS"
function Monster.GetRootAsMonster(buf, offset) function Monster.GetRootAsMonster(buf, offset)
if type(buf) == "string" then if type(buf) == "string" then
buf = flatbuffers.binaryArray.New(buf) buf = flatbuffers.binaryArray.New(buf)
@@ -1101,12 +1099,4 @@ function Monster.End(builder)
return builder:EndObject() return builder:EndObject()
end end
function Monster.FinishMonsterBuffer(builder, offset)
builder:FinishWithIdentifier(offset, FileIdentifier)
end
function Monster.FinishSizePrefixedMonsterBuffer(builder, offset)
builder:FinishSizePrefixedWithIdentifier(offset, FileIdentifier)
end
return Monster return Monster

View File

@@ -914,16 +914,6 @@ def MonsterStartInventoryVector(builder, numElems):
def StartInventoryVector(builder, numElems): def StartInventoryVector(builder, numElems):
return MonsterStartInventoryVector(builder, numElems) return MonsterStartInventoryVector(builder, numElems)
def MonsterCreateInventoryVector(builder, data):
data = list(data)
builder.StartVector(1, len(data), 1)
for item in reversed(data):
builder.PrependUint8(item)
return builder.EndVector()
def CreateInventoryVector(builder, data):
return MonsterCreateInventoryVector(builder, data)
def MonsterAddColor(builder, color): def MonsterAddColor(builder, color):
builder.PrependUint8Slot(6, color, 8) builder.PrependUint8Slot(6, color, 8)
@@ -954,16 +944,6 @@ def MonsterStartTest4Vector(builder, numElems):
def StartTest4Vector(builder, numElems): def StartTest4Vector(builder, numElems):
return MonsterStartTest4Vector(builder, numElems) return MonsterStartTest4Vector(builder, numElems)
def MonsterCreateTest4Vector(builder, data):
data = list(data)
builder.StartVector(4, len(data), 2)
for item in reversed(data):
item.Pack(builder)
return builder.EndVector()
def CreateTest4Vector(builder, data):
return MonsterCreateTest4Vector(builder, data)
def MonsterAddTestarrayofstring(builder, testarrayofstring): def MonsterAddTestarrayofstring(builder, testarrayofstring):
builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayofstring), 0) builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayofstring), 0)
@@ -976,12 +956,6 @@ def MonsterStartTestarrayofstringVector(builder, numElems):
def StartTestarrayofstringVector(builder, numElems): def StartTestarrayofstringVector(builder, numElems):
return MonsterStartTestarrayofstringVector(builder, numElems) return MonsterStartTestarrayofstringVector(builder, numElems)
def MonsterCreateTestarrayofstringVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateTestarrayofstringVector(builder, data):
return MonsterCreateTestarrayofstringVector(builder, data)
def MonsterAddTestarrayoftables(builder, testarrayoftables): def MonsterAddTestarrayoftables(builder, testarrayoftables):
builder.PrependUOffsetTRelativeSlot(11, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayoftables), 0) builder.PrependUOffsetTRelativeSlot(11, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayoftables), 0)
@@ -994,12 +968,6 @@ def MonsterStartTestarrayoftablesVector(builder, numElems):
def StartTestarrayoftablesVector(builder, numElems): def StartTestarrayoftablesVector(builder, numElems):
return MonsterStartTestarrayoftablesVector(builder, numElems) return MonsterStartTestarrayoftablesVector(builder, numElems)
def MonsterCreateTestarrayoftablesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateTestarrayoftablesVector(builder, data):
return MonsterCreateTestarrayoftablesVector(builder, data)
def MonsterAddEnemy(builder, enemy): def MonsterAddEnemy(builder, enemy):
builder.PrependUOffsetTRelativeSlot(12, flatbuffers.number_types.UOffsetTFlags.py_type(enemy), 0) builder.PrependUOffsetTRelativeSlot(12, flatbuffers.number_types.UOffsetTFlags.py_type(enemy), 0)
@@ -1018,16 +986,6 @@ def MonsterStartTestnestedflatbufferVector(builder, numElems):
def StartTestnestedflatbufferVector(builder, numElems): def StartTestnestedflatbufferVector(builder, numElems):
return MonsterStartTestnestedflatbufferVector(builder, numElems) return MonsterStartTestnestedflatbufferVector(builder, numElems)
def MonsterCreateTestnestedflatbufferVector(builder, data):
data = list(data)
builder.StartVector(1, len(data), 1)
for item in reversed(data):
builder.PrependUint8(item)
return builder.EndVector()
def CreateTestnestedflatbufferVector(builder, data):
return MonsterCreateTestnestedflatbufferVector(builder, data)
def MonsterMakeTestnestedflatbufferVectorFromBytes(builder, bytes): def MonsterMakeTestnestedflatbufferVectorFromBytes(builder, bytes):
builder.StartVector(1, len(bytes), 1) builder.StartVector(1, len(bytes), 1)
builder.head = builder.head - len(bytes) builder.head = builder.head - len(bytes)
@@ -1107,16 +1065,6 @@ def MonsterStartTestarrayofboolsVector(builder, numElems):
def StartTestarrayofboolsVector(builder, numElems): def StartTestarrayofboolsVector(builder, numElems):
return MonsterStartTestarrayofboolsVector(builder, numElems) return MonsterStartTestarrayofboolsVector(builder, numElems)
def MonsterCreateTestarrayofboolsVector(builder, data):
data = list(data)
builder.StartVector(1, len(data), 1)
for item in reversed(data):
builder.PrependBool(item)
return builder.EndVector()
def CreateTestarrayofboolsVector(builder, data):
return MonsterCreateTestarrayofboolsVector(builder, data)
def MonsterAddTestf(builder, testf): def MonsterAddTestf(builder, testf):
builder.PrependFloat32Slot(25, testf, 3.14159) builder.PrependFloat32Slot(25, testf, 3.14159)
@@ -1147,12 +1095,6 @@ def MonsterStartTestarrayofstring2Vector(builder, numElems):
def StartTestarrayofstring2Vector(builder, numElems): def StartTestarrayofstring2Vector(builder, numElems):
return MonsterStartTestarrayofstring2Vector(builder, numElems) return MonsterStartTestarrayofstring2Vector(builder, numElems)
def MonsterCreateTestarrayofstring2Vector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateTestarrayofstring2Vector(builder, data):
return MonsterCreateTestarrayofstring2Vector(builder, data)
def MonsterAddTestarrayofsortedstruct(builder, testarrayofsortedstruct): def MonsterAddTestarrayofsortedstruct(builder, testarrayofsortedstruct):
builder.PrependUOffsetTRelativeSlot(29, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayofsortedstruct), 0) builder.PrependUOffsetTRelativeSlot(29, flatbuffers.number_types.UOffsetTFlags.py_type(testarrayofsortedstruct), 0)
@@ -1165,16 +1107,6 @@ def MonsterStartTestarrayofsortedstructVector(builder, numElems):
def StartTestarrayofsortedstructVector(builder, numElems): def StartTestarrayofsortedstructVector(builder, numElems):
return MonsterStartTestarrayofsortedstructVector(builder, numElems) return MonsterStartTestarrayofsortedstructVector(builder, numElems)
def MonsterCreateTestarrayofsortedstructVector(builder, data):
data = list(data)
builder.StartVector(8, len(data), 4)
for item in reversed(data):
item.Pack(builder)
return builder.EndVector()
def CreateTestarrayofsortedstructVector(builder, data):
return MonsterCreateTestarrayofsortedstructVector(builder, data)
def MonsterAddFlex(builder, flex): def MonsterAddFlex(builder, flex):
builder.PrependUOffsetTRelativeSlot(30, flatbuffers.number_types.UOffsetTFlags.py_type(flex), 0) builder.PrependUOffsetTRelativeSlot(30, flatbuffers.number_types.UOffsetTFlags.py_type(flex), 0)
@@ -1187,16 +1119,6 @@ def MonsterStartFlexVector(builder, numElems):
def StartFlexVector(builder, numElems): def StartFlexVector(builder, numElems):
return MonsterStartFlexVector(builder, numElems) return MonsterStartFlexVector(builder, numElems)
def MonsterCreateFlexVector(builder, data):
data = list(data)
builder.StartVector(1, len(data), 1)
for item in reversed(data):
builder.PrependUint8(item)
return builder.EndVector()
def CreateFlexVector(builder, data):
return MonsterCreateFlexVector(builder, data)
def MonsterAddTest5(builder, test5): def MonsterAddTest5(builder, test5):
builder.PrependUOffsetTRelativeSlot(31, flatbuffers.number_types.UOffsetTFlags.py_type(test5), 0) builder.PrependUOffsetTRelativeSlot(31, flatbuffers.number_types.UOffsetTFlags.py_type(test5), 0)
@@ -1209,16 +1131,6 @@ def MonsterStartTest5Vector(builder, numElems):
def StartTest5Vector(builder, numElems): def StartTest5Vector(builder, numElems):
return MonsterStartTest5Vector(builder, numElems) return MonsterStartTest5Vector(builder, numElems)
def MonsterCreateTest5Vector(builder, data):
data = list(data)
builder.StartVector(4, len(data), 2)
for item in reversed(data):
item.Pack(builder)
return builder.EndVector()
def CreateTest5Vector(builder, data):
return MonsterCreateTest5Vector(builder, data)
def MonsterAddVectorOfLongs(builder, vectorOfLongs): def MonsterAddVectorOfLongs(builder, vectorOfLongs):
builder.PrependUOffsetTRelativeSlot(32, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfLongs), 0) builder.PrependUOffsetTRelativeSlot(32, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfLongs), 0)
@@ -1231,16 +1143,6 @@ def MonsterStartVectorOfLongsVector(builder, numElems):
def StartVectorOfLongsVector(builder, numElems): def StartVectorOfLongsVector(builder, numElems):
return MonsterStartVectorOfLongsVector(builder, numElems) return MonsterStartVectorOfLongsVector(builder, numElems)
def MonsterCreateVectorOfLongsVector(builder, data):
data = list(data)
builder.StartVector(8, len(data), 8)
for item in reversed(data):
builder.PrependInt64(item)
return builder.EndVector()
def CreateVectorOfLongsVector(builder, data):
return MonsterCreateVectorOfLongsVector(builder, data)
def MonsterAddVectorOfDoubles(builder, vectorOfDoubles): def MonsterAddVectorOfDoubles(builder, vectorOfDoubles):
builder.PrependUOffsetTRelativeSlot(33, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfDoubles), 0) builder.PrependUOffsetTRelativeSlot(33, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfDoubles), 0)
@@ -1253,16 +1155,6 @@ def MonsterStartVectorOfDoublesVector(builder, numElems):
def StartVectorOfDoublesVector(builder, numElems): def StartVectorOfDoublesVector(builder, numElems):
return MonsterStartVectorOfDoublesVector(builder, numElems) return MonsterStartVectorOfDoublesVector(builder, numElems)
def MonsterCreateVectorOfDoublesVector(builder, data):
data = list(data)
builder.StartVector(8, len(data), 8)
for item in reversed(data):
builder.PrependFloat64(item)
return builder.EndVector()
def CreateVectorOfDoublesVector(builder, data):
return MonsterCreateVectorOfDoublesVector(builder, data)
def MonsterAddParentNamespaceTest(builder, parentNamespaceTest): def MonsterAddParentNamespaceTest(builder, parentNamespaceTest):
builder.PrependUOffsetTRelativeSlot(34, flatbuffers.number_types.UOffsetTFlags.py_type(parentNamespaceTest), 0) builder.PrependUOffsetTRelativeSlot(34, flatbuffers.number_types.UOffsetTFlags.py_type(parentNamespaceTest), 0)
@@ -1281,12 +1173,6 @@ def MonsterStartVectorOfReferrablesVector(builder, numElems):
def StartVectorOfReferrablesVector(builder, numElems): def StartVectorOfReferrablesVector(builder, numElems):
return MonsterStartVectorOfReferrablesVector(builder, numElems) return MonsterStartVectorOfReferrablesVector(builder, numElems)
def MonsterCreateVectorOfReferrablesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateVectorOfReferrablesVector(builder, data):
return MonsterCreateVectorOfReferrablesVector(builder, data)
def MonsterAddSingleWeakReference(builder, singleWeakReference): def MonsterAddSingleWeakReference(builder, singleWeakReference):
builder.PrependUint64Slot(36, singleWeakReference, 0) builder.PrependUint64Slot(36, singleWeakReference, 0)
@@ -1305,16 +1191,6 @@ def MonsterStartVectorOfWeakReferencesVector(builder, numElems):
def StartVectorOfWeakReferencesVector(builder, numElems): def StartVectorOfWeakReferencesVector(builder, numElems):
return MonsterStartVectorOfWeakReferencesVector(builder, numElems) return MonsterStartVectorOfWeakReferencesVector(builder, numElems)
def MonsterCreateVectorOfWeakReferencesVector(builder, data):
data = list(data)
builder.StartVector(8, len(data), 8)
for item in reversed(data):
builder.PrependUint64(item)
return builder.EndVector()
def CreateVectorOfWeakReferencesVector(builder, data):
return MonsterCreateVectorOfWeakReferencesVector(builder, data)
def MonsterAddVectorOfStrongReferrables(builder, vectorOfStrongReferrables): def MonsterAddVectorOfStrongReferrables(builder, vectorOfStrongReferrables):
builder.PrependUOffsetTRelativeSlot(38, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfStrongReferrables), 0) builder.PrependUOffsetTRelativeSlot(38, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfStrongReferrables), 0)
@@ -1327,12 +1203,6 @@ def MonsterStartVectorOfStrongReferrablesVector(builder, numElems):
def StartVectorOfStrongReferrablesVector(builder, numElems): def StartVectorOfStrongReferrablesVector(builder, numElems):
return MonsterStartVectorOfStrongReferrablesVector(builder, numElems) return MonsterStartVectorOfStrongReferrablesVector(builder, numElems)
def MonsterCreateVectorOfStrongReferrablesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateVectorOfStrongReferrablesVector(builder, data):
return MonsterCreateVectorOfStrongReferrablesVector(builder, data)
def MonsterAddCoOwningReference(builder, coOwningReference): def MonsterAddCoOwningReference(builder, coOwningReference):
builder.PrependUint64Slot(39, coOwningReference, 0) builder.PrependUint64Slot(39, coOwningReference, 0)
@@ -1351,16 +1221,6 @@ def MonsterStartVectorOfCoOwningReferencesVector(builder, numElems):
def StartVectorOfCoOwningReferencesVector(builder, numElems): def StartVectorOfCoOwningReferencesVector(builder, numElems):
return MonsterStartVectorOfCoOwningReferencesVector(builder, numElems) return MonsterStartVectorOfCoOwningReferencesVector(builder, numElems)
def MonsterCreateVectorOfCoOwningReferencesVector(builder, data):
data = list(data)
builder.StartVector(8, len(data), 8)
for item in reversed(data):
builder.PrependUint64(item)
return builder.EndVector()
def CreateVectorOfCoOwningReferencesVector(builder, data):
return MonsterCreateVectorOfCoOwningReferencesVector(builder, data)
def MonsterAddNonOwningReference(builder, nonOwningReference): def MonsterAddNonOwningReference(builder, nonOwningReference):
builder.PrependUint64Slot(41, nonOwningReference, 0) builder.PrependUint64Slot(41, nonOwningReference, 0)
@@ -1379,16 +1239,6 @@ def MonsterStartVectorOfNonOwningReferencesVector(builder, numElems):
def StartVectorOfNonOwningReferencesVector(builder, numElems): def StartVectorOfNonOwningReferencesVector(builder, numElems):
return MonsterStartVectorOfNonOwningReferencesVector(builder, numElems) return MonsterStartVectorOfNonOwningReferencesVector(builder, numElems)
def MonsterCreateVectorOfNonOwningReferencesVector(builder, data):
data = list(data)
builder.StartVector(8, len(data), 8)
for item in reversed(data):
builder.PrependUint64(item)
return builder.EndVector()
def CreateVectorOfNonOwningReferencesVector(builder, data):
return MonsterCreateVectorOfNonOwningReferencesVector(builder, data)
def MonsterAddAnyUniqueType(builder, anyUniqueType): def MonsterAddAnyUniqueType(builder, anyUniqueType):
builder.PrependUint8Slot(43, anyUniqueType, 0) builder.PrependUint8Slot(43, anyUniqueType, 0)
@@ -1425,16 +1275,6 @@ def MonsterStartVectorOfEnumsVector(builder, numElems):
def StartVectorOfEnumsVector(builder, numElems): def StartVectorOfEnumsVector(builder, numElems):
return MonsterStartVectorOfEnumsVector(builder, numElems) return MonsterStartVectorOfEnumsVector(builder, numElems)
def MonsterCreateVectorOfEnumsVector(builder, data):
data = list(data)
builder.StartVector(1, len(data), 1)
for item in reversed(data):
builder.PrependUint8(item)
return builder.EndVector()
def CreateVectorOfEnumsVector(builder, data):
return MonsterCreateVectorOfEnumsVector(builder, data)
def MonsterAddSignedEnum(builder, signedEnum): def MonsterAddSignedEnum(builder, signedEnum):
builder.PrependInt8Slot(48, signedEnum, -1) builder.PrependInt8Slot(48, signedEnum, -1)
@@ -1453,16 +1293,6 @@ def MonsterStartTestrequirednestedflatbufferVector(builder, numElems):
def StartTestrequirednestedflatbufferVector(builder, numElems): def StartTestrequirednestedflatbufferVector(builder, numElems):
return MonsterStartTestrequirednestedflatbufferVector(builder, numElems) return MonsterStartTestrequirednestedflatbufferVector(builder, numElems)
def MonsterCreateTestrequirednestedflatbufferVector(builder, data):
data = list(data)
builder.StartVector(1, len(data), 1)
for item in reversed(data):
builder.PrependUint8(item)
return builder.EndVector()
def CreateTestrequirednestedflatbufferVector(builder, data):
return MonsterCreateTestrequirednestedflatbufferVector(builder, data)
def MonsterMakeTestrequirednestedflatbufferVectorFromBytes(builder, bytes): def MonsterMakeTestrequirednestedflatbufferVectorFromBytes(builder, bytes):
builder.StartVector(1, len(bytes), 1) builder.StartVector(1, len(bytes), 1)
builder.head = builder.head - len(bytes) builder.head = builder.head - len(bytes)
@@ -1482,12 +1312,6 @@ def MonsterStartScalarKeySortedTablesVector(builder, numElems):
def StartScalarKeySortedTablesVector(builder, numElems): def StartScalarKeySortedTablesVector(builder, numElems):
return MonsterStartScalarKeySortedTablesVector(builder, numElems) return MonsterStartScalarKeySortedTablesVector(builder, numElems)
def MonsterCreateScalarKeySortedTablesVector(builder, data):
return builder.CreateVectorOfTables(data)
def CreateScalarKeySortedTablesVector(builder, data):
return MonsterCreateScalarKeySortedTablesVector(builder, data)
def MonsterAddNativeInline(builder, nativeInline): def MonsterAddNativeInline(builder, nativeInline):
builder.PrependStructSlot(51, flatbuffers.number_types.UOffsetTFlags.py_type(nativeInline), 0) builder.PrependStructSlot(51, flatbuffers.number_types.UOffsetTFlags.py_type(nativeInline), 0)

View File

@@ -17,30 +17,12 @@ public struct NestedStruct : IFlatbufferObject
public NestedStruct __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } public NestedStruct __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
public int A(int j) { return __p.bb.GetInt(__p.bb_pos + 0 + j * 4); } public int A(int j) { return __p.bb.GetInt(__p.bb_pos + 0 + j * 4); }
public const int ALength = 2;
#if ENABLE_SPAN_T
public Span<int> GetABytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, int>(__p.bb.ToSpan(__p.bb_pos + 0, 8)); }
#else
public ArraySegment<byte>? GetABytes() { return __p.bb.ToArraySegment(__p.bb_pos + 0, 8);}
#endif
public void MutateA(int j, int a) { __p.bb.PutInt(__p.bb_pos + 0 + j * 4, a); } public void MutateA(int j, int a) { __p.bb.PutInt(__p.bb_pos + 0 + j * 4, a); }
public MyGame.Example.TestEnum B { get { return (MyGame.Example.TestEnum)__p.bb.GetSbyte(__p.bb_pos + 8); } } public MyGame.Example.TestEnum B { get { return (MyGame.Example.TestEnum)__p.bb.GetSbyte(__p.bb_pos + 8); } }
public void MutateB(MyGame.Example.TestEnum b) { __p.bb.PutSbyte(__p.bb_pos + 8, (sbyte)b); } public void MutateB(MyGame.Example.TestEnum b) { __p.bb.PutSbyte(__p.bb_pos + 8, (sbyte)b); }
public MyGame.Example.TestEnum C(int j) { return (MyGame.Example.TestEnum)__p.bb.GetSbyte(__p.bb_pos + 9 + j * 1); } public MyGame.Example.TestEnum C(int j) { return (MyGame.Example.TestEnum)__p.bb.GetSbyte(__p.bb_pos + 9 + j * 1); }
public const int CLength = 2;
#if ENABLE_SPAN_T
public Span<MyGame.Example.TestEnum> GetCBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, MyGame.Example.TestEnum>(__p.bb.ToSpan(__p.bb_pos + 9, 2)); }
#else
public ArraySegment<byte>? GetCBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 9, 2);}
#endif
public void MutateC(int j, MyGame.Example.TestEnum c) { __p.bb.PutSbyte(__p.bb_pos + 9 + j * 1, (sbyte)c); } public void MutateC(int j, MyGame.Example.TestEnum c) { __p.bb.PutSbyte(__p.bb_pos + 9 + j * 1, (sbyte)c); }
public long D(int j) { return __p.bb.GetLong(__p.bb_pos + 16 + j * 8); } public long D(int j) { return __p.bb.GetLong(__p.bb_pos + 16 + j * 8); }
public const int DLength = 2;
#if ENABLE_SPAN_T
public Span<long> GetDBytes() { return System.Runtime.InteropServices.MemoryMarshal.Cast<byte, long>(__p.bb.ToSpan(__p.bb_pos + 16, 16)); }
#else
public ArraySegment<byte>? GetDBytes() { return __p.bb.ToArraySegment(__p.bb_pos + 16, 16);}
#endif
public void MutateD(int j, long d) { __p.bb.PutLong(__p.bb_pos + 16 + j * 8, d); } public void MutateD(int j, long d) { __p.bb.PutLong(__p.bb_pos + 16 + j * 8, d); }
public static Offset<MyGame.Example.NestedStruct> CreateNestedStruct(FlatBufferBuilder builder, int[] A, MyGame.Example.TestEnum B, MyGame.Example.TestEnum[] C, long[] D) { public static Offset<MyGame.Example.NestedStruct> CreateNestedStruct(FlatBufferBuilder builder, int[] A, MyGame.Example.TestEnum B, MyGame.Example.TestEnum[] C, long[] D) {

View File

@@ -230,16 +230,6 @@ def TypeAliasesStartV8Vector(builder, numElems):
def StartV8Vector(builder, numElems): def StartV8Vector(builder, numElems):
return TypeAliasesStartV8Vector(builder, numElems) return TypeAliasesStartV8Vector(builder, numElems)
def TypeAliasesCreateV8Vector(builder, data):
data = list(data)
builder.StartVector(1, len(data), 1)
for item in reversed(data):
builder.PrependInt8(item)
return builder.EndVector()
def CreateV8Vector(builder, data):
return TypeAliasesCreateV8Vector(builder, data)
def TypeAliasesAddVf64(builder, vf64): def TypeAliasesAddVf64(builder, vf64):
builder.PrependUOffsetTRelativeSlot(11, flatbuffers.number_types.UOffsetTFlags.py_type(vf64), 0) builder.PrependUOffsetTRelativeSlot(11, flatbuffers.number_types.UOffsetTFlags.py_type(vf64), 0)
@@ -252,16 +242,6 @@ def TypeAliasesStartVf64Vector(builder, numElems):
def StartVf64Vector(builder, numElems): def StartVf64Vector(builder, numElems):
return TypeAliasesStartVf64Vector(builder, numElems) return TypeAliasesStartVf64Vector(builder, numElems)
def TypeAliasesCreateVf64Vector(builder, data):
data = list(data)
builder.StartVector(8, len(data), 8)
for item in reversed(data):
builder.PrependFloat64(item)
return builder.EndVector()
def CreateVf64Vector(builder, data):
return TypeAliasesCreateVf64Vector(builder, data)
def TypeAliasesEnd(builder): def TypeAliasesEnd(builder):
return builder.EndObject() return builder.EndObject()

View File

@@ -5,7 +5,6 @@
import flatbuffers import flatbuffers
from flatbuffers.compat import import_numpy from flatbuffers.compat import import_numpy
from typing import Any from typing import Any
from typing import Iterable
np = import_numpy() np = import_numpy()
class MonsterExtra(object): class MonsterExtra(object):
@@ -206,16 +205,6 @@ def MonsterExtraStartDvecVector(builder, numElems: int) -> int:
def StartDvecVector(builder, numElems: int) -> int: def StartDvecVector(builder, numElems: int) -> int:
return MonsterExtraStartDvecVector(builder, numElems) return MonsterExtraStartDvecVector(builder, numElems)
def MonsterExtraCreateDvecVector(builder: flatbuffers.Builder, data: Iterable[Any]) -> int:
data = list(data)
builder.StartVector(8, len(data), 8)
for item in reversed(data):
builder.PrependFloat64(item)
return builder.EndVector()
def CreateDvecVector(builder: flatbuffers.Builder, data: Iterable[Any]) -> int:
return MonsterExtraCreateDvecVector(builder, data)
def MonsterExtraAddFvec(builder: flatbuffers.Builder, fvec: int): def MonsterExtraAddFvec(builder: flatbuffers.Builder, fvec: int):
builder.PrependUOffsetTRelativeSlot(9, flatbuffers.number_types.UOffsetTFlags.py_type(fvec), 0) builder.PrependUOffsetTRelativeSlot(9, flatbuffers.number_types.UOffsetTFlags.py_type(fvec), 0)
@@ -228,16 +217,6 @@ def MonsterExtraStartFvecVector(builder, numElems: int) -> int:
def StartFvecVector(builder, numElems: int) -> int: def StartFvecVector(builder, numElems: int) -> int:
return MonsterExtraStartFvecVector(builder, numElems) return MonsterExtraStartFvecVector(builder, numElems)
def MonsterExtraCreateFvecVector(builder: flatbuffers.Builder, data: Iterable[Any]) -> int:
data = list(data)
builder.StartVector(4, len(data), 4)
for item in reversed(data):
builder.PrependFloat32(item)
return builder.EndVector()
def CreateFvecVector(builder: flatbuffers.Builder, data: Iterable[Any]) -> int:
return MonsterExtraCreateFvecVector(builder, data)
def MonsterExtraEnd(builder: flatbuffers.Builder) -> int: def MonsterExtraEnd(builder: flatbuffers.Builder) -> int:
return builder.EndObject() return builder.EndObject()

View File

@@ -77,13 +77,9 @@ def MonsterExtraAddF3(builder: flatbuffers.Builder, f3: float) -> None: ...
def MonsterExtraAddDvec(builder: flatbuffers.Builder, dvec: uoffset) -> None: ... def MonsterExtraAddDvec(builder: flatbuffers.Builder, dvec: uoffset) -> None: ...
def MonsterExtraStartDvecVector(builder: flatbuffers.Builder, num_elems: int) -> uoffset: ... def MonsterExtraStartDvecVector(builder: flatbuffers.Builder, num_elems: int) -> uoffset: ...
def StartDvecVector(builder: flatbuffers.Builder, num_elems: int) -> uoffset: ... def StartDvecVector(builder: flatbuffers.Builder, num_elems: int) -> uoffset: ...
def MonsterExtraCreateDvecVector(builder: flatbuffers.Builder, data: typing.Iterable[typing.Any]) -> uoffset: ...
def CreateDvecVector(builder: flatbuffers.Builder, data: typing.Iterable[typing.Any]) -> uoffset: ...
def MonsterExtraAddFvec(builder: flatbuffers.Builder, fvec: uoffset) -> None: ... def MonsterExtraAddFvec(builder: flatbuffers.Builder, fvec: uoffset) -> None: ...
def MonsterExtraStartFvecVector(builder: flatbuffers.Builder, num_elems: int) -> uoffset: ... def MonsterExtraStartFvecVector(builder: flatbuffers.Builder, num_elems: int) -> uoffset: ...
def StartFvecVector(builder: flatbuffers.Builder, num_elems: int) -> uoffset: ... def StartFvecVector(builder: flatbuffers.Builder, num_elems: int) -> uoffset: ...
def MonsterExtraCreateFvecVector(builder: flatbuffers.Builder, data: typing.Iterable[typing.Any]) -> uoffset: ...
def CreateFvecVector(builder: flatbuffers.Builder, data: typing.Iterable[typing.Any]) -> uoffset: ...
def MonsterExtraEnd(builder: flatbuffers.Builder) -> uoffset: ... def MonsterExtraEnd(builder: flatbuffers.Builder) -> uoffset: ...
def End(builder: flatbuffers.Builder) -> uoffset: ... def End(builder: flatbuffers.Builder) -> uoffset: ...

View File

@@ -28,7 +28,6 @@ ${test_dir}/../flatc -p -o ${gen_code_path} -I include_test monster_extra.fbs --
${test_dir}/../flatc -p -o ${gen_code_path} -I include_test arrays_test.fbs --gen-object-api --python-typing ${test_dir}/../flatc -p -o ${gen_code_path} -I include_test arrays_test.fbs --gen-object-api --python-typing
${test_dir}/../flatc -p -o ${gen_code_path} -I include_test nested_union_test.fbs --gen-object-api --python-typing --python-decode-obj-api-strings ${test_dir}/../flatc -p -o ${gen_code_path} -I include_test nested_union_test.fbs --gen-object-api --python-typing --python-decode-obj-api-strings
${test_dir}/../flatc -p -o ${gen_code_path} -I include_test service_test.fbs --grpc --grpc-python-typed-handlers --python-typing --no-python-gen-numpy --gen-onefile ${test_dir}/../flatc -p -o ${gen_code_path} -I include_test service_test.fbs --grpc --grpc-python-typed-handlers --python-typing --no-python-gen-numpy --gen-onefile
${test_dir}/../flatc -p -o ${gen_code_path} union_name_test.fbs --gen-object-api
# Syntax: run_tests <interpreter> <benchmark vtable dedupes> # Syntax: run_tests <interpreter> <benchmark vtable dedupes>
# <benchmark read count> <benchmark build count> # <benchmark read count> <benchmark build count>

View File

@@ -3,7 +3,7 @@
#include "flatbuffers/flatbuffer_builder.h" #include "flatbuffers/flatbuffer_builder.h"
#include "flatbuffers/util.h" #include "flatbuffers/util.h"
#include "test_assert.h" #include "test_assert.h"
#include "tests/alignment_test_generated.h" #include "tests/alignment_test.fbs.h"
namespace flatbuffers { namespace flatbuffers {
namespace tests { namespace tests {

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More