mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-04 04:33:23 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d1867fb4cf |
@@ -1,16 +1,25 @@
|
|||||||
---
|
---
|
||||||
buildifier: latest
|
buildifier: latest
|
||||||
matrix:
|
bazel: 6.4.0
|
||||||
bazel:
|
platforms:
|
||||||
- 7.x
|
ubuntu1804:
|
||||||
- 8.x
|
|
||||||
tasks:
|
|
||||||
verify_ubuntu2004:
|
|
||||||
platform: ubuntu2004
|
|
||||||
bazel: ${{ bazel }}
|
|
||||||
environment:
|
environment:
|
||||||
CC: clang
|
CC: clang
|
||||||
SWIFT_VERSION: "5.10"
|
SWIFT_VERSION: "5.5.3"
|
||||||
|
SWIFT_HOME: "$HOME/swift-$SWIFT_VERSION"
|
||||||
|
PATH: "$PATH:$SWIFT_HOME/usr/bin"
|
||||||
|
shell_commands:
|
||||||
|
- "echo --- Downloading and extracting Swift $SWIFT_VERSION to $SWIFT_HOME"
|
||||||
|
- "mkdir $SWIFT_HOME"
|
||||||
|
- "curl https://download.swift.org/swift-${SWIFT_VERSION}-release/ubuntu1804/swift-${SWIFT_VERSION}-RELEASE/swift-${SWIFT_VERSION}-RELEASE-ubuntu18.04.tar.gz | tar xvz --strip-components=1 -C $SWIFT_HOME"
|
||||||
|
build_targets:
|
||||||
|
- "//..."
|
||||||
|
test_targets:
|
||||||
|
- "//..."
|
||||||
|
ubuntu2004:
|
||||||
|
environment:
|
||||||
|
CC: clang
|
||||||
|
SWIFT_VERSION: "5.5.3"
|
||||||
SWIFT_HOME: "$HOME/swift-$SWIFT_VERSION"
|
SWIFT_HOME: "$HOME/swift-$SWIFT_VERSION"
|
||||||
PATH: "$PATH:$SWIFT_HOME/usr/bin"
|
PATH: "$PATH:$SWIFT_HOME/usr/bin"
|
||||||
shell_commands:
|
shell_commands:
|
||||||
@@ -21,40 +30,8 @@ tasks:
|
|||||||
- "//..."
|
- "//..."
|
||||||
test_targets:
|
test_targets:
|
||||||
- "//..."
|
- "//..."
|
||||||
verify_ubuntu2204:
|
macos:
|
||||||
platform: ubuntu2204
|
|
||||||
bazel: ${{ bazel }}
|
|
||||||
environment:
|
|
||||||
CC: clang
|
|
||||||
SWIFT_VERSION: "5.10"
|
|
||||||
SWIFT_HOME: "$HOME/swift-$SWIFT_VERSION"
|
|
||||||
PATH: "$PATH:$SWIFT_HOME/usr/bin"
|
|
||||||
shell_commands:
|
|
||||||
- "echo --- Downloading and extracting Swift $SWIFT_VERSION to $SWIFT_HOME"
|
|
||||||
- "mkdir $SWIFT_HOME"
|
|
||||||
- "curl https://download.swift.org/swift-${SWIFT_VERSION}-release/ubuntu2204/swift-${SWIFT_VERSION}-RELEASE/swift-${SWIFT_VERSION}-RELEASE-ubuntu22.04.tar.gz | tar xvz --strip-components=1 -C $SWIFT_HOME"
|
|
||||||
build_targets:
|
build_targets:
|
||||||
- "//..."
|
- "//..."
|
||||||
test_targets:
|
test_targets:
|
||||||
- "//..."
|
- "//..."
|
||||||
test_module_cpp:
|
|
||||||
platform: ubuntu2204
|
|
||||||
bazel: ${{ bazel }}
|
|
||||||
working_directory: tests/bazel_repository_test_dir
|
|
||||||
build_targets:
|
|
||||||
- "//..."
|
|
||||||
test_module_ts:
|
|
||||||
platform: ubuntu2204
|
|
||||||
bazel: ${{ bazel }}
|
|
||||||
working_directory: tests/ts/bazel_repository_test_dir
|
|
||||||
test_targets:
|
|
||||||
- "//..."
|
|
||||||
verify_macos:
|
|
||||||
platform: macos
|
|
||||||
bazel: ${{ bazel }}
|
|
||||||
xcode_version: "15.2"
|
|
||||||
build_targets:
|
|
||||||
- "//:flatbuffers"
|
|
||||||
- "//:flatc"
|
|
||||||
test_targets:
|
|
||||||
- "//tests:flatbuffers_test"
|
|
||||||
|
|||||||
@@ -1,5 +1 @@
|
|||||||
ts/node_modules
|
node_modules
|
||||||
|
|
||||||
# Test workspaces
|
|
||||||
tests/bazel_repository_test_dir
|
|
||||||
tests/ts/bazel_repository_test_dir
|
|
||||||
|
|||||||
18
.bazelrc
18
.bazelrc
@@ -1,18 +1,4 @@
|
|||||||
# We cannot use "common" here because the "version" command doesn't support
|
# We cannot use "common" here because the "version" command doesn't support
|
||||||
# --deleted_packages. We need to specify it for both build and query instead.
|
# --deleted_packages. We need to specify it for both build and query instead.
|
||||||
build --deleted_packages=tests/bazel_repository_test_dir,tests/ts/bazel_repository_test_dir
|
build --deleted_packages=tests/ts/bazel_repository_test_dir
|
||||||
query --deleted_packages=tests/bazel_repository_test_dir,tests/ts/bazel_repository_test_dir
|
query --deleted_packages=tests/ts/bazel_repository_test_dir
|
||||||
# Point tools such as coursier (used in rules_jvm_external) to Bazel's internal JDK
|
|
||||||
# suggested in https://github.com/bazelbuild/rules_jvm_external/issues/445
|
|
||||||
common --repo_env=JAVA_HOME=../bazel_tools/jdk
|
|
||||||
common --action_env=JAVA_HOME=../bazel_tools/jdk
|
|
||||||
# Workaround "Error: need --enable_runfiles on Windows for to support rules_js"
|
|
||||||
common:windows --enable_runfiles
|
|
||||||
# Swift is not required on Windows
|
|
||||||
common:windows --deleted_packages=swift
|
|
||||||
# Ignore warnings in external dependencies
|
|
||||||
build --per_file_copt=external/.*@-Wno-everything --host_per_file_copt=external/.*@-Wno-everything
|
|
||||||
# Honor the setting of `skipLibCheck` in the tsconfig.json file.
|
|
||||||
common --@aspect_rules_ts//ts:skipLibCheck=honor_tsconfig
|
|
||||||
# Use "tsc" as the transpiler when ts_project has no `transpiler` set.
|
|
||||||
common --@aspect_rules_ts//ts:default_to_tsc_transpiler
|
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
---
|
---
|
||||||
Language: Cpp
|
Language: Cpp
|
||||||
BasedOnStyle: Google
|
BasedOnStyle: Google
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
PointerAlignment: Right
|
||||||
|
IndentPPDirectives: AfterHash
|
||||||
|
Cpp11BracedListStyle: false
|
||||||
|
AlwaysBreakTemplateDeclarations: false
|
||||||
|
AllowShortCaseLabelsOnASingleLine: true
|
||||||
|
SpaceAfterTemplateKeyword: false
|
||||||
|
AllowShortBlocksOnASingleLine: true
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|||||||
13
.eslintrc.js
Normal file
13
.eslintrc.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/* eslint-env node */
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
plugins: [
|
||||||
|
'@typescript-eslint',
|
||||||
|
],
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'plugin:@typescript-eslint/recommended',
|
||||||
|
]
|
||||||
|
};
|
||||||
5
.github/CODEOWNERS
vendored
5
.github/CODEOWNERS
vendored
@@ -1,5 +0,0 @@
|
|||||||
# Default owner
|
|
||||||
* @dbaileychess derekbailey@google.com
|
|
||||||
|
|
||||||
# Prevent modification of this file
|
|
||||||
.github/CODEOWNERS @dbaileychess derekbailey@google.com
|
|
||||||
11
.github/ISSUE_TEMPLATE/404-doc.md
vendored
11
.github/ISSUE_TEMPLATE/404-doc.md
vendored
@@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
name: 404 Doc
|
|
||||||
about: To fix broken documentation links
|
|
||||||
title: "[Doc 404]"
|
|
||||||
labels: documentation
|
|
||||||
assignees: dbaileychess
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Target URL:
|
|
||||||
[Optional] Source Site:
|
|
||||||
6
.github/dependabot.yml
vendored
6
.github/dependabot.yml
vendored
@@ -1,6 +0,0 @@
|
|||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: "github-actions"
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: "weekly"
|
|
||||||
146
.github/labeler.yml
vendored
146
.github/labeler.yml
vendored
@@ -5,133 +5,93 @@
|
|||||||
#
|
#
|
||||||
# See .github/workflows/label.yml for Github Action workflow script
|
# See .github/workflows/label.yml for Github Action workflow script
|
||||||
|
|
||||||
"c#":
|
c#:
|
||||||
- changed-files:
|
- '**/*.cs'
|
||||||
- any-glob-to-any-file:
|
- net/**/*
|
||||||
- '**/*.cs'
|
- tests/FlatBuffers.Test/**/*
|
||||||
- 'net/**/*'
|
- tests/FlatBuffers.Benchmarks/**/*
|
||||||
- 'tests/FlatBuffers.Test/**/*'
|
- src/idl_gen_csharp.cpp
|
||||||
- 'tests/FlatBuffers.Benchmarks/**/*'
|
|
||||||
- 'src/idl_gen_csharp.cpp'
|
|
||||||
|
|
||||||
swift:
|
swift:
|
||||||
- changed-files:
|
- '**/*.swift'
|
||||||
- any-glob-to-any-file:
|
- swift/**/*
|
||||||
- '**/*.swift'
|
- tests/swift/**
|
||||||
- 'swift/**/*'
|
- src/idl_gen_swift.cpp
|
||||||
- 'tests/swift/**'
|
|
||||||
- 'src/idl_gen_swift.cpp'
|
|
||||||
|
|
||||||
nim:
|
nim:
|
||||||
- changed-files:
|
- '**/*.nim'
|
||||||
- any-glob-to-any-file:
|
- nim/**/*
|
||||||
- '**/*.nim'
|
- src/idl_gen_nim.cpp
|
||||||
- 'nim/**/*'
|
- src/bfbs_gen_nim.cpp
|
||||||
- 'src/idl_gen_nim.cpp'
|
|
||||||
- 'src/bfbs_gen_nim.cpp'
|
|
||||||
|
|
||||||
javascript:
|
javascript:
|
||||||
- changed-files:
|
- '**/*.js'
|
||||||
- any-glob-to-any-file:
|
- src/idl_gen_ts.cpp
|
||||||
- '**/*.js'
|
|
||||||
- 'src/idl_gen_ts.cpp'
|
|
||||||
|
|
||||||
typescript:
|
typescript:
|
||||||
- changed-files:
|
- '**/*.ts'
|
||||||
- any-glob-to-any-file:
|
- src/idl_gen_ts.cpp
|
||||||
- '**/*.ts'
|
- grpc/flatbuffers-js-grpc/**/*.ts
|
||||||
- 'src/idl_gen_ts.cpp'
|
|
||||||
- 'grpc/flatbuffers-js-grpc/**/*.ts'
|
|
||||||
|
|
||||||
golang:
|
golang:
|
||||||
- changed-files:
|
- '**/*.go'
|
||||||
- any-glob-to-any-file:
|
- src/idl_gen_go.cpp
|
||||||
- '**/*.go'
|
|
||||||
- 'src/idl_gen_go.cpp'
|
|
||||||
|
|
||||||
python:
|
python:
|
||||||
- changed-files:
|
- '**/*.py'
|
||||||
- any-glob-to-any-file:
|
- src/idl_gen_python.cpp
|
||||||
- '**/*.py'
|
|
||||||
- 'src/idl_gen_python.cpp'
|
|
||||||
|
|
||||||
java:
|
java:
|
||||||
- changed-files:
|
- '**/*.java'
|
||||||
- any-glob-to-any-file:
|
- src/idl_gen_java.cpp
|
||||||
- '**/*.java'
|
|
||||||
- 'src/idl_gen_java.cpp'
|
|
||||||
|
|
||||||
kotlin:
|
kotlin:
|
||||||
- changed-files:
|
- '**/*.kt'
|
||||||
- any-glob-to-any-file:
|
- src/idl_gen_kotlin.cpp
|
||||||
- '**/*.kt'
|
- src/idl_gen_kotlin_kmp.cpp
|
||||||
- 'src/idl_gen_kotlin.cpp'
|
|
||||||
- 'src/idl_gen_kotlin_kmp.cpp'
|
|
||||||
|
|
||||||
lua:
|
lua:
|
||||||
- changed-files:
|
- '**/*.lua'
|
||||||
- any-glob-to-any-file:
|
- lua/**/*
|
||||||
- '**/*.lua'
|
- src/bfbs_gen_lua.cpp
|
||||||
- 'lua/**/*'
|
|
||||||
- 'src/bfbs_gen_lua.cpp'
|
|
||||||
|
|
||||||
lobster:
|
lobster:
|
||||||
- changed-files:
|
- '**/*.lobster'
|
||||||
- any-glob-to-any-file:
|
- src/idl_gen_lobster.cpp
|
||||||
- '**/*.lobster'
|
|
||||||
- 'src/idl_gen_lobster.cpp'
|
|
||||||
|
|
||||||
php:
|
php:
|
||||||
- changed-files:
|
- '**/*.php'
|
||||||
- any-glob-to-any-file:
|
- src/idl_gen_php.cpp
|
||||||
- '**/*.php'
|
|
||||||
- 'src/idl_gen_php.cpp'
|
|
||||||
|
|
||||||
rust:
|
rust:
|
||||||
- changed-files:
|
- '**/*.rs'
|
||||||
- any-glob-to-any-file:
|
- rust/**/*
|
||||||
- '**/*.rs'
|
- src/idl_gen_rust.cpp
|
||||||
- 'rust/**/*'
|
|
||||||
- 'src/idl_gen_rust.cpp'
|
|
||||||
|
|
||||||
dart:
|
dart:
|
||||||
- changed-files:
|
- '**/*.dart'
|
||||||
- any-glob-to-any-file:
|
- src/idl_gen_dart.cpp
|
||||||
- '**/*.dart'
|
|
||||||
- 'src/idl_gen_dart.cpp'
|
|
||||||
|
|
||||||
"c++":
|
c++:
|
||||||
- changed-files:
|
- '**/*.cc'
|
||||||
- any-glob-to-any-file:
|
- '**/*.cpp'
|
||||||
- '**/*.cc'
|
- '**/*.h'
|
||||||
- '**/*.cpp'
|
|
||||||
- '**/*.h'
|
|
||||||
|
|
||||||
json:
|
json:
|
||||||
- changed-files:
|
- '**/*.json'
|
||||||
- any-glob-to-any-file:
|
- src/idl_gen_json_schema.cpp
|
||||||
- '**/*.json'
|
|
||||||
- 'src/idl_gen_json_schema.cpp'
|
|
||||||
|
|
||||||
codegen:
|
codegen:
|
||||||
- changed-files:
|
- src/**/*
|
||||||
- any-glob-to-any-file:
|
|
||||||
- 'src/**/*'
|
|
||||||
|
|
||||||
documentation:
|
documentation:
|
||||||
- changed-files:
|
- docs/**/*
|
||||||
- any-glob-to-any-file:
|
- '**/*.md'
|
||||||
- 'docs/**/*'
|
|
||||||
- '**/*.md'
|
|
||||||
|
|
||||||
CI:
|
CI:
|
||||||
- changed-files:
|
- '.github/**/*'
|
||||||
- any-glob-to-any-file:
|
- '.bazelci/**/*'
|
||||||
- '.github/**/*'
|
|
||||||
- '.bazelci/**/*'
|
|
||||||
|
|
||||||
grpc:
|
grpc:
|
||||||
- changed-files:
|
- grpc/**/*
|
||||||
- any-glob-to-any-file:
|
- src/idl_gen_grpc.cpp
|
||||||
- 'grpc/**/*'
|
|
||||||
- 'src/idl_gen_grpc.cpp'
|
|
||||||
|
|||||||
288
.github/workflows/build.yml
vendored
288
.github/workflows/build.yml
vendored
@@ -12,9 +12,6 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
schedule:
|
|
||||||
# Run daily at 4:45 A.M. to catch dependencies that break us.
|
|
||||||
- cron: '45 4 * * *'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-linux:
|
build-linux:
|
||||||
@@ -24,13 +21,13 @@ jobs:
|
|||||||
digests-gcc: ${{ steps.hash-gcc.outputs.hashes }}
|
digests-gcc: ${{ steps.hash-gcc.outputs.hashes }}
|
||||||
digests-clang: ${{ steps.hash-clang.outputs.hashes }}
|
digests-clang: ${{ steps.hash-clang.outputs.hashes }}
|
||||||
name: Build Linux
|
name: Build Linux
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
cxx: [g++-13, clang++-18]
|
cxx: [g++-13, clang++-15]
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: cmake
|
- name: cmake
|
||||||
run: CXX=${{ matrix.cxx }} cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON -DFLATBUFFERS_STATIC_FLATC=ON .
|
run: CXX=${{ matrix.cxx }} cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON -DFLATBUFFERS_STATIC_FLATC=ON .
|
||||||
- name: build
|
- name: build
|
||||||
@@ -42,7 +39,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@v1
|
||||||
with:
|
with:
|
||||||
name: Linux flatc binary ${{ matrix.cxx }}
|
name: Linux flatc binary ${{ matrix.cxx }}
|
||||||
path: flatc
|
path: flatc
|
||||||
@@ -51,12 +48,12 @@ jobs:
|
|||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
run: zip Linux.flatc.binary.${{ matrix.cxx }}.zip flatc
|
run: zip Linux.flatc.binary.${{ matrix.cxx }}.zip flatc
|
||||||
- name: Release zip file
|
- name: Release zip file
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v1
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
with:
|
with:
|
||||||
files: Linux.flatc.binary.${{ matrix.cxx }}.zip
|
files: Linux.flatc.binary.${{ matrix.cxx }}.zip
|
||||||
- name: Generate SLSA subjects - clang
|
- name: Generate SLSA subjects - clang
|
||||||
if: matrix.cxx == 'clang++-18' && startsWith(github.ref, 'refs/tags/')
|
if: matrix.cxx == 'clang++-15' && startsWith(github.ref, 'refs/tags/')
|
||||||
id: hash-clang
|
id: hash-clang
|
||||||
run: echo "hashes=$(sha256sum Linux.flatc.binary.${{ matrix.cxx }}.zip | base64 -w0)" >> $GITHUB_OUTPUT
|
run: echo "hashes=$(sha256sum Linux.flatc.binary.${{ matrix.cxx }}.zip | base64 -w0)" >> $GITHUB_OUTPUT
|
||||||
- name: Generate SLSA subjects - gcc
|
- name: Generate SLSA subjects - gcc
|
||||||
@@ -66,11 +63,11 @@ jobs:
|
|||||||
|
|
||||||
build-linux-no-file-tests:
|
build-linux-no-file-tests:
|
||||||
name: Build Linux with -DFLATBUFFERS_NO_FILE_TESTS
|
name: Build Linux with -DFLATBUFFERS_NO_FILE_TESTS
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: cmake
|
- name: cmake
|
||||||
run: CXX=clang++-18 cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON -DFLATBUFFERS_CXX_FLAGS="-DFLATBUFFERS_NO_FILE_TESTS" .
|
run: CXX=clang++-15 cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON -DFLATBUFFERS_CXX_FLAGS="-DFLATBUFFERS_NO_FILE_TESTS" .
|
||||||
- name: build
|
- name: build
|
||||||
run: make -j
|
run: make -j
|
||||||
- name: test
|
- name: test
|
||||||
@@ -78,15 +75,15 @@ jobs:
|
|||||||
|
|
||||||
build-linux-out-of-source:
|
build-linux-out-of-source:
|
||||||
name: Build Linux with out-of-source build location
|
name: Build Linux with out-of-source build location
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: make build directory
|
- name: make build directory
|
||||||
run: mkdir build
|
run: mkdir build
|
||||||
- name: cmake
|
- name: cmake
|
||||||
working-directory: build
|
working-directory: build
|
||||||
run: >
|
run: >
|
||||||
CXX=clang++-18 cmake .. -G "Unix Makefiles" -DFLATBUFFERS_STRICT_MODE=ON
|
CXX=clang++-15 cmake .. -G "Unix Makefiles" -DFLATBUFFERS_STRICT_MODE=ON
|
||||||
-DFLATBUFFERS_BUILD_CPP17=ON -DFLATBUFFERS_CPP_STD=17
|
-DFLATBUFFERS_BUILD_CPP17=ON -DFLATBUFFERS_CPP_STD=17
|
||||||
- name: build
|
- name: build
|
||||||
working-directory: build
|
working-directory: build
|
||||||
@@ -100,19 +97,19 @@ jobs:
|
|||||||
|
|
||||||
build-linux-cpp-std:
|
build-linux-cpp-std:
|
||||||
name: Build Linux C++
|
name: Build Linux C++
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
std: [11, 14, 17, 20, 23]
|
std: [11, 14, 17, 20, 23]
|
||||||
cxx: [g++-13, clang++-18]
|
cxx: [g++-13, clang++-15]
|
||||||
exclude:
|
exclude:
|
||||||
# Clang++15 10.3.0 stdlibc++ doesn't fully support std 23
|
# Clang++15 10.3.0 stdlibc++ doesn't fully support std 23
|
||||||
- cxx: clang++-18
|
- cxx: clang++-15
|
||||||
std: 23
|
std: 23
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: cmake
|
- name: cmake
|
||||||
run: >
|
run: >
|
||||||
CXX=${{ matrix.cxx }} cmake -G "Unix Makefiles"
|
CXX=${{ matrix.cxx }} cmake -G "Unix Makefiles"
|
||||||
@@ -129,18 +126,18 @@ jobs:
|
|||||||
|
|
||||||
build-cpp-std:
|
build-cpp-std:
|
||||||
name: Build Windows C++
|
name: Build Windows C++
|
||||||
runs-on: windows-2022
|
runs-on: windows-2019
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
std: [11, 14, 17, 20, 23]
|
std: [11, 14, 17, 20, 23]
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: Add msbuild to PATH
|
- name: Add msbuild to PATH
|
||||||
uses: microsoft/setup-msbuild@v2
|
uses: microsoft/setup-msbuild@v1.1
|
||||||
- name: cmake
|
- name: cmake
|
||||||
run: >
|
run: >
|
||||||
cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release
|
cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=Release
|
||||||
-DFLATBUFFERS_STRICT_MODE=ON
|
-DFLATBUFFERS_STRICT_MODE=ON
|
||||||
-DFLATBUFFERS_CPP_STD=${{ matrix.std }}
|
-DFLATBUFFERS_CPP_STD=${{ matrix.std }}
|
||||||
-DFLATBUFFERS_BUILD_CPP17=${{ matrix.std >= 17 && 'On' || 'Off'}}
|
-DFLATBUFFERS_BUILD_CPP17=${{ matrix.std >= 17 && 'On' || 'Off'}}
|
||||||
@@ -157,20 +154,20 @@ jobs:
|
|||||||
contents: write
|
contents: write
|
||||||
outputs:
|
outputs:
|
||||||
digests: ${{ steps.hash.outputs.hashes }}
|
digests: ${{ steps.hash.outputs.hashes }}
|
||||||
name: Build Windows 2022
|
name: Build Windows 2019
|
||||||
runs-on: windows-2022
|
runs-on: windows-2019
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: Add msbuild to PATH
|
- name: Add msbuild to PATH
|
||||||
uses: microsoft/setup-msbuild@v2
|
uses: microsoft/setup-msbuild@v1.1
|
||||||
- name: cmake
|
- name: cmake
|
||||||
run: cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_CPP17=ON -DFLATBUFFERS_STRICT_MODE=ON .
|
run: cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_CPP17=ON -DFLATBUFFERS_STRICT_MODE=ON .
|
||||||
- name: build
|
- name: build
|
||||||
run: msbuild.exe FlatBuffers.sln /p:Configuration=Release /p:Platform=x64
|
run: msbuild.exe FlatBuffers.sln /p:Configuration=Release /p:Platform=x64
|
||||||
- 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@v1
|
||||||
with:
|
with:
|
||||||
name: Windows flatc binary
|
name: Windows flatc binary
|
||||||
path: Release\flatc.exe
|
path: Release\flatc.exe
|
||||||
@@ -179,7 +176,7 @@ jobs:
|
|||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
run: move Release/flatc.exe . && Compress-Archive flatc.exe Windows.flatc.binary.zip
|
run: move Release/flatc.exe . && Compress-Archive flatc.exe Windows.flatc.binary.zip
|
||||||
- name: Release binary
|
- name: Release binary
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v1
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
with:
|
with:
|
||||||
files: Windows.flatc.binary.zip
|
files: Windows.flatc.binary.zip
|
||||||
@@ -191,35 +188,31 @@ 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@v3
|
||||||
- name: Setup .NET Core SDK
|
- name: Setup .NET Core SDK
|
||||||
uses: actions/setup-dotnet@v5
|
uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
dotnet-version: '8.0.x'
|
dotnet-version: '8.0.x'
|
||||||
- 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}} -o out FlatBuffers.Test.sln
|
||||||
- name: Run net6.0
|
- name: Run
|
||||||
run: |
|
run: |
|
||||||
cd tests\FlatBuffers.Test\bin\Release\net6.0
|
cd tests\FlatBuffers.Test
|
||||||
dir
|
out\FlatBuffers.Test.exe
|
||||||
.\FlatBuffers.Test.exe
|
|
||||||
- name: Run net8.0
|
|
||||||
run: |
|
|
||||||
cd tests\FlatBuffers.Test\bin\Release\net8.0
|
|
||||||
.\FlatBuffers.Test.exe
|
|
||||||
|
|
||||||
build-mac-intel:
|
build-mac-intel:
|
||||||
permissions:
|
permissions:
|
||||||
@@ -227,11 +220,11 @@ jobs:
|
|||||||
outputs:
|
outputs:
|
||||||
digests: ${{ steps.hash.outputs.hashes }}
|
digests: ${{ steps.hash.outputs.hashes }}
|
||||||
name: Build Mac (for Intel)
|
name: Build Mac (for Intel)
|
||||||
runs-on: macos-15-intel
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: cmake
|
- name: cmake
|
||||||
run: cmake -G "Xcode" -DCMAKE_OSX_ARCHITECTURES="x86_64" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON .
|
run: cmake -G "Xcode" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON .
|
||||||
- name: build
|
- name: build
|
||||||
run: xcodebuild -toolchain clang -configuration Release -target flattests
|
run: xcodebuild -toolchain clang -configuration Release -target flattests
|
||||||
- name: check that the binary is x86_64
|
- name: check that the binary is x86_64
|
||||||
@@ -246,16 +239,16 @@ 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@v1
|
||||||
with:
|
with:
|
||||||
name: Mac flatc binary Intel
|
name: Mac flatc binary
|
||||||
path: Release/flatc
|
path: Release/flatc
|
||||||
# Below if only for release.
|
# Below if only for release.
|
||||||
- name: Zip file
|
- name: Zip file
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
run: mv Release/flatc . && zip MacIntel.flatc.binary.zip flatc
|
run: mv Release/flatc . && zip MacIntel.flatc.binary.zip flatc
|
||||||
- name: Release binary
|
- name: Release binary
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v1
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
with:
|
with:
|
||||||
files: MacIntel.flatc.binary.zip
|
files: MacIntel.flatc.binary.zip
|
||||||
@@ -272,7 +265,7 @@ jobs:
|
|||||||
name: Build Mac (universal build)
|
name: Build Mac (universal build)
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: cmake
|
- name: cmake
|
||||||
run: cmake -G "Xcode" -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON .
|
run: cmake -G "Xcode" -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON .
|
||||||
- name: build
|
- name: build
|
||||||
@@ -289,16 +282,16 @@ 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@v1
|
||||||
with:
|
with:
|
||||||
name: Mac flatc binary Universal
|
name: Mac flatc binary
|
||||||
path: Release/flatc
|
path: Release/flatc
|
||||||
# Below if only for release.
|
# Below if only for release.
|
||||||
- name: Zip file
|
- name: Zip file
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
run: mv Release/flatc . && zip Mac.flatc.binary.zip flatc
|
run: mv Release/flatc . && zip Mac.flatc.binary.zip flatc
|
||||||
- name: Release binary
|
- name: Release binary
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v1
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
with:
|
with:
|
||||||
files: Mac.flatc.binary.zip
|
files: Mac.flatc.binary.zip
|
||||||
@@ -309,17 +302,14 @@ jobs:
|
|||||||
|
|
||||||
build-android:
|
build-android:
|
||||||
name: Build Android (on Linux)
|
name: Build Android (on Linux)
|
||||||
if: false #disabled due to continual failure
|
runs-on: ubuntu-22.04-64core
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: set up Java
|
- name: set up Java
|
||||||
uses: actions/setup-java@v5
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: temurin
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: '11'
|
||||||
- name: set up Gradle
|
|
||||||
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 .
|
||||||
@@ -331,12 +321,12 @@ jobs:
|
|||||||
|
|
||||||
build-generator:
|
build-generator:
|
||||||
name: Check Generated Code
|
name: Check Generated Code
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
cxx: [g++-13, clang++-18]
|
cxx: [g++-13, clang++-15]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: cmake
|
- name: cmake
|
||||||
run: CXX=${{ matrix.cxx }} cmake -G "Unix Makefiles" -DFLATBUFFERS_BUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON . && make -j
|
run: CXX=${{ matrix.cxx }} cmake -G "Unix Makefiles" -DFLATBUFFERS_BUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON . && make -j
|
||||||
- name: Generate
|
- name: Generate
|
||||||
@@ -346,13 +336,13 @@ jobs:
|
|||||||
|
|
||||||
build-generator-windows:
|
build-generator-windows:
|
||||||
name: Check Generated Code on Windows
|
name: Check Generated Code on Windows
|
||||||
runs-on: windows-2022
|
runs-on: windows-2019
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: Add msbuild to PATH
|
- name: Add msbuild to PATH
|
||||||
uses: microsoft/setup-msbuild@v2
|
uses: microsoft/setup-msbuild@v1.1
|
||||||
- name: cmake
|
- name: cmake
|
||||||
run: cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_CPP17=ON -DFLATBUFFERS_STRICT_MODE=ON .
|
run: cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_CPP17=ON -DFLATBUFFERS_STRICT_MODE=ON .
|
||||||
- name: build
|
- name: build
|
||||||
run: msbuild.exe FlatBuffers.sln /p:Configuration=Release /p:Platform=x64
|
run: msbuild.exe FlatBuffers.sln /p:Configuration=Release /p:Platform=x64
|
||||||
- name: Generate
|
- name: Generate
|
||||||
@@ -362,44 +352,42 @@ jobs:
|
|||||||
|
|
||||||
build-benchmarks:
|
build-benchmarks:
|
||||||
name: Build Benchmarks (on Linux)
|
name: Build Benchmarks (on Linux)
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
cxx: [g++-13]
|
cxx: [g++-13]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: cmake
|
- name: cmake
|
||||||
run: CXX=${{ matrix.cxx }} cmake -G "Unix Makefiles" -DFLATBUFFERS_CXX_FLAGS="-Wno-unused-parameter -fno-aligned-new" -DFLATBUFFERS_BUILD_BENCHMARKS=ON -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON . && make -j
|
run: CXX=${{ matrix.cxx }} cmake -G "Unix Makefiles" -DFLATBUFFERS_CXX_FLAGS="-Wno-unused-parameter -fno-aligned-new" -DFLATBUFFERS_BUILD_BENCHMARKS=ON -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON . && make -j
|
||||||
- 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@v1
|
||||||
with:
|
with:
|
||||||
name: Linux flatbenchmark results ${{matrix.cxx}}
|
name: Linux flatbenchmark results ${{matrix.cxx}}
|
||||||
path: benchmarks/results_${{matrix.cxx}}
|
path: benchmarks/results_${{matrix.cxx}}
|
||||||
|
|
||||||
build-java:
|
build-java:
|
||||||
name: Build Java
|
name: Build Java
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: test
|
- name: test
|
||||||
working-directory: java
|
working-directory: java
|
||||||
run: mvn test
|
run: mvn test
|
||||||
|
|
||||||
build-kotlin-macos:
|
build-kotlin-macos:
|
||||||
name: Build Kotlin MacOS
|
name: Build Kotlin MacOS
|
||||||
runs-on: macos-15
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v3
|
||||||
- name: set up Java
|
- uses: gradle/wrapper-validation-action@v1.0.5
|
||||||
uses: actions/setup-java@v5
|
- uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: temurin
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: '11'
|
||||||
- name: set up Gradle
|
|
||||||
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 .
|
||||||
@@ -411,18 +399,15 @@ jobs:
|
|||||||
|
|
||||||
build-kotlin-linux:
|
build-kotlin-linux:
|
||||||
name: Build Kotlin Linux
|
name: Build Kotlin Linux
|
||||||
if: false #disabled due to continual failure
|
runs-on: ubuntu-22.04-64core
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v3
|
||||||
- name: set up Java
|
- uses: actions/setup-java@v3
|
||||||
uses: actions/setup-java@v5
|
|
||||||
with:
|
with:
|
||||||
distribution: temurin
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: '11'
|
||||||
- name: set up Gradle
|
- uses: gradle/wrapper-validation-action@v1.0.5
|
||||||
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 .
|
||||||
@@ -437,27 +422,27 @@ jobs:
|
|||||||
|
|
||||||
build-rust-linux:
|
build-rust-linux:
|
||||||
name: Build Rust Linux
|
name: Build Rust Linux
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: test
|
- name: test
|
||||||
working-directory: tests
|
working-directory: tests
|
||||||
run: bash RustTest.sh
|
run: bash RustTest.sh
|
||||||
|
|
||||||
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@v3
|
||||||
- name: test
|
- name: test
|
||||||
working-directory: tests
|
working-directory: tests
|
||||||
run: ./RustTest.bat
|
run: ./RustTest.bat
|
||||||
|
|
||||||
build-python:
|
build-python:
|
||||||
name: Build Python
|
name: Build Python
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: flatc
|
- name: flatc
|
||||||
# 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 -DFLATBUFFERS_STRICT_MODE=ON . && 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 -DFLATBUFFERS_STRICT_MODE=ON . && make -j
|
||||||
@@ -467,9 +452,9 @@ jobs:
|
|||||||
|
|
||||||
build-go:
|
build-go:
|
||||||
name: Build Go
|
name: Build Go
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: flatc
|
- name: flatc
|
||||||
# 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 -DFLATBUFFERS_STRICT_MODE=ON . && 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 -DFLATBUFFERS_STRICT_MODE=ON . && make -j
|
||||||
@@ -479,9 +464,9 @@ jobs:
|
|||||||
|
|
||||||
build-php:
|
build-php:
|
||||||
name: Build PHP
|
name: Build PHP
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: flatc
|
- name: flatc
|
||||||
# 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 -DFLATBUFFERS_STRICT_MODE=ON . && 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 -DFLATBUFFERS_STRICT_MODE=ON . && make -j
|
||||||
@@ -492,74 +477,52 @@ jobs:
|
|||||||
sh phpUnionVectorTest.sh
|
sh phpUnionVectorTest.sh
|
||||||
|
|
||||||
build-swift:
|
build-swift:
|
||||||
name: Test Swift Linux
|
name: Build Swift
|
||||||
strategy:
|
runs-on: ubuntu-22.04-64core
|
||||||
matrix:
|
|
||||||
swift: ["6.0", "6.1", "6.2"]
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- uses: swift-actions/setup-swift@v2
|
|
||||||
with:
|
|
||||||
swift-version: ${{ matrix.swift }}
|
|
||||||
- name: Get swift version
|
|
||||||
run: swift --version
|
|
||||||
- name: test
|
- name: test
|
||||||
run: swift test
|
working-directory: tests/swift/tests
|
||||||
|
run: |
|
||||||
build-swift-windows:
|
swift build --build-tests
|
||||||
name: Test swift windows
|
swift test
|
||||||
runs-on: windows-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v6
|
|
||||||
- uses: SwiftyLab/setup-swift@latest
|
|
||||||
with:
|
|
||||||
swift-version: '6.1'
|
|
||||||
- run: swift build
|
|
||||||
- run: swift test
|
|
||||||
|
|
||||||
build-swift-wasm:
|
build-swift-wasm:
|
||||||
name: Test Swift Wasm
|
name: Build Swift Wasm
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
|
container:
|
||||||
|
image: ghcr.io/swiftwasm/carton:0.15.3
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- uses: swift-actions/setup-swift@v2
|
- name: Setup Wasmer
|
||||||
with:
|
uses: wasmerio/setup-wasmer@v2
|
||||||
swift-version: 6.2.1
|
- name: Test
|
||||||
- uses: bytecodealliance/actions/wasmtime/setup@v1
|
working-directory: tests/swift/Wasm.tests
|
||||||
- name: Install Swift SDK
|
run: carton test
|
||||||
run: swift sdk install https://download.swift.org/swift-6.2.1-release/wasm-sdk/swift-6.2.1-RELEASE/swift-6.2.1-RELEASE_wasm.artifactbundle.tar.gz --checksum 482b9f95462b87bedfafca94a092cf9ec4496671ca13b43745097122d20f18af
|
|
||||||
- name: Test
|
|
||||||
working-directory: tests/swift/Wasm.tests
|
|
||||||
run: |
|
|
||||||
swift sdk list
|
|
||||||
swift build --build-tests --swift-sdk swift-6.2.1-RELEASE_wasm
|
|
||||||
wasmtime --dir . .build/wasm32-unknown-wasip1/debug/FlatBuffers.Test.Swift.WasmPackageTests.xctest --testing-library swift-testing
|
|
||||||
|
|
||||||
build-ts:
|
build-ts:
|
||||||
name: Build TS
|
name: Build TS
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: flatc
|
- name: flatc
|
||||||
# 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
|
|
||||||
run: npm install -g pnpm
|
|
||||||
- name: deps
|
- name: deps
|
||||||
run: pnpm i
|
run: yarn
|
||||||
- name: compile
|
- name: compile
|
||||||
run: pnpm compile
|
run: yarn compile
|
||||||
- name: test
|
- name: test
|
||||||
working-directory: tests/ts
|
working-directory: tests/ts
|
||||||
run: |
|
run: |
|
||||||
|
yarn global add esbuild
|
||||||
python3 TypeScriptTest.py
|
python3 TypeScriptTest.py
|
||||||
|
|
||||||
build-dart:
|
build-dart:
|
||||||
name: Build Dart
|
name: Build Dart
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- uses: dart-lang/setup-dart@v1
|
- uses: dart-lang/setup-dart@v1
|
||||||
with:
|
with:
|
||||||
sdk: stable
|
sdk: stable
|
||||||
@@ -572,13 +535,13 @@ jobs:
|
|||||||
|
|
||||||
build-nim:
|
build-nim:
|
||||||
name: Build Nim
|
name: Build Nim
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- name: flatc
|
- name: flatc
|
||||||
# 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
|
||||||
- uses: jiro4989/setup-nim-action@v2
|
- uses: jiro4989/setup-nim-action@v1
|
||||||
- name: install library
|
- name: install library
|
||||||
working-directory: nim
|
working-directory: nim
|
||||||
run: nimble -y develop && nimble install
|
run: nimble -y develop && nimble install
|
||||||
@@ -586,32 +549,12 @@ jobs:
|
|||||||
working-directory: tests/nim
|
working-directory: tests/nim
|
||||||
run: python3 testnim.py
|
run: python3 testnim.py
|
||||||
|
|
||||||
bazel:
|
|
||||||
name: Bazel
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
steps:
|
|
||||||
- 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
|
|
||||||
run: >
|
|
||||||
bazel build
|
|
||||||
//:flatc
|
|
||||||
//:flatbuffers
|
|
||||||
//tests:flatbuffers_test
|
|
||||||
- name: bazel test
|
|
||||||
run: >
|
|
||||||
bazel test
|
|
||||||
//tests:flatbuffers_test
|
|
||||||
|
|
||||||
release-digests:
|
release-digests:
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
needs: [build-linux, build-windows, build-mac-intel, build-mac-universal]
|
needs: [build-linux, build-windows, build-mac-intel, build-mac-universal]
|
||||||
outputs:
|
outputs:
|
||||||
digests: ${{ steps.hash.outputs.digests }}
|
digests: ${{ steps.hash.outputs.digests }}
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04-64core
|
||||||
steps:
|
steps:
|
||||||
- name: Merge results
|
- name: Merge results
|
||||||
id: hash
|
id: hash
|
||||||
@@ -637,7 +580,8 @@ jobs:
|
|||||||
actions: read # To read the workflow path.
|
actions: read # To read the workflow path.
|
||||||
id-token: write # To sign the provenance.
|
id-token: write # To sign the provenance.
|
||||||
contents: write # To add assets to a release.
|
contents: write # To add assets to a release.
|
||||||
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.1.0
|
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.2.1
|
||||||
with:
|
with:
|
||||||
base64-subjects: "${{ needs.release-digests.outputs.digests }}"
|
base64-subjects: "${{ needs.release-digests.outputs.digests }}"
|
||||||
upload-assets: true # Optional: Upload to a new release
|
upload-assets: true # Optional: Upload to a new release
|
||||||
|
compile-generator: true # Workaround for https://github.com/slsa-framework/slsa-github-generator/issues/1163
|
||||||
|
|||||||
71
.github/workflows/codeql.yml
vendored
Normal file
71
.github/workflows/codeql.yml
vendored
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
# For most projects, this workflow file will not need changing; you simply need
|
||||||
|
# to commit it to your repository.
|
||||||
|
#
|
||||||
|
# You may wish to alter this file to override the set of languages analyzed,
|
||||||
|
# or to provide custom queries or build logic.
|
||||||
|
#
|
||||||
|
# ******** NOTE ********
|
||||||
|
# We have attempted to detect the languages in your repository. Please check
|
||||||
|
# the `language` matrix defined below to confirm you have the correct set of
|
||||||
|
# supported CodeQL languages.
|
||||||
|
#
|
||||||
|
name: "CodeQL"
|
||||||
|
permissions: read-all
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
# The branches below must be a subset of the branches above
|
||||||
|
branches: [ master ]
|
||||||
|
schedule:
|
||||||
|
- cron: '16 20 * * 0'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: [ 'cpp' ]
|
||||||
|
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||||
|
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
# Initializes the CodeQL tools for scanning.
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v2
|
||||||
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
|
# By default, queries listed here will override any specified in a config file.
|
||||||
|
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||||
|
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||||
|
|
||||||
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
|
# - name: Autobuild
|
||||||
|
# uses: github/codeql-action/autobuild@v2
|
||||||
|
|
||||||
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
|
# 📚 https://git.io/JvXDl
|
||||||
|
|
||||||
|
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||||
|
# and modify them (or add more) to build your code if your project
|
||||||
|
# uses a compiled language
|
||||||
|
|
||||||
|
- run: |
|
||||||
|
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON .
|
||||||
|
make -j
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v2
|
||||||
36
.github/workflows/docs.yml
vendored
36
.github/workflows/docs.yml
vendored
@@ -1,36 +0,0 @@
|
|||||||
name: docs
|
|
||||||
on:
|
|
||||||
# For manual pushes.
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
# Pushes to main that touch the documentation directory.
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
paths:
|
|
||||||
- 'docs/**'
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
jobs:
|
|
||||||
deploy:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v6
|
|
||||||
- name: Configure Git Credentials
|
|
||||||
run: |
|
|
||||||
git config user.name github-actions[bot]
|
|
||||||
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
|
|
||||||
- uses: actions/setup-python@v6
|
|
||||||
with:
|
|
||||||
python-version: 3.x
|
|
||||||
- run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
|
|
||||||
- uses: actions/cache@v5
|
|
||||||
with:
|
|
||||||
key: mkdocs-material-${{ env.cache_id }}
|
|
||||||
path: .cache
|
|
||||||
restore-keys: |
|
|
||||||
mkdocs-material-
|
|
||||||
- run: pip install mkdocs-material
|
|
||||||
- run: pip install mkdocs-redirects
|
|
||||||
- run: mkdocs gh-deploy --force -f docs/mkdocs.yml
|
|
||||||
35
.github/workflows/extrabuild.yml
vendored
Normal file
35
.github/workflows/extrabuild.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
name: Build and unit tests that are more time consuming
|
||||||
|
permissions: read-all
|
||||||
|
|
||||||
|
on:
|
||||||
|
# For manual tests.
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- closed
|
||||||
|
schedule:
|
||||||
|
- cron: "30 20 * * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-linux-s390x:
|
||||||
|
name: Build Linux on s390x arch and run unit tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: uraimo/run-on-arch-action@v2
|
||||||
|
name: Run commands
|
||||||
|
id: runcmd
|
||||||
|
with:
|
||||||
|
arch: s390x
|
||||||
|
distro: ubuntu_latest
|
||||||
|
install: |
|
||||||
|
apt-get update -q -y
|
||||||
|
apt-get -y install cmake
|
||||||
|
apt-get -y install make
|
||||||
|
apt-get -y install g++
|
||||||
|
run: |
|
||||||
|
lscpu | grep Endian
|
||||||
|
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
|
||||||
|
make -j
|
||||||
|
./flattests
|
||||||
|
|
||||||
2
.github/workflows/label.yml
vendored
2
.github/workflows/label.yml
vendored
@@ -19,6 +19,6 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/labeler@v6
|
- uses: actions/labeler@ee18d5d34efd9b4f7dafdb0e363cb688eb438044 # 4.1.0
|
||||||
with:
|
with:
|
||||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
|||||||
4
.github/workflows/main.yml
vendored
4
.github/workflows/main.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
name: OSS-Fuzz
|
name: OSS-Fuzz
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
@@ -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@v1
|
||||||
if: failure() && steps.build.outcome == 'success'
|
if: failure() && steps.build.outcome == 'success'
|
||||||
with:
|
with:
|
||||||
name: artifacts
|
name: artifacts
|
||||||
|
|||||||
73
.github/workflows/release.yml
vendored
73
.github/workflows/release.yml
vendored
@@ -5,15 +5,15 @@ on:
|
|||||||
# For manual tests.
|
# For manual tests.
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
release:
|
release:
|
||||||
types: [published]
|
types: [created]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish-npm:
|
publish-npm:
|
||||||
name: Publish NPM
|
name: Publish NPM
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- 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'
|
||||||
@@ -29,19 +29,19 @@ jobs:
|
|||||||
run:
|
run:
|
||||||
working-directory: ./python
|
working-directory: ./python
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-python@v6
|
- uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.10'
|
python-version: '3.10'
|
||||||
|
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: |
|
run: |
|
||||||
python3 -m pip install --upgrade pip
|
python3 -m pip install --upgrade pip
|
||||||
python3 -m pip install build twine
|
python3 -m pip install setuptools wheel twine
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
python3 -m build .
|
python3 setup.py sdist bdist_wheel
|
||||||
|
|
||||||
- name: Upload to PyPi
|
- name: Upload to PyPi
|
||||||
run: |
|
run: |
|
||||||
@@ -57,8 +57,8 @@ jobs:
|
|||||||
run:
|
run:
|
||||||
working-directory: ./net/flatbuffers
|
working-directory: ./net/flatbuffers
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-dotnet@v5
|
- uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
dotnet-version: '8.0.x'
|
dotnet-version: '8.0.x'
|
||||||
- name: Build
|
- name: Build
|
||||||
@@ -80,10 +80,10 @@ jobs:
|
|||||||
run:
|
run:
|
||||||
working-directory: ./java
|
working-directory: ./java
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Set up Maven Central Repository
|
- name: Set up Maven Central Repository
|
||||||
uses: actions/setup-java@v5
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
java-version: '11'
|
java-version: '11'
|
||||||
distribution: 'adopt'
|
distribution: 'adopt'
|
||||||
@@ -97,56 +97,9 @@ jobs:
|
|||||||
- name: Publish Maven
|
- name: Publish Maven
|
||||||
run: mvn --batch-mode clean deploy
|
run: mvn --batch-mode clean deploy
|
||||||
env:
|
env:
|
||||||
OSSRH_USERNAME: ${{ secrets.OSSRH_USER_V2 }}
|
OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }}
|
||||||
OSSRH_PASSWORD: ${{ secrets.OSSRH_TOKEN_V2 }}
|
OSSRH_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
|
||||||
MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
|
|
||||||
|
|
||||||
publish-maven-kotlin:
|
|
||||||
name: Publish Maven - Kotlin
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: ./kotlin
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v6
|
|
||||||
- name: Set up Maven Central Repository
|
|
||||||
uses: actions/setup-java@v5
|
|
||||||
with:
|
|
||||||
java-version: '11'
|
|
||||||
distribution: 'adopt'
|
|
||||||
cache: 'maven'
|
|
||||||
server-id: ossrh
|
|
||||||
server-username: OSSRH_USERNAME
|
|
||||||
server-password: OSSRH_PASSWORD
|
|
||||||
gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }}
|
|
||||||
gpg-passphrase: MAVEN_GPG_PASSPHRASE # this needs to be an env var
|
|
||||||
|
|
||||||
- name: Publish Kotlin Library on Maven
|
|
||||||
run: ./gradlew publishAllPublicationsToSonatypeRepository
|
|
||||||
env:
|
|
||||||
OSSRH_USERNAME: ${{ secrets.OSSRH_USER_V2 }}
|
|
||||||
OSSRH_PASSWORD: ${{ secrets.OSSRH_TOKEN_V2 }}
|
|
||||||
MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
|
MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
|
||||||
|
|
||||||
|
|
||||||
publish-crates:
|
|
||||||
name: Publish crates.io
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v6
|
|
||||||
- uses: actions-rs/toolchain@v1
|
|
||||||
with:
|
|
||||||
toolchain: stable
|
|
||||||
override: true
|
|
||||||
|
|
||||||
- name: Publish Flatbuffers
|
|
||||||
uses: katyo/publish-crates@v2
|
|
||||||
with:
|
|
||||||
path: ./rust/flatbuffers
|
|
||||||
registry-token: ${{ secrets.CARGO_TOKEN }}
|
|
||||||
|
|
||||||
- name: Publish Flexbuffers
|
|
||||||
uses: katyo/publish-crates@v2
|
|
||||||
with:
|
|
||||||
path: ./rust/flexbuffers
|
|
||||||
registry-token: ${{ secrets.CARGO_TOKEN }}
|
|
||||||
|
|||||||
55
.github/workflows/scorecards.yml
vendored
Normal file
55
.github/workflows/scorecards.yml
vendored
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
name: Scorecards supply-chain security
|
||||||
|
on:
|
||||||
|
# Only the default branch is supported.
|
||||||
|
branch_protection_rule:
|
||||||
|
schedule:
|
||||||
|
- cron: '21 2 * * 5'
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
# Declare default permissions as read only.
|
||||||
|
permissions: read-all
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analysis:
|
||||||
|
name: Scorecards analysis
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
# Needed to upload the results to code-scanning dashboard.
|
||||||
|
security-events: write
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: "Checkout code"
|
||||||
|
uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: "Run analysis"
|
||||||
|
uses: ossf/scorecard-action@ce330fde6b1a5c9c75b417e7efc510b822a35564 # v1.1.2
|
||||||
|
with:
|
||||||
|
results_file: results.sarif
|
||||||
|
results_format: sarif
|
||||||
|
# Read-only PAT token. To create it,
|
||||||
|
# follow the steps in https://github.com/ossf/scorecard-action#pat-token-creation.
|
||||||
|
repo_token: ${{ secrets.SCORECARD_READ_TOKEN }}
|
||||||
|
# Publish the results to enable scorecard badges. For more details, see
|
||||||
|
# https://github.com/ossf/scorecard-action#publishing-results.
|
||||||
|
# For private repositories, `publish_results` will automatically be set to `false`,
|
||||||
|
# regardless of the value entered here.
|
||||||
|
publish_results: true
|
||||||
|
|
||||||
|
# Upload the results as artifacts (optional).
|
||||||
|
- name: "Upload artifact"
|
||||||
|
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
|
||||||
|
with:
|
||||||
|
name: SARIF file
|
||||||
|
path: results.sarif
|
||||||
|
retention-days: 5
|
||||||
|
|
||||||
|
# Upload the results to GitHub's code scanning dashboard.
|
||||||
|
- name: "Upload to code-scanning"
|
||||||
|
uses: github/codeql-action/upload-sarif@5f532563584d71fdef14ee64d17bafb34f751ce5 # v1.0.26
|
||||||
|
with:
|
||||||
|
sarif_file: results.sarif
|
||||||
2
.github/workflows/stale.yml
vendored
2
.github/workflows/stale.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v10
|
- uses: actions/stale@v7.0.0
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
operations-per-run: 500
|
operations-per-run: 500
|
||||||
|
|||||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -153,10 +153,3 @@ cmake-build-debug/
|
|||||||
_deps/
|
_deps/
|
||||||
**/.gradle/**
|
**/.gradle/**
|
||||||
kotlin/**/generated
|
kotlin/**/generated
|
||||||
MODULE.bazel.lock
|
|
||||||
|
|
||||||
# Ignore the generated docs
|
|
||||||
docs/site
|
|
||||||
|
|
||||||
# Ignore generated files
|
|
||||||
*.fbs.h
|
|
||||||
|
|||||||
26
BUILD.bazel
26
BUILD.bazel
@@ -1,3 +1,5 @@
|
|||||||
|
load("@aspect_rules_js//npm:defs.bzl", "npm_link_package")
|
||||||
|
load("@npm//:defs.bzl", "npm_link_all_packages")
|
||||||
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
|
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
|
||||||
|
|
||||||
licenses(["notice"])
|
licenses(["notice"])
|
||||||
@@ -6,6 +8,13 @@ package(
|
|||||||
default_visibility = ["//visibility:public"],
|
default_visibility = ["//visibility:public"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
npm_link_all_packages(name = "node_modules")
|
||||||
|
|
||||||
|
npm_link_package(
|
||||||
|
name = "node_modules/flatbuffers",
|
||||||
|
src = "//ts:flatbuffers",
|
||||||
|
)
|
||||||
|
|
||||||
exports_files([
|
exports_files([
|
||||||
"LICENSE",
|
"LICENSE",
|
||||||
"tsconfig.json",
|
"tsconfig.json",
|
||||||
@@ -28,16 +37,11 @@ config_setting(
|
|||||||
filegroup(
|
filegroup(
|
||||||
name = "distribution",
|
name = "distribution",
|
||||||
srcs = [
|
srcs = [
|
||||||
".bazelignore",
|
|
||||||
".npmrc",
|
|
||||||
"BUILD.bazel",
|
"BUILD.bazel",
|
||||||
"MODULE.bazel",
|
"WORKSPACE",
|
||||||
"build_defs.bzl",
|
"build_defs.bzl",
|
||||||
"package.json",
|
|
||||||
"pnpm-lock.yaml",
|
|
||||||
"typescript.bzl",
|
"typescript.bzl",
|
||||||
"//grpc/src/compiler:distribution",
|
"//grpc/src/compiler:distribution",
|
||||||
"//include/codegen:distribution",
|
|
||||||
"//reflection:distribution",
|
"//reflection:distribution",
|
||||||
"//src:distribution",
|
"//src:distribution",
|
||||||
"//ts:distribution",
|
"//ts:distribution",
|
||||||
@@ -121,7 +125,15 @@ filegroup(
|
|||||||
# Library used by flatbuffer_cc_library rules.
|
# Library used by flatbuffer_cc_library rules.
|
||||||
cc_library(
|
cc_library(
|
||||||
name = "runtime_cc",
|
name = "runtime_cc",
|
||||||
hdrs = ["//:public_headers"],
|
hdrs = [
|
||||||
|
"include/flatbuffers/base.h",
|
||||||
|
"include/flatbuffers/flatbuffers.h",
|
||||||
|
"include/flatbuffers/flexbuffers.h",
|
||||||
|
"include/flatbuffers/stl_emulation.h",
|
||||||
|
"include/flatbuffers/util.h",
|
||||||
|
"include/flatbuffers/vector.h",
|
||||||
|
"include/flatbuffers/verifier.h",
|
||||||
|
],
|
||||||
linkstatic = 1,
|
linkstatic = 1,
|
||||||
strip_include_prefix = "/include",
|
strip_include_prefix = "/include",
|
||||||
)
|
)
|
||||||
|
|||||||
44
CHANGELOG.md
44
CHANGELOG.md
@@ -4,49 +4,7 @@ All major or breaking changes will be documented in this file, as well as any
|
|||||||
new features that should be highlighted. Minor fixes or improvements are not
|
new features that should be highlighted. Minor fixes or improvements are not
|
||||||
necessarily listed.
|
necessarily listed.
|
||||||
|
|
||||||
## [25.12.19] (December 19 2025)(https://github.com/google/flatbuffers/releases/tag/v25.12.19)
|
## [24.3.6] (March 24 2024)(https://github.com/google/flatbuffers/releases/tag/v24.3.6)
|
||||||
|
|
||||||
* [C++] Default emptry vector support (#8870)
|
|
||||||
* [C++] Add --gen-absl-hash option (#8868)
|
|
||||||
* [Kotlin] Upgrade to MacOS 15 (#8845)
|
|
||||||
* [C++] Fix vector of table with naked ptrs (#8830)
|
|
||||||
* [Python] Optimize Offset/Pad/Prep (#8808)
|
|
||||||
* Implement `--file-names-only` (#8788)
|
|
||||||
* [C++] Fix size verifer (#8740)
|
|
||||||
|
|
||||||
## [25.9.23] (September 23 2025)(https://github.com/google/flatbuffers/releases/tag/v25.9.23)
|
|
||||||
|
|
||||||
* flatc: `--grpc-callback-api` flag generates C++ gRPC Callback API server `CallbackService` skeletons AND client native callback/async stubs (unary + all streaming reactor forms) (opt-in, non-breaking, issue #8596).
|
|
||||||
* Swift - Adds new API to reduce memory copying within swift (#8484)
|
|
||||||
* Rust - Support Rust edition 2024 (#8638)
|
|
||||||
* [C++] - Use the Google Style for clang-format without exceptions (#8706)
|
|
||||||
|
|
||||||
## [25.2.10] (February 10 2025)(https://github.com/google/flatbuffers/releases/tag/v25.2.10)
|
|
||||||
|
|
||||||
* Removed the old documentation pages. The new one is live at https://flatbuffers.dev
|
|
||||||
* Swift version 6.0 support (#8414)
|
|
||||||
|
|
||||||
## [25.1.24] (January 24 2025)(https://github.com/google/flatbuffers/releases/tag/v25.1.24)
|
|
||||||
|
|
||||||
* Mostly related to bazel build support.
|
|
||||||
* Min bazel supported is now 7 or higher, as WORKSPACE files are removed (#8509)
|
|
||||||
* Minor C++ codegen fix removing extra semicolon (#8488)
|
|
||||||
|
|
||||||
## [25.1.21] (January 21 2025)(https://github.com/google/flatbuffers/releases/tag/v25.1.21)
|
|
||||||
|
|
||||||
* Rust Full Reflection (#8102)
|
|
||||||
* Mostly documentation updates hosted at https://flatbuffers.dev
|
|
||||||
|
|
||||||
## [24.3.25] (March 25 2024)(https://github.com/google/flatbuffers/releases/tag/v24.3.25)
|
|
||||||
|
|
||||||
* Fixed license metadata parsing (#8253)
|
|
||||||
* [C++] Allow string_view in `LookUpByKey` in addition to null-terminated c-style strings (#8203)
|
|
||||||
|
|
||||||
## [24.3.7] (March 7 2024)(https://github.com/google/flatbuffers/releases/tag/v24.3.7)
|
|
||||||
|
|
||||||
* Just to fix some of the CI build issues from the 24.3.6 release.
|
|
||||||
|
|
||||||
## [24.3.6] (March 6 2024)(https://github.com/google/flatbuffers/releases/tag/v24.3.6)
|
|
||||||
|
|
||||||
* Fix typescript object API to allow 0 values for null-default scalars (#7864)
|
* Fix typescript object API to allow 0 values for null-default scalars (#7864)
|
||||||
|
|
||||||
|
|||||||
@@ -305,7 +305,8 @@ function(flatbuffers_generate_headers)
|
|||||||
${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})
|
${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})
|
||||||
add_dependencies(
|
add_dependencies(
|
||||||
${FLATBUFFERS_GENERATE_HEADERS_TARGET}
|
${FLATBUFFERS_GENERATE_HEADERS_TARGET}
|
||||||
${FLATC_TARGET})
|
${FLATC}
|
||||||
|
${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
${FLATBUFFERS_GENERATE_HEADERS_TARGET}
|
${FLATBUFFERS_GENERATE_HEADERS_TARGET}
|
||||||
INTERFACE ${generated_target_dir})
|
INTERFACE ${generated_target_dir})
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
set(VERSION_MAJOR 25)
|
set(VERSION_MAJOR 24)
|
||||||
set(VERSION_MINOR 12)
|
set(VERSION_MINOR 3)
|
||||||
set(VERSION_PATCH 19)
|
set(VERSION_PATCH 6)
|
||||||
set(VERSION_COMMIT 0)
|
set(VERSION_COMMIT 0)
|
||||||
|
|
||||||
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
||||||
|
|||||||
@@ -112,7 +112,6 @@ endif()
|
|||||||
add_definitions(-DFLATBUFFERS_LOCALE_INDEPENDENT=$<BOOL:${FLATBUFFERS_LOCALE_INDEPENDENT}>)
|
add_definitions(-DFLATBUFFERS_LOCALE_INDEPENDENT=$<BOOL:${FLATBUFFERS_LOCALE_INDEPENDENT}>)
|
||||||
|
|
||||||
if(NOT WIN32)
|
if(NOT WIN32)
|
||||||
include(CheckSymbolExists)
|
|
||||||
check_symbol_exists(realpath "stdlib.h" HAVE_REALPATH)
|
check_symbol_exists(realpath "stdlib.h" HAVE_REALPATH)
|
||||||
if(NOT HAVE_REALPATH)
|
if(NOT HAVE_REALPATH)
|
||||||
add_definitions(-DFLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION)
|
add_definitions(-DFLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION)
|
||||||
@@ -147,8 +146,6 @@ set(FlatBuffers_Library_SRCS
|
|||||||
include/flatbuffers/vector.h
|
include/flatbuffers/vector.h
|
||||||
include/flatbuffers/vector_downward.h
|
include/flatbuffers/vector_downward.h
|
||||||
include/flatbuffers/verifier.h
|
include/flatbuffers/verifier.h
|
||||||
src/file_manager.cpp
|
|
||||||
src/file_name_manager.cpp
|
|
||||||
src/idl_parser.cpp
|
src/idl_parser.cpp
|
||||||
src/idl_gen_text.cpp
|
src/idl_gen_text.cpp
|
||||||
src/reflection.cpp
|
src/reflection.cpp
|
||||||
@@ -175,6 +172,9 @@ set(FlatBuffers_Compiler_SRCS
|
|||||||
src/idl_gen_grpc.cpp
|
src/idl_gen_grpc.cpp
|
||||||
src/idl_gen_json_schema.cpp
|
src/idl_gen_json_schema.cpp
|
||||||
src/idl_gen_swift.cpp
|
src/idl_gen_swift.cpp
|
||||||
|
src/file_name_saving_file_manager.cpp
|
||||||
|
src/file_binary_writer.cpp
|
||||||
|
src/file_writer.cpp
|
||||||
src/idl_namer.h
|
src/idl_namer.h
|
||||||
src/namer.h
|
src/namer.h
|
||||||
src/flatc.cpp
|
src/flatc.cpp
|
||||||
@@ -183,10 +183,6 @@ set(FlatBuffers_Compiler_SRCS
|
|||||||
src/bfbs_gen_lua.h
|
src/bfbs_gen_lua.h
|
||||||
src/bfbs_gen_nim.h
|
src/bfbs_gen_nim.h
|
||||||
src/bfbs_namer.h
|
src/bfbs_namer.h
|
||||||
include/codegen/idl_namer.h
|
|
||||||
include/codegen/namer.h
|
|
||||||
include/codegen/python.h
|
|
||||||
include/codegen/python.cc
|
|
||||||
include/flatbuffers/code_generators.h
|
include/flatbuffers/code_generators.h
|
||||||
src/binary_annotator.h
|
src/binary_annotator.h
|
||||||
src/binary_annotator.cpp
|
src/binary_annotator.cpp
|
||||||
@@ -218,8 +214,6 @@ set(FlatHash_SRCS
|
|||||||
set(FlatBuffers_Tests_SRCS
|
set(FlatBuffers_Tests_SRCS
|
||||||
${FlatBuffers_Library_SRCS}
|
${FlatBuffers_Library_SRCS}
|
||||||
src/idl_gen_fbs.cpp
|
src/idl_gen_fbs.cpp
|
||||||
tests/default_vectors_strings_test.cpp
|
|
||||||
tests/default_vectors_strings_test.h
|
|
||||||
tests/evolution_test.cpp
|
tests/evolution_test.cpp
|
||||||
tests/flexbuffers_test.cpp
|
tests/flexbuffers_test.cpp
|
||||||
tests/fuzz_test.cpp
|
tests/fuzz_test.cpp
|
||||||
@@ -236,8 +230,6 @@ set(FlatBuffers_Tests_SRCS
|
|||||||
tests/test_builder.h
|
tests/test_builder.h
|
||||||
tests/test_builder.cpp
|
tests/test_builder.cpp
|
||||||
tests/util_test.cpp
|
tests/util_test.cpp
|
||||||
tests/vector_table_naked_ptr_test.h
|
|
||||||
tests/vector_table_naked_ptr_test.cpp
|
|
||||||
tests/native_type_test_impl.h
|
tests/native_type_test_impl.h
|
||||||
tests/native_type_test_impl.cpp
|
tests/native_type_test_impl.cpp
|
||||||
tests/alignment_test.h
|
tests/alignment_test.h
|
||||||
@@ -282,8 +274,6 @@ set(FlatBuffers_GRPCTest_SRCS
|
|||||||
tests/test_builder.cpp
|
tests/test_builder.cpp
|
||||||
grpc/tests/grpctest.cpp
|
grpc/tests/grpctest.cpp
|
||||||
grpc/tests/message_builder_test.cpp
|
grpc/tests/message_builder_test.cpp
|
||||||
grpc/tests/grpctest_callback_compile.cpp
|
|
||||||
grpc/tests/grpctest_callback_client_compile.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO(dbaileychess): Figure out how this would now work. I posted a question on
|
# TODO(dbaileychess): Figure out how this would now work. I posted a question on
|
||||||
@@ -498,34 +488,28 @@ if(FLATBUFFERS_BUILD_SHAREDLIB)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
function(compile_schema SRC_FBS OPT SUFFIX OUT_GEN_FILE)
|
function(compile_schema SRC_FBS OPT OUT_GEN_FILE)
|
||||||
get_filename_component(SRC_FBS_DIR ${SRC_FBS} PATH)
|
get_filename_component(SRC_FBS_DIR ${SRC_FBS} PATH)
|
||||||
string(REGEX REPLACE "\\.fbs$" "${SUFFIX}.h" GEN_HEADER ${SRC_FBS})
|
string(REGEX REPLACE "\\.fbs$" "_generated.h" GEN_HEADER ${SRC_FBS})
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${GEN_HEADER}
|
OUTPUT ${GEN_HEADER}
|
||||||
COMMAND "${FLATBUFFERS_FLATC_EXECUTABLE}"
|
COMMAND "${FLATBUFFERS_FLATC_EXECUTABLE}"
|
||||||
${OPT}
|
${OPT}
|
||||||
--filename-suffix ${SUFFIX}
|
|
||||||
-o "${SRC_FBS_DIR}"
|
-o "${SRC_FBS_DIR}"
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FBS}"
|
"${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FBS}"
|
||||||
DEPENDS flatc ${SRC_FBS}
|
DEPENDS flatc ${SRC_FBS}
|
||||||
COMMENT "flatc generation: `${SRC_FBS}` -> `${GEN_HEADER}`"
|
COMMENT "flatc generation: `${SRC_FBS}` -> `${GEN_HEADER}`"
|
||||||
)
|
)
|
||||||
set(${OUT_GEN_FILE} ${GEN_HEADER} PARENT_SCOPE)
|
set(${OUT_GEN_FILE} ${GEN_HEADER} PARENT_SCOPE)
|
||||||
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}" GEN_FILE)
|
||||||
target_sources(flattests PRIVATE ${GEN_FILE})
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(compile_schema_for_test_fbsh SRC_FBS OPT)
|
|
||||||
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_samples SRC_FBS OPT)
|
function(compile_schema_for_samples SRC_FBS OPT)
|
||||||
compile_schema("${SRC_FBS}" "${OPT}" "_generated" GEN_FILE)
|
compile_schema("${SRC_FBS}" "${OPT}" GEN_FILE)
|
||||||
target_sources(flatsample PRIVATE ${GEN_FILE})
|
target_sources(flatsample PRIVATE ${GEN_FILE})
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
@@ -546,20 +530,19 @@ if(FLATBUFFERS_BUILD_TESTS)
|
|||||||
add_definitions(-DFLATBUFFERS_TEST_PATH_PREFIX=${CMAKE_CURRENT_SOURCE_DIR}/)
|
add_definitions(-DFLATBUFFERS_TEST_PATH_PREFIX=${CMAKE_CURRENT_SOURCE_DIR}/)
|
||||||
|
|
||||||
# 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 --cpp --gen-mutable --gen-object-api --reflect-names)
|
||||||
|
SET(FLATC_OPT_COMP ${FLATC_OPT};--gen-compare)
|
||||||
SET(FLATC_OPT_SCOPED_ENUMS ${FLATC_OPT_COMP};--scoped-enums)
|
SET(FLATC_OPT_SCOPED_ENUMS ${FLATC_OPT_COMP};--scoped-enums)
|
||||||
|
|
||||||
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/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}")
|
||||||
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}")
|
|
||||||
|
|
||||||
if(FLATBUFFERS_CODE_SANITIZE)
|
if(FLATBUFFERS_CODE_SANITIZE)
|
||||||
add_fsanitize_to_target(flattests ${FLATBUFFERS_CODE_SANITIZE})
|
add_fsanitize_to_target(flattests ${FLATBUFFERS_CODE_SANITIZE})
|
||||||
@@ -581,6 +564,8 @@ if(FLATBUFFERS_BUILD_TESTS)
|
|||||||
|
|
||||||
# Since flatsample has no sources, we have to explicitly set the linker lang.
|
# Since flatsample has no sources, we have to explicitly set the linker lang.
|
||||||
set_target_properties(flatsample PROPERTIES LINKER_LANGUAGE CXX)
|
set_target_properties(flatsample PROPERTIES LINKER_LANGUAGE CXX)
|
||||||
|
|
||||||
|
compile_schema_for_samples(samples/monster.fbs "${FLATC_OPT_COMP}")
|
||||||
|
|
||||||
target_link_libraries(flatsamplebinary PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
|
target_link_libraries(flatsamplebinary PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
|
||||||
target_link_libraries(flatsampletext PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
|
target_link_libraries(flatsampletext PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ Some tips for good pull requests:
|
|||||||
* Write a descriptive commit message. What problem are you solving and what
|
* Write a descriptive commit message. What problem are you solving and what
|
||||||
are the consequences? Where and what did you test? Some good tips:
|
are the consequences? Where and what did you test? Some good tips:
|
||||||
[here](http://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message)
|
[here](http://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message)
|
||||||
and [here](https://www.kernel.org/doc/Documentation/process/submitting-patches.rst).
|
and [here](https://www.kernel.org/doc/Documentation/SubmittingPatches).
|
||||||
* If your PR consists of multiple commits which are successive improvements /
|
* If your PR consists of multiple commits which are successive improvements /
|
||||||
fixes to your first commit, consider squashing them into a single commit
|
fixes to your first commit, consider squashing them into a single commit
|
||||||
(`git rebase -i`) such that your PR is a single commit on top of the current
|
(`git rebase -i`) such that your PR is a single commit on top of the current
|
||||||
@@ -40,26 +40,3 @@ Some tips for good pull requests:
|
|||||||
# The small print
|
# The small print
|
||||||
Contributions made by corporations are covered by a different agreement than
|
Contributions made by corporations are covered by a different agreement than
|
||||||
the one above, the Software Grant and Corporate Contributor License Agreement.
|
the one above, the Software Grant and Corporate Contributor License Agreement.
|
||||||
|
|
||||||
# Code
|
|
||||||
|
|
||||||
TL/DR
|
|
||||||
|
|
||||||
See [how to build flatc](https://flatbuffers.dev/building/).
|
|
||||||
|
|
||||||
When making changes, build `flatc` and then re-generate the goldens files to see the effect of your changes:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cp build/flatc .
|
|
||||||
$ goldens/generate_goldens.py
|
|
||||||
```
|
|
||||||
|
|
||||||
Re-generate other code files to see the effects of the changes:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ scripts/generate_code.py
|
|
||||||
```
|
|
||||||
|
|
||||||
Run tests with [TestAll.sh](tests/TestAll.sh) in [tests](tests), or directly any of the sub-scripts run by it.
|
|
||||||
|
|
||||||
[Format the code](Formatters.md) before submitting a PR.
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
Pod::Spec.new do |s|
|
Pod::Spec.new do |s|
|
||||||
s.name = 'FlatBuffers'
|
s.name = 'FlatBuffers'
|
||||||
s.version = '25.12.19'
|
s.version = '24.3.6'
|
||||||
s.summary = 'FlatBuffers: Memory Efficient Serialization Library'
|
s.summary = 'FlatBuffers: Memory Efficient Serialization Library'
|
||||||
|
|
||||||
s.description = "FlatBuffers is a cross platform serialization library architected for
|
s.description = "FlatBuffers is a cross platform serialization library architected for
|
||||||
@@ -10,15 +10,12 @@ Pod::Spec.new do |s|
|
|||||||
|
|
||||||
s.homepage = 'https://github.com/google/flatbuffers'
|
s.homepage = 'https://github.com/google/flatbuffers'
|
||||||
s.license = { :type => 'Apache2.0', :file => 'LICENSE' }
|
s.license = { :type => 'Apache2.0', :file => 'LICENSE' }
|
||||||
s.author = { 'mustii' => 'me@mustiikhalil.se' }
|
s.author = { 'mustii' => 'mustii@mmk.one' }
|
||||||
s.source = { :git => 'https://github.com/google/flatbuffers.git', :tag => "v" + s.version.to_s, :submodules => true }
|
s.source = { :git => 'https://github.com/google/flatbuffers.git', :tag => s.version.to_s, :submodules => true }
|
||||||
|
|
||||||
s.ios.deployment_target = '11.0'
|
s.ios.deployment_target = '11.0'
|
||||||
s.osx.deployment_target = '10.14'
|
s.osx.deployment_target = '10.14'
|
||||||
|
|
||||||
s.swift_version = '5.10'
|
s.swift_version = '5.0'
|
||||||
s.source_files = 'swift/Sources/Flatbuffers/*.swift'
|
s.source_files = 'swift/Sources/Flatbuffers/*.swift'
|
||||||
s.pod_target_xcconfig = {
|
|
||||||
'BUILD_LIBRARY_FOR_DISTRIBUTION' => 'YES'
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -19,4 +19,4 @@ Swift uses swiftformat as it's formatter. Take a look at [how to install here](h
|
|||||||
|
|
||||||
## Typescript
|
## Typescript
|
||||||
|
|
||||||
Typescript uses eslint as it's linter. Take a look at [how to install here](https://eslint.org/docs/user-guide/getting-started). Run the following command `eslint ts/** --ext .ts` in the root directory of the project
|
Typescript uses eslint as it's linter. Take a look at [how to install here](https://eslint.org/docs/user-guide/getting-started). Run the following command `eslint ts/** --ext .ts` in the root directory of the project
|
||||||
75
MODULE.bazel
75
MODULE.bazel
@@ -1,75 +0,0 @@
|
|||||||
module(
|
|
||||||
name = "flatbuffers",
|
|
||||||
version = "25.12.19",
|
|
||||||
compatibility_level = 1,
|
|
||||||
repo_name = "com_github_google_flatbuffers",
|
|
||||||
)
|
|
||||||
|
|
||||||
bazel_dep(
|
|
||||||
name = "aspect_bazel_lib",
|
|
||||||
version = "2.14.0",
|
|
||||||
)
|
|
||||||
bazel_dep(
|
|
||||||
name = "aspect_rules_esbuild",
|
|
||||||
version = "0.21.0",
|
|
||||||
)
|
|
||||||
bazel_dep(
|
|
||||||
name = "aspect_rules_js",
|
|
||||||
version = "2.3.8",
|
|
||||||
)
|
|
||||||
bazel_dep(
|
|
||||||
name = "aspect_rules_ts",
|
|
||||||
version = "3.6.0",
|
|
||||||
)
|
|
||||||
bazel_dep(
|
|
||||||
name = "grpc",
|
|
||||||
version = "1.76.0",
|
|
||||||
repo_name = "com_github_grpc_grpc",
|
|
||||||
)
|
|
||||||
bazel_dep(
|
|
||||||
name = "platforms",
|
|
||||||
version = "0.0.11",
|
|
||||||
)
|
|
||||||
bazel_dep(
|
|
||||||
name = "rules_cc",
|
|
||||||
version = "0.1.1",
|
|
||||||
)
|
|
||||||
bazel_dep(
|
|
||||||
name = "rules_go",
|
|
||||||
version = "0.50.1",
|
|
||||||
repo_name = "io_bazel_rules_go",
|
|
||||||
)
|
|
||||||
bazel_dep(
|
|
||||||
name = "rules_nodejs",
|
|
||||||
version = "6.3.3",
|
|
||||||
)
|
|
||||||
bazel_dep(
|
|
||||||
name = "rules_shell",
|
|
||||||
version = "0.3.0",
|
|
||||||
)
|
|
||||||
bazel_dep(
|
|
||||||
name = "rules_swift",
|
|
||||||
version = "3.1.2",
|
|
||||||
max_compatibility_level = 3,
|
|
||||||
repo_name = "build_bazel_rules_swift",
|
|
||||||
)
|
|
||||||
bazel_dep(
|
|
||||||
name = "bazel_skylib",
|
|
||||||
version = "1.7.1",
|
|
||||||
)
|
|
||||||
|
|
||||||
npm = use_extension("@aspect_rules_js//npm:extensions.bzl", "npm")
|
|
||||||
npm.npm_translate_lock(
|
|
||||||
name = "flatbuffers_npm",
|
|
||||||
npmrc = "//:.npmrc",
|
|
||||||
pnpm_lock = "//ts:pnpm-lock.yaml",
|
|
||||||
verify_node_modules_ignored = "//:.bazelignore",
|
|
||||||
)
|
|
||||||
use_repo(npm, "flatbuffers_npm")
|
|
||||||
|
|
||||||
node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node")
|
|
||||||
use_repo(node, "nodejs_linux_amd64")
|
|
||||||
|
|
||||||
rules_ts_ext = use_extension("@aspect_rules_ts//ts:extensions.bzl", "ext", dev_dependency = True)
|
|
||||||
rules_ts_ext.deps()
|
|
||||||
use_repo(rules_ts_ext, "npm_typescript")
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// swift-tools-version:6.0
|
// swift-tools-version:5.6
|
||||||
/*
|
/*
|
||||||
* Copyright 2020 Google Inc. All rights reserved.
|
* Copyright 2020 Google Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -20,79 +20,17 @@ import PackageDescription
|
|||||||
let package = Package(
|
let package = Package(
|
||||||
name: "FlatBuffers",
|
name: "FlatBuffers",
|
||||||
platforms: [
|
platforms: [
|
||||||
.iOS(.v12),
|
.iOS(.v11),
|
||||||
.macOS(.v10_14),
|
.macOS(.v10_14),
|
||||||
],
|
],
|
||||||
products: [
|
products: [
|
||||||
.library(
|
.library(
|
||||||
name: "FlatBuffers",
|
name: "FlatBuffers",
|
||||||
targets: ["FlatBuffers"]),
|
targets: ["FlatBuffers"]),
|
||||||
.library(
|
|
||||||
name: "FlexBuffers",
|
|
||||||
targets: ["FlexBuffers"]),
|
|
||||||
],
|
],
|
||||||
dependencies: .dependencies,
|
|
||||||
targets: [
|
targets: [
|
||||||
.target(
|
.target(
|
||||||
name: "FlatBuffers",
|
name: "FlatBuffers",
|
||||||
dependencies: ["Common"],
|
dependencies: [],
|
||||||
path: "swift/Sources/FlatBuffers",
|
path: "swift/Sources"),
|
||||||
swiftSettings: .settings),
|
])
|
||||||
.target(
|
|
||||||
name: "FlexBuffers",
|
|
||||||
dependencies: ["Common"],
|
|
||||||
path: "swift/Sources/FlexBuffers",
|
|
||||||
swiftSettings: .settings),
|
|
||||||
.target(
|
|
||||||
name: "Common",
|
|
||||||
path: "swift/Sources/Common",
|
|
||||||
swiftSettings: .settings),
|
|
||||||
.testTarget(
|
|
||||||
name: "FlatbuffersTests",
|
|
||||||
dependencies: .dependencies,
|
|
||||||
path: "tests/swift/Tests/Flatbuffers"),
|
|
||||||
.testTarget(
|
|
||||||
name: "FlexbuffersTests",
|
|
||||||
dependencies: ["FlexBuffers"],
|
|
||||||
path: "tests/swift/Tests/Flexbuffers"),
|
|
||||||
],
|
|
||||||
swiftLanguageModes: [.v6])
|
|
||||||
|
|
||||||
extension Array where Element == SwiftSetting {
|
|
||||||
static var settings: [SwiftSetting] {
|
|
||||||
[.enableUpcomingFeature("ExistentialAny")]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension Array where Element == Package.Dependency {
|
|
||||||
static var dependencies: [Package.Dependency] {
|
|
||||||
#if os(Windows)
|
|
||||||
[]
|
|
||||||
#else
|
|
||||||
// Test only Dependency
|
|
||||||
[
|
|
||||||
.package(url: "https://github.com/grpc/grpc-swift-2.git", from: "2.0.0"),
|
|
||||||
.package(
|
|
||||||
url: "https://github.com/grpc/grpc-swift-nio-transport.git",
|
|
||||||
from: "2.0.0"),
|
|
||||||
]
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension Array where Element == PackageDescription.Target.Dependency {
|
|
||||||
static var dependencies: [PackageDescription.Target.Dependency] {
|
|
||||||
#if os(Windows)
|
|
||||||
["FlatBuffers"]
|
|
||||||
#else
|
|
||||||
// Test only Dependency
|
|
||||||
[
|
|
||||||
.product(name: "GRPCCore", package: "grpc-swift-2"),
|
|
||||||
.product(
|
|
||||||
name: "GRPCNIOTransportHTTP2",
|
|
||||||
package: "grpc-swift-nio-transport"),
|
|
||||||
"FlatBuffers",
|
|
||||||
]
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// swift-tools-version:5.10
|
// swift-tools-version:5.5
|
||||||
/*
|
/*
|
||||||
* Copyright 2020 Google Inc. All rights reserved.
|
* Copyright 2020 Google Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -18,18 +18,20 @@
|
|||||||
import PackageDescription
|
import PackageDescription
|
||||||
|
|
||||||
let package = Package(
|
let package = Package(
|
||||||
name: "fuzzer",
|
name: "FlatBuffers",
|
||||||
platforms: [
|
platforms: [
|
||||||
.iOS(.v12),
|
.iOS(.v11),
|
||||||
.macOS(.v10_14),
|
.macOS(.v10_14),
|
||||||
],
|
],
|
||||||
dependencies: [
|
products: [
|
||||||
.package(path: "../../.."),
|
.library(
|
||||||
|
name: "FlatBuffers",
|
||||||
|
targets: ["FlatBuffers"]),
|
||||||
],
|
],
|
||||||
targets: [
|
targets: [
|
||||||
.executableTarget(
|
.target(
|
||||||
name: "fuzzer",
|
name: "FlatBuffers",
|
||||||
dependencies: [
|
dependencies: [],
|
||||||
.product(name: "FlatBuffers", package: "flatbuffers"),
|
path: "swift/Sources"),
|
||||||
]),
|
|
||||||
])
|
])
|
||||||
|
|
||||||
10
README.md
10
README.md
@@ -1,9 +1,11 @@
|
|||||||
 FlatBuffers
|
 FlatBuffers
|
||||||
===========
|
===========
|
||||||
|
|
||||||

|

|
||||||
[](https://buildkite.com/bazel/flatbuffers)
|
[](https://buildkite.com/bazel/flatbuffers)
|
||||||
[](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:flatbuffers)
|
[](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:flatbuffers)
|
||||||
|
[](https://api.securityscorecards.dev/projects/github.com/google/flatbuffers)
|
||||||
|
[](https://gitter.im/google/flatbuffers?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
[](https:///discord.gg/6qgKs3R)
|
[](https:///discord.gg/6qgKs3R)
|
||||||
[](https://twitter.com/wvo)
|
[](https://twitter.com/wvo)
|
||||||
[](https://twitter.com/dbaileychess)
|
[](https://twitter.com/dbaileychess)
|
||||||
@@ -16,7 +18,7 @@ maximum memory efficiency. It allows you to directly access serialized data with
|
|||||||
|
|
||||||
1. Build the compiler for flatbuffers (`flatc`)
|
1. Build the compiler for flatbuffers (`flatc`)
|
||||||
|
|
||||||
Use `cmake` to create the build files for your platform and then perform the compilation (Linux example).
|
Use `cmake` to create the build files for your platform and then perform the compliation (Linux example).
|
||||||
|
|
||||||
```
|
```
|
||||||
cmake -G "Unix Makefiles"
|
cmake -G "Unix Makefiles"
|
||||||
@@ -34,7 +36,7 @@ maximum memory efficiency. It allows you to directly access serialized data with
|
|||||||
```
|
```
|
||||||
./flatc --cpp --rust monster.fbs
|
./flatc --cpp --rust monster.fbs
|
||||||
```
|
```
|
||||||
|
|
||||||
Which generates `monster_generated.h` and `monster_generated.rs` files.
|
Which generates `monster_generated.h` and `monster_generated.rs` files.
|
||||||
|
|
||||||
4. Serialize data
|
4. Serialize data
|
||||||
@@ -48,7 +50,7 @@ maximum memory efficiency. It allows you to directly access serialized data with
|
|||||||
6. Read the data
|
6. Read the data
|
||||||
|
|
||||||
Use the generated accessors to read the data from the serialized buffer.
|
Use the generated accessors to read the data from the serialized buffer.
|
||||||
|
|
||||||
It doesn't need to be the same language/schema version, FlatBuffers ensures the data is readable across languages and schema versions. See the [`Rust` example](https://github.com/google/flatbuffers/blob/master/samples/sample_binary.rs#L92-L106) reading the data written by `C++`.
|
It doesn't need to be the same language/schema version, FlatBuffers ensures the data is readable across languages and schema versions. See the [`Rust` example](https://github.com/google/flatbuffers/blob/master/samples/sample_binary.rs#L92-L106) reading the data written by `C++`.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|||||||
169
WORKSPACE
Normal file
169
WORKSPACE
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
workspace(name = "com_github_google_flatbuffers")
|
||||||
|
|
||||||
|
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file")
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "platforms",
|
||||||
|
sha256 = "3a561c99e7bdbe9173aa653fd579fe849f1d8d67395780ab4770b1f381431d51",
|
||||||
|
urls = [
|
||||||
|
"https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.7/platforms-0.0.7.tar.gz",
|
||||||
|
"https://github.com/bazelbuild/platforms/releases/download/0.0.7/platforms-0.0.7.tar.gz",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "build_bazel_rules_apple",
|
||||||
|
sha256 = "34c41bfb59cdaea29ac2df5a2fa79e5add609c71bb303b2ebb10985f93fa20e7",
|
||||||
|
url = "https://github.com/bazelbuild/rules_apple/releases/download/3.1.1/rules_apple.3.1.1.tar.gz",
|
||||||
|
)
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@build_bazel_rules_apple//apple:repositories.bzl",
|
||||||
|
"apple_rules_dependencies",
|
||||||
|
)
|
||||||
|
|
||||||
|
apple_rules_dependencies()
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "build_bazel_rules_swift",
|
||||||
|
sha256 = "a2fd565e527f83fb3f9eb07eb9737240e668c9242d3bc318712efa54a7deda97",
|
||||||
|
url = "https://github.com/bazelbuild/rules_swift/releases/download/0.27.0/rules_swift.0.27.0.tar.gz",
|
||||||
|
)
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@build_bazel_rules_swift//swift:repositories.bzl",
|
||||||
|
"swift_rules_dependencies",
|
||||||
|
)
|
||||||
|
|
||||||
|
swift_rules_dependencies()
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@build_bazel_rules_swift//swift:extras.bzl",
|
||||||
|
"swift_rules_extra_dependencies",
|
||||||
|
)
|
||||||
|
|
||||||
|
swift_rules_extra_dependencies()
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "io_bazel_rules_go",
|
||||||
|
sha256 = "278b7ff5a826f3dc10f04feaf0b70d48b68748ccd512d7f98bf442077f043fe3",
|
||||||
|
urls = [
|
||||||
|
"https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.41.0/rules_go-v0.41.0.zip",
|
||||||
|
"https://github.com/bazelbuild/rules_go/releases/download/v0.41.0/rules_go-v0.41.0.zip",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies")
|
||||||
|
|
||||||
|
go_rules_dependencies()
|
||||||
|
|
||||||
|
##### Protobuf
|
||||||
|
_PROTOBUF_VERSION = "3.15.2"
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "com_google_protobuf",
|
||||||
|
strip_prefix = "protobuf-" + _PROTOBUF_VERSION,
|
||||||
|
urls = [
|
||||||
|
"https://github.com/protocolbuffers/protobuf/archive/v" + _PROTOBUF_VERSION + ".tar.gz",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
##### GRPC
|
||||||
|
_GRPC_VERSION = "1.49.0" # https://github.com/grpc/grpc/releases/tag/v1.48.0
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "com_github_grpc_grpc",
|
||||||
|
patch_args = ["-p1"],
|
||||||
|
patches = ["//grpc:build_grpc_with_cxx14.patch"],
|
||||||
|
sha256 = "15715e1847cc9e42014f02c727dbcb48e39dbdb90f79ad3d66fe4361709ff935",
|
||||||
|
strip_prefix = "grpc-" + _GRPC_VERSION,
|
||||||
|
urls = ["https://github.com/grpc/grpc/archive/refs/tags/v" + _GRPC_VERSION + ".tar.gz"],
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps")
|
||||||
|
|
||||||
|
grpc_deps()
|
||||||
|
|
||||||
|
load("@com_github_grpc_grpc//bazel:grpc_extra_deps.bzl", "grpc_extra_deps")
|
||||||
|
|
||||||
|
grpc_extra_deps()
|
||||||
|
|
||||||
|
# rules_go from https://github.com/bazelbuild/rules_go/releases/tag/v0.34.0
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "aspect_rules_js",
|
||||||
|
sha256 = "76a04ef2120ee00231d85d1ff012ede23963733339ad8db81f590791a031f643",
|
||||||
|
strip_prefix = "rules_js-1.34.1",
|
||||||
|
url = "https://github.com/aspect-build/rules_js/releases/download/v1.34.1/rules_js-v1.34.1.tar.gz",
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@aspect_rules_js//js:repositories.bzl", "rules_js_dependencies")
|
||||||
|
|
||||||
|
rules_js_dependencies()
|
||||||
|
|
||||||
|
load("@aspect_rules_js//npm:npm_import.bzl", "npm_translate_lock", "pnpm_repository")
|
||||||
|
|
||||||
|
pnpm_repository(name = "pnpm")
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "aspect_rules_ts",
|
||||||
|
sha256 = "4c3f34fff9f96ffc9c26635d8235a32a23a6797324486c7d23c1dfa477e8b451",
|
||||||
|
strip_prefix = "rules_ts-1.4.5",
|
||||||
|
url = "https://github.com/aspect-build/rules_ts/releases/download/v1.4.5/rules_ts-v1.4.5.tar.gz",
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@aspect_rules_ts//ts:repositories.bzl", "rules_ts_dependencies")
|
||||||
|
|
||||||
|
rules_ts_dependencies(
|
||||||
|
# Since rules_ts doesn't always have the newest integrity hashes, we
|
||||||
|
# compute it manually here.
|
||||||
|
# $ curl --silent https://registry.npmjs.org/typescript/5.3.3 | jq ._integrity
|
||||||
|
ts_integrity = "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
|
||||||
|
ts_version_from = "//:package.json",
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@rules_nodejs//nodejs:repositories.bzl", "DEFAULT_NODE_VERSION", "nodejs_register_toolchains")
|
||||||
|
|
||||||
|
nodejs_register_toolchains(
|
||||||
|
name = "nodejs",
|
||||||
|
node_version = DEFAULT_NODE_VERSION,
|
||||||
|
)
|
||||||
|
|
||||||
|
npm_translate_lock(
|
||||||
|
name = "npm",
|
||||||
|
npmrc = "//:.npmrc",
|
||||||
|
pnpm_lock = "//:pnpm-lock.yaml",
|
||||||
|
# Set this to True when the lock file needs to be updated, commit the
|
||||||
|
# changes, then set to False again.
|
||||||
|
update_pnpm_lock = False,
|
||||||
|
verify_node_modules_ignored = "//:.bazelignore",
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@npm//:repositories.bzl", "npm_repositories")
|
||||||
|
|
||||||
|
npm_repositories()
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "aspect_rules_esbuild",
|
||||||
|
sha256 = "098e38e5ee868c14a6484ba263b79e57d48afacfc361ba30137c757a9c4716d6",
|
||||||
|
strip_prefix = "rules_esbuild-0.15.0",
|
||||||
|
url = "https://github.com/aspect-build/rules_esbuild/releases/download/v0.15.0/rules_esbuild-v0.15.0.tar.gz",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Register a toolchain containing esbuild npm package and native bindings
|
||||||
|
load("@aspect_rules_esbuild//esbuild:repositories.bzl", "LATEST_ESBUILD_VERSION", "esbuild_register_toolchains")
|
||||||
|
|
||||||
|
esbuild_register_toolchains(
|
||||||
|
name = "esbuild",
|
||||||
|
esbuild_version = LATEST_ESBUILD_VERSION,
|
||||||
|
)
|
||||||
|
|
||||||
|
http_file(
|
||||||
|
name = "bazel_linux_x86_64",
|
||||||
|
downloaded_file_path = "bazel",
|
||||||
|
executable = True,
|
||||||
|
sha256 = "e78fc3394deae5408d6f49a15c7b1e615901969ecf6e50d55ef899996b0b8458",
|
||||||
|
urls = [
|
||||||
|
"https://github.com/bazelbuild/bazel/releases/download/6.3.2/bazel-6.3.2-linux-x86_64",
|
||||||
|
],
|
||||||
|
)
|
||||||
21
android/app/proguard-rules.pro
vendored
Normal file
21
android/app/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
@@ -15,27 +15,25 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
#include <search.h>
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <search.h>
|
||||||
#include "generated/animal_generated.h"
|
#include "generated/animal_generated.h"
|
||||||
|
|
||||||
using namespace com::fbs::app;
|
using namespace com::fbs::app;
|
||||||
using namespace flatbuffers;
|
using namespace flatbuffers;
|
||||||
|
|
||||||
extern "C" JNIEXPORT jbyteArray JNICALL
|
extern "C" JNIEXPORT jbyteArray JNICALL Java_com_flatbuffers_app_MainActivity_createAnimalFromJNI(
|
||||||
Java_com_flatbuffers_app_MainActivity_createAnimalFromJNI(JNIEnv* env,
|
JNIEnv* env,
|
||||||
jobject /* this */) {
|
jobject /* this */) {
|
||||||
// create a new animal flatbuffers
|
// create a new animal flatbuffers
|
||||||
auto fb = FlatBufferBuilder(1024);
|
auto fb = FlatBufferBuilder(1024);
|
||||||
auto tiger = CreateAnimalDirect(fb, "Tiger", "Roar", 300);
|
auto tiger = CreateAnimalDirect(fb, "Tiger", "Roar", 300);
|
||||||
fb.Finish(tiger);
|
fb.Finish(tiger);
|
||||||
|
|
||||||
// copies it to a Java byte array.
|
// copies it to a Java byte array.
|
||||||
auto buf = reinterpret_cast<jbyte*>(fb.GetBufferPointer());
|
auto buf = reinterpret_cast<jbyte*>(fb.GetBufferPointer());
|
||||||
int size = fb.GetSize();
|
int size = fb.GetSize();
|
||||||
auto ret = env->NewByteArray(size);
|
auto ret = env->NewByteArray(size);
|
||||||
env->SetByteArrayRegion(ret, 0, fb.GetSize(), buf);
|
env->SetByteArrayRegion (ret, 0, fb.GetSize(), buf);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// automatically generated by the FlatBuffers compiler, do not modify
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
|
|
||||||
|
|
||||||
#ifndef FLATBUFFERS_GENERATED_ANIMAL_COM_FBS_APP_H_
|
#ifndef FLATBUFFERS_GENERATED_ANIMAL_COM_FBS_APP_H_
|
||||||
#define FLATBUFFERS_GENERATED_ANIMAL_COM_FBS_APP_H_
|
#define FLATBUFFERS_GENERATED_ANIMAL_COM_FBS_APP_H_
|
||||||
|
|
||||||
@@ -7,10 +8,10 @@
|
|||||||
|
|
||||||
// Ensure the included flatbuffers.h is the same version as when this file was
|
// Ensure the included flatbuffers.h is the same version as when this file was
|
||||||
// generated, otherwise it may not be compatible.
|
// generated, otherwise it may not be compatible.
|
||||||
static_assert(FLATBUFFERS_VERSION_MAJOR == 24 &&
|
static_assert(FLATBUFFERS_VERSION_MAJOR == 23 &&
|
||||||
FLATBUFFERS_VERSION_MINOR == 12 &&
|
FLATBUFFERS_VERSION_MINOR == 1 &&
|
||||||
FLATBUFFERS_VERSION_REVISION == 23,
|
FLATBUFFERS_VERSION_REVISION == 21,
|
||||||
"Non-compatible flatbuffers version included");
|
"Non-compatible flatbuffers version included");
|
||||||
|
|
||||||
namespace com {
|
namespace com {
|
||||||
namespace fbs {
|
namespace fbs {
|
||||||
@@ -26,24 +27,29 @@ struct Animal FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
|
|||||||
VT_SOUND = 6,
|
VT_SOUND = 6,
|
||||||
VT_WEIGHT = 8
|
VT_WEIGHT = 8
|
||||||
};
|
};
|
||||||
const ::flatbuffers::String* name() const {
|
const ::flatbuffers::String *name() const {
|
||||||
return GetPointer<const ::flatbuffers::String*>(VT_NAME);
|
return GetPointer<const ::flatbuffers::String *>(VT_NAME);
|
||||||
}
|
}
|
||||||
const ::flatbuffers::String* sound() const {
|
const ::flatbuffers::String *sound() const {
|
||||||
return GetPointer<const ::flatbuffers::String*>(VT_SOUND);
|
return GetPointer<const ::flatbuffers::String *>(VT_SOUND);
|
||||||
}
|
}
|
||||||
uint16_t weight() const { return GetField<uint16_t>(VT_WEIGHT, 0); }
|
uint16_t weight() const {
|
||||||
bool Verify(::flatbuffers::Verifier& verifier) const {
|
return GetField<uint16_t>(VT_WEIGHT, 0);
|
||||||
return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_NAME) &&
|
}
|
||||||
verifier.VerifyString(name()) && VerifyOffset(verifier, VT_SOUND) &&
|
bool Verify(::flatbuffers::Verifier &verifier) const {
|
||||||
|
return VerifyTableStart(verifier) &&
|
||||||
|
VerifyOffset(verifier, VT_NAME) &&
|
||||||
|
verifier.VerifyString(name()) &&
|
||||||
|
VerifyOffset(verifier, VT_SOUND) &&
|
||||||
verifier.VerifyString(sound()) &&
|
verifier.VerifyString(sound()) &&
|
||||||
VerifyField<uint16_t>(verifier, VT_WEIGHT, 2) && verifier.EndTable();
|
VerifyField<uint16_t>(verifier, VT_WEIGHT, 2) &&
|
||||||
|
verifier.EndTable();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AnimalBuilder {
|
struct AnimalBuilder {
|
||||||
typedef Animal Table;
|
typedef Animal Table;
|
||||||
::flatbuffers::FlatBufferBuilder& fbb_;
|
::flatbuffers::FlatBufferBuilder &fbb_;
|
||||||
::flatbuffers::uoffset_t start_;
|
::flatbuffers::uoffset_t start_;
|
||||||
void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {
|
void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {
|
||||||
fbb_.AddOffset(Animal::VT_NAME, name);
|
fbb_.AddOffset(Animal::VT_NAME, name);
|
||||||
@@ -54,7 +60,8 @@ struct AnimalBuilder {
|
|||||||
void add_weight(uint16_t weight) {
|
void add_weight(uint16_t weight) {
|
||||||
fbb_.AddElement<uint16_t>(Animal::VT_WEIGHT, weight, 0);
|
fbb_.AddElement<uint16_t>(Animal::VT_WEIGHT, weight, 0);
|
||||||
}
|
}
|
||||||
explicit AnimalBuilder(::flatbuffers::FlatBufferBuilder& _fbb) : fbb_(_fbb) {
|
explicit AnimalBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
|
||||||
|
: fbb_(_fbb) {
|
||||||
start_ = fbb_.StartTable();
|
start_ = fbb_.StartTable();
|
||||||
}
|
}
|
||||||
::flatbuffers::Offset<Animal> Finish() {
|
::flatbuffers::Offset<Animal> Finish() {
|
||||||
@@ -65,7 +72,7 @@ struct AnimalBuilder {
|
|||||||
};
|
};
|
||||||
|
|
||||||
inline ::flatbuffers::Offset<Animal> CreateAnimal(
|
inline ::flatbuffers::Offset<Animal> CreateAnimal(
|
||||||
::flatbuffers::FlatBufferBuilder& _fbb,
|
::flatbuffers::FlatBufferBuilder &_fbb,
|
||||||
::flatbuffers::Offset<::flatbuffers::String> name = 0,
|
::flatbuffers::Offset<::flatbuffers::String> name = 0,
|
||||||
::flatbuffers::Offset<::flatbuffers::String> sound = 0,
|
::flatbuffers::Offset<::flatbuffers::String> sound = 0,
|
||||||
uint16_t weight = 0) {
|
uint16_t weight = 0) {
|
||||||
@@ -77,37 +84,45 @@ inline ::flatbuffers::Offset<Animal> CreateAnimal(
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline ::flatbuffers::Offset<Animal> CreateAnimalDirect(
|
inline ::flatbuffers::Offset<Animal> CreateAnimalDirect(
|
||||||
::flatbuffers::FlatBufferBuilder& _fbb, const char* name = nullptr,
|
::flatbuffers::FlatBufferBuilder &_fbb,
|
||||||
const char* sound = nullptr, uint16_t weight = 0) {
|
const char *name = nullptr,
|
||||||
|
const char *sound = nullptr,
|
||||||
|
uint16_t weight = 0) {
|
||||||
auto name__ = name ? _fbb.CreateString(name) : 0;
|
auto name__ = name ? _fbb.CreateString(name) : 0;
|
||||||
auto sound__ = sound ? _fbb.CreateString(sound) : 0;
|
auto sound__ = sound ? _fbb.CreateString(sound) : 0;
|
||||||
return com::fbs::app::CreateAnimal(_fbb, name__, sound__, weight);
|
return com::fbs::app::CreateAnimal(
|
||||||
|
_fbb,
|
||||||
|
name__,
|
||||||
|
sound__,
|
||||||
|
weight);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const com::fbs::app::Animal* GetAnimal(const void* buf) {
|
inline const com::fbs::app::Animal *GetAnimal(const void *buf) {
|
||||||
return ::flatbuffers::GetRoot<com::fbs::app::Animal>(buf);
|
return ::flatbuffers::GetRoot<com::fbs::app::Animal>(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const com::fbs::app::Animal* GetSizePrefixedAnimal(const void* buf) {
|
inline const com::fbs::app::Animal *GetSizePrefixedAnimal(const void *buf) {
|
||||||
return ::flatbuffers::GetSizePrefixedRoot<com::fbs::app::Animal>(buf);
|
return ::flatbuffers::GetSizePrefixedRoot<com::fbs::app::Animal>(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool VerifyAnimalBuffer(::flatbuffers::Verifier& verifier) {
|
inline bool VerifyAnimalBuffer(
|
||||||
|
::flatbuffers::Verifier &verifier) {
|
||||||
return verifier.VerifyBuffer<com::fbs::app::Animal>(nullptr);
|
return verifier.VerifyBuffer<com::fbs::app::Animal>(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool VerifySizePrefixedAnimalBuffer(::flatbuffers::Verifier& verifier) {
|
inline bool VerifySizePrefixedAnimalBuffer(
|
||||||
|
::flatbuffers::Verifier &verifier) {
|
||||||
return verifier.VerifySizePrefixedBuffer<com::fbs::app::Animal>(nullptr);
|
return verifier.VerifySizePrefixedBuffer<com::fbs::app::Animal>(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void FinishAnimalBuffer(
|
inline void FinishAnimalBuffer(
|
||||||
::flatbuffers::FlatBufferBuilder& fbb,
|
::flatbuffers::FlatBufferBuilder &fbb,
|
||||||
::flatbuffers::Offset<com::fbs::app::Animal> root) {
|
::flatbuffers::Offset<com::fbs::app::Animal> root) {
|
||||||
fbb.Finish(root);
|
fbb.Finish(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void FinishSizePrefixedAnimalBuffer(
|
inline void FinishSizePrefixedAnimalBuffer(
|
||||||
::flatbuffers::FlatBufferBuilder& fbb,
|
::flatbuffers::FlatBufferBuilder &fbb,
|
||||||
::flatbuffers::Offset<com::fbs::app::Animal> root) {
|
::flatbuffers::Offset<com::fbs::app::Animal> root) {
|
||||||
fbb.FinishSizePrefixed(root);
|
fbb.FinishSizePrefixed(root);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.flatbuffers.app
|
package com.flatbuffers.app
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
|
||||||
import com.fbs.app.Animal
|
import com.fbs.app.Animal
|
||||||
import com.google.flatbuffers.FlatBufferBuilder
|
import com.google.flatbuffers.FlatBufferBuilder
|
||||||
import java.nio.ByteBuffer
|
import java.nio.ByteBuffer
|
||||||
@@ -27,15 +27,14 @@ class MainActivity : AppCompatActivity() {
|
|||||||
private external fun createAnimalFromJNI(): ByteArray
|
private external fun createAnimalFromJNI(): ByteArray
|
||||||
|
|
||||||
// Create a "Cow" Animal flatbuffers from Kotlin
|
// Create a "Cow" Animal flatbuffers from Kotlin
|
||||||
private fun createAnimalFromKotlin(): Animal {
|
private fun createAnimalFromKotlin():Animal {
|
||||||
val fb = FlatBufferBuilder(100)
|
val fb = FlatBufferBuilder(100)
|
||||||
val cowOffset =
|
val cowOffset = Animal.createAnimal(
|
||||||
Animal.createAnimal(
|
builder = fb,
|
||||||
builder = fb,
|
nameOffset = fb.createString("Cow"),
|
||||||
nameOffset = fb.createString("Cow"),
|
soundOffset = fb.createString("Moo"),
|
||||||
soundOffset = fb.createString("Moo"),
|
weight = 720u
|
||||||
weight = 720u,
|
)
|
||||||
)
|
|
||||||
fb.finish(cowOffset)
|
fb.finish(cowOffset)
|
||||||
return Animal.getRootAsAnimal(fb.dataBuffer())
|
return Animal.getRootAsAnimal(fb.dataBuffer())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,101 +2,83 @@
|
|||||||
|
|
||||||
package com.fbs.app
|
package com.fbs.app
|
||||||
|
|
||||||
|
import com.google.flatbuffers.BaseVector
|
||||||
|
import com.google.flatbuffers.BooleanVector
|
||||||
|
import com.google.flatbuffers.ByteVector
|
||||||
import com.google.flatbuffers.Constants
|
import com.google.flatbuffers.Constants
|
||||||
|
import com.google.flatbuffers.DoubleVector
|
||||||
import com.google.flatbuffers.FlatBufferBuilder
|
import com.google.flatbuffers.FlatBufferBuilder
|
||||||
|
import com.google.flatbuffers.FloatVector
|
||||||
|
import com.google.flatbuffers.LongVector
|
||||||
|
import com.google.flatbuffers.StringVector
|
||||||
|
import com.google.flatbuffers.Struct
|
||||||
import com.google.flatbuffers.Table
|
import com.google.flatbuffers.Table
|
||||||
|
import com.google.flatbuffers.UnionVector
|
||||||
import java.nio.ByteBuffer
|
import java.nio.ByteBuffer
|
||||||
import java.nio.ByteOrder
|
import java.nio.ByteOrder
|
||||||
|
import kotlin.math.sign
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
@kotlin.ExperimentalUnsignedTypes
|
@kotlin.ExperimentalUnsignedTypes
|
||||||
class Animal : Table() {
|
class Animal : Table() {
|
||||||
|
|
||||||
fun __init(_i: Int, _bb: ByteBuffer) {
|
fun __init(_i: Int, _bb: ByteBuffer) {
|
||||||
__reset(_i, _bb)
|
__reset(_i, _bb)
|
||||||
}
|
|
||||||
|
|
||||||
fun __assign(_i: Int, _bb: ByteBuffer): Animal {
|
|
||||||
__init(_i, _bb)
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
val name: String?
|
|
||||||
get() {
|
|
||||||
val o = __offset(4)
|
|
||||||
return if (o != 0) {
|
|
||||||
__string(o + bb_pos)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
fun __assign(_i: Int, _bb: ByteBuffer) : Animal {
|
||||||
val nameAsByteBuffer: ByteBuffer
|
__init(_i, _bb)
|
||||||
get() = __vector_as_bytebuffer(4, 1)
|
return this
|
||||||
|
|
||||||
fun nameInByteBuffer(_bb: ByteBuffer): ByteBuffer = __vector_in_bytebuffer(_bb, 4, 1)
|
|
||||||
|
|
||||||
val sound: String?
|
|
||||||
get() {
|
|
||||||
val o = __offset(6)
|
|
||||||
return if (o != 0) {
|
|
||||||
__string(o + bb_pos)
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
val name : String?
|
||||||
val soundAsByteBuffer: ByteBuffer
|
get() {
|
||||||
get() = __vector_as_bytebuffer(6, 1)
|
val o = __offset(4)
|
||||||
|
return if (o != 0) {
|
||||||
fun soundInByteBuffer(_bb: ByteBuffer): ByteBuffer = __vector_in_bytebuffer(_bb, 6, 1)
|
__string(o + bb_pos)
|
||||||
|
} else {
|
||||||
val weight: UShort
|
null
|
||||||
get() {
|
}
|
||||||
val o = __offset(8)
|
}
|
||||||
return if (o != 0) bb.getShort(o + bb_pos).toUShort() else 0u
|
val nameAsByteBuffer : ByteBuffer get() = __vector_as_bytebuffer(4, 1)
|
||||||
|
fun nameInByteBuffer(_bb: ByteBuffer) : ByteBuffer = __vector_in_bytebuffer(_bb, 4, 1)
|
||||||
|
val sound : String?
|
||||||
|
get() {
|
||||||
|
val o = __offset(6)
|
||||||
|
return if (o != 0) {
|
||||||
|
__string(o + bb_pos)
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val soundAsByteBuffer : ByteBuffer get() = __vector_as_bytebuffer(6, 1)
|
||||||
|
fun soundInByteBuffer(_bb: ByteBuffer) : ByteBuffer = __vector_in_bytebuffer(_bb, 6, 1)
|
||||||
|
val weight : UShort
|
||||||
|
get() {
|
||||||
|
val o = __offset(8)
|
||||||
|
return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 0u
|
||||||
|
}
|
||||||
|
companion object {
|
||||||
|
fun validateVersion() = Constants.FLATBUFFERS_24_3_6()
|
||||||
|
fun getRootAsAnimal(_bb: ByteBuffer): Animal = getRootAsAnimal(_bb, Animal())
|
||||||
|
fun getRootAsAnimal(_bb: ByteBuffer, obj: Animal): Animal {
|
||||||
|
_bb.order(ByteOrder.LITTLE_ENDIAN)
|
||||||
|
return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))
|
||||||
|
}
|
||||||
|
fun createAnimal(builder: FlatBufferBuilder, nameOffset: Int, soundOffset: Int, weight: UShort) : Int {
|
||||||
|
builder.startTable(3)
|
||||||
|
addSound(builder, soundOffset)
|
||||||
|
addName(builder, nameOffset)
|
||||||
|
addWeight(builder, weight)
|
||||||
|
return endAnimal(builder)
|
||||||
|
}
|
||||||
|
fun startAnimal(builder: FlatBufferBuilder) = builder.startTable(3)
|
||||||
|
fun addName(builder: FlatBufferBuilder, name: Int) = builder.addOffset(0, name, 0)
|
||||||
|
fun addSound(builder: FlatBufferBuilder, sound: Int) = builder.addOffset(1, sound, 0)
|
||||||
|
fun addWeight(builder: FlatBufferBuilder, weight: UShort) = builder.addShort(2, weight.toShort(), 0)
|
||||||
|
fun endAnimal(builder: FlatBufferBuilder) : Int {
|
||||||
|
val o = builder.endTable()
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
fun finishAnimalBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset)
|
||||||
|
fun finishSizePrefixedAnimalBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finishSizePrefixed(offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
|
||||||
fun validateVersion() = Constants.FLATBUFFERS_25_12_19()
|
|
||||||
|
|
||||||
fun getRootAsAnimal(_bb: ByteBuffer): Animal = getRootAsAnimal(_bb, Animal())
|
|
||||||
|
|
||||||
fun getRootAsAnimal(_bb: ByteBuffer, obj: Animal): Animal {
|
|
||||||
_bb.order(ByteOrder.LITTLE_ENDIAN)
|
|
||||||
return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))
|
|
||||||
}
|
|
||||||
|
|
||||||
fun createAnimal(
|
|
||||||
builder: FlatBufferBuilder,
|
|
||||||
nameOffset: Int,
|
|
||||||
soundOffset: Int,
|
|
||||||
weight: UShort,
|
|
||||||
): Int {
|
|
||||||
builder.startTable(3)
|
|
||||||
addSound(builder, soundOffset)
|
|
||||||
addName(builder, nameOffset)
|
|
||||||
addWeight(builder, weight)
|
|
||||||
return endAnimal(builder)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun startAnimal(builder: FlatBufferBuilder) = builder.startTable(3)
|
|
||||||
|
|
||||||
fun addName(builder: FlatBufferBuilder, name: Int) = builder.addOffset(0, name, 0)
|
|
||||||
|
|
||||||
fun addSound(builder: FlatBufferBuilder, sound: Int) = builder.addOffset(1, sound, 0)
|
|
||||||
|
|
||||||
fun addWeight(builder: FlatBufferBuilder, weight: UShort) =
|
|
||||||
builder.addShort(2, weight.toShort(), 0)
|
|
||||||
|
|
||||||
fun endAnimal(builder: FlatBufferBuilder): Int {
|
|
||||||
val o = builder.endTable()
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
fun finishAnimalBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset)
|
|
||||||
|
|
||||||
fun finishSizePrefixedAnimalBuffer(builder: FlatBufferBuilder, offset: Int) =
|
|
||||||
builder.finishSizePrefixed(offset)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ struct Bench {
|
|||||||
|
|
||||||
inline void Add(int64_t value) { sum += value; }
|
inline void Add(int64_t value) { sum += value; }
|
||||||
|
|
||||||
virtual uint8_t* Encode(void* buf, int64_t& len) = 0;
|
virtual uint8_t *Encode(void *buf, int64_t &len) = 0;
|
||||||
virtual void* Decode(void* buf, int64_t len) = 0;
|
virtual void *Decode(void *buf, int64_t len) = 0;
|
||||||
virtual int64_t Use(void* decoded) = 0;
|
virtual int64_t Use(void *decoded) = 0;
|
||||||
virtual void Dealloc(void* decoded) = 0;
|
virtual void Dealloc(void *decoded) = 0;
|
||||||
|
|
||||||
int64_t sum = 0;
|
int64_t sum = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BENCHMARKS_CPP_BENCH_H_
|
#endif // BENCHMARKS_CPP_BENCH_H_
|
||||||
@@ -5,8 +5,8 @@
|
|||||||
#include "benchmarks/cpp/flatbuffers/fb_bench.h"
|
#include "benchmarks/cpp/flatbuffers/fb_bench.h"
|
||||||
#include "benchmarks/cpp/raw/raw_bench.h"
|
#include "benchmarks/cpp/raw/raw_bench.h"
|
||||||
|
|
||||||
static inline void Encode(benchmark::State& state,
|
static inline void Encode(benchmark::State &state,
|
||||||
std::unique_ptr<Bench>& bench, uint8_t* buffer) {
|
std::unique_ptr<Bench> &bench, uint8_t *buffer) {
|
||||||
int64_t length;
|
int64_t length;
|
||||||
for (auto _ : state) {
|
for (auto _ : state) {
|
||||||
bench->Encode(buffer, length);
|
bench->Encode(buffer, length);
|
||||||
@@ -14,33 +14,31 @@ static inline void Encode(benchmark::State& state,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void Decode(benchmark::State& state,
|
static inline void Decode(benchmark::State &state,
|
||||||
std::unique_ptr<Bench>& bench, uint8_t* buffer) {
|
std::unique_ptr<Bench> &bench, uint8_t *buffer) {
|
||||||
int64_t length;
|
int64_t length;
|
||||||
uint8_t* encoded = bench->Encode(buffer, length);
|
uint8_t *encoded = bench->Encode(buffer, length);
|
||||||
|
|
||||||
for (auto _ : state) {
|
for (auto _ : state) {
|
||||||
void* decoded = bench->Decode(encoded, length);
|
void *decoded = bench->Decode(encoded, length);
|
||||||
benchmark::DoNotOptimize(decoded);
|
benchmark::DoNotOptimize(decoded);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void Use(benchmark::State& state, std::unique_ptr<Bench>& bench,
|
static inline void Use(benchmark::State &state, std::unique_ptr<Bench> &bench,
|
||||||
uint8_t* buffer, int64_t check_sum) {
|
uint8_t *buffer, int64_t check_sum) {
|
||||||
int64_t length;
|
int64_t length;
|
||||||
uint8_t* encoded = bench->Encode(buffer, length);
|
uint8_t *encoded = bench->Encode(buffer, length);
|
||||||
void* decoded = bench->Decode(encoded, length);
|
void *decoded = bench->Decode(encoded, length);
|
||||||
|
|
||||||
int64_t sum = 0;
|
int64_t sum = 0;
|
||||||
|
|
||||||
for (auto _ : state) {
|
for (auto _ : state) { sum = bench->Use(decoded); }
|
||||||
sum = bench->Use(decoded);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPECT_EQ(sum, check_sum);
|
EXPECT_EQ(sum, check_sum);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void BM_Flatbuffers_Encode(benchmark::State& state) {
|
static void BM_Flatbuffers_Encode(benchmark::State &state) {
|
||||||
const int64_t kBufferLength = 1024;
|
const int64_t kBufferLength = 1024;
|
||||||
uint8_t buffer[kBufferLength];
|
uint8_t buffer[kBufferLength];
|
||||||
|
|
||||||
@@ -50,7 +48,7 @@ static void BM_Flatbuffers_Encode(benchmark::State& state) {
|
|||||||
}
|
}
|
||||||
BENCHMARK(BM_Flatbuffers_Encode);
|
BENCHMARK(BM_Flatbuffers_Encode);
|
||||||
|
|
||||||
static void BM_Flatbuffers_Decode(benchmark::State& state) {
|
static void BM_Flatbuffers_Decode(benchmark::State &state) {
|
||||||
const int64_t kBufferLength = 1024;
|
const int64_t kBufferLength = 1024;
|
||||||
uint8_t buffer[kBufferLength];
|
uint8_t buffer[kBufferLength];
|
||||||
|
|
||||||
@@ -60,7 +58,7 @@ static void BM_Flatbuffers_Decode(benchmark::State& state) {
|
|||||||
}
|
}
|
||||||
BENCHMARK(BM_Flatbuffers_Decode);
|
BENCHMARK(BM_Flatbuffers_Decode);
|
||||||
|
|
||||||
static void BM_Flatbuffers_Use(benchmark::State& state) {
|
static void BM_Flatbuffers_Use(benchmark::State &state) {
|
||||||
const int64_t kBufferLength = 1024;
|
const int64_t kBufferLength = 1024;
|
||||||
uint8_t buffer[kBufferLength];
|
uint8_t buffer[kBufferLength];
|
||||||
|
|
||||||
@@ -70,7 +68,7 @@ static void BM_Flatbuffers_Use(benchmark::State& state) {
|
|||||||
}
|
}
|
||||||
BENCHMARK(BM_Flatbuffers_Use);
|
BENCHMARK(BM_Flatbuffers_Use);
|
||||||
|
|
||||||
static void BM_Raw_Encode(benchmark::State& state) {
|
static void BM_Raw_Encode(benchmark::State &state) {
|
||||||
const int64_t kBufferLength = 1024;
|
const int64_t kBufferLength = 1024;
|
||||||
uint8_t buffer[kBufferLength];
|
uint8_t buffer[kBufferLength];
|
||||||
|
|
||||||
@@ -79,7 +77,7 @@ static void BM_Raw_Encode(benchmark::State& state) {
|
|||||||
}
|
}
|
||||||
BENCHMARK(BM_Raw_Encode);
|
BENCHMARK(BM_Raw_Encode);
|
||||||
|
|
||||||
static void BM_Raw_Decode(benchmark::State& state) {
|
static void BM_Raw_Decode(benchmark::State &state) {
|
||||||
const int64_t kBufferLength = 1024;
|
const int64_t kBufferLength = 1024;
|
||||||
uint8_t buffer[kBufferLength];
|
uint8_t buffer[kBufferLength];
|
||||||
|
|
||||||
@@ -88,7 +86,7 @@ static void BM_Raw_Decode(benchmark::State& state) {
|
|||||||
}
|
}
|
||||||
BENCHMARK(BM_Raw_Decode);
|
BENCHMARK(BM_Raw_Decode);
|
||||||
|
|
||||||
static void BM_Raw_Use(benchmark::State& state) {
|
static void BM_Raw_Use(benchmark::State &state) {
|
||||||
const int64_t kBufferLength = 1024;
|
const int64_t kBufferLength = 1024;
|
||||||
uint8_t buffer[kBufferLength];
|
uint8_t buffer[kBufferLength];
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// automatically generated by the FlatBuffers compiler, do not modify
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
|
|
||||||
|
|
||||||
#ifndef FLATBUFFERS_GENERATED_BENCH_BENCHMARKS_FLATBUFFERS_H_
|
#ifndef FLATBUFFERS_GENERATED_BENCH_BENCHMARKS_FLATBUFFERS_H_
|
||||||
#define FLATBUFFERS_GENERATED_BENCH_BENCHMARKS_FLATBUFFERS_H_
|
#define FLATBUFFERS_GENERATED_BENCH_BENCHMARKS_FLATBUFFERS_H_
|
||||||
|
|
||||||
@@ -7,10 +8,10 @@
|
|||||||
|
|
||||||
// Ensure the included flatbuffers.h is the same version as when this file was
|
// Ensure the included flatbuffers.h is the same version as when this file was
|
||||||
// generated, otherwise it may not be compatible.
|
// generated, otherwise it may not be compatible.
|
||||||
static_assert(FLATBUFFERS_VERSION_MAJOR == 24 &&
|
static_assert(FLATBUFFERS_VERSION_MAJOR == 2 &&
|
||||||
FLATBUFFERS_VERSION_MINOR == 12 &&
|
FLATBUFFERS_VERSION_MINOR == 0 &&
|
||||||
FLATBUFFERS_VERSION_REVISION == 23,
|
FLATBUFFERS_VERSION_REVISION == 6,
|
||||||
"Non-compatible flatbuffers version included");
|
"Non-compatible flatbuffers version included");
|
||||||
|
|
||||||
namespace benchmarks_flatbuffers {
|
namespace benchmarks_flatbuffers {
|
||||||
|
|
||||||
@@ -33,16 +34,25 @@ enum Enum : int16_t {
|
|||||||
};
|
};
|
||||||
|
|
||||||
inline const Enum (&EnumValuesEnum())[3] {
|
inline const Enum (&EnumValuesEnum())[3] {
|
||||||
static const Enum values[] = {Enum_Apples, Enum_Pears, Enum_Bananas};
|
static const Enum values[] = {
|
||||||
|
Enum_Apples,
|
||||||
|
Enum_Pears,
|
||||||
|
Enum_Bananas
|
||||||
|
};
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const char* const* EnumNamesEnum() {
|
inline const char * const *EnumNamesEnum() {
|
||||||
static const char* const names[4] = {"Apples", "Pears", "Bananas", nullptr};
|
static const char * const names[4] = {
|
||||||
|
"Apples",
|
||||||
|
"Pears",
|
||||||
|
"Bananas",
|
||||||
|
nullptr
|
||||||
|
};
|
||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const char* EnumNameEnum(Enum e) {
|
inline const char *EnumNameEnum(Enum e) {
|
||||||
if (flatbuffers::IsOutRange(e, Enum_Apples, Enum_Bananas)) return "";
|
if (flatbuffers::IsOutRange(e, Enum_Apples, Enum_Bananas)) return "";
|
||||||
const size_t index = static_cast<size_t>(e);
|
const size_t index = static_cast<size_t>(e);
|
||||||
return EnumNamesEnum()[index];
|
return EnumNamesEnum()[index];
|
||||||
@@ -57,7 +67,12 @@ FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Foo FLATBUFFERS_FINAL_CLASS {
|
|||||||
uint32_t length_;
|
uint32_t length_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Foo() : id_(0), count_(0), prefix_(0), padding0__(0), length_(0) {
|
Foo()
|
||||||
|
: id_(0),
|
||||||
|
count_(0),
|
||||||
|
prefix_(0),
|
||||||
|
padding0__(0),
|
||||||
|
length_(0) {
|
||||||
(void)padding0__;
|
(void)padding0__;
|
||||||
}
|
}
|
||||||
Foo(uint64_t _id, int16_t _count, int8_t _prefix, uint32_t _length)
|
Foo(uint64_t _id, int16_t _count, int8_t _prefix, uint32_t _length)
|
||||||
@@ -68,10 +83,18 @@ FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Foo FLATBUFFERS_FINAL_CLASS {
|
|||||||
length_(flatbuffers::EndianScalar(_length)) {
|
length_(flatbuffers::EndianScalar(_length)) {
|
||||||
(void)padding0__;
|
(void)padding0__;
|
||||||
}
|
}
|
||||||
uint64_t id() const { return flatbuffers::EndianScalar(id_); }
|
uint64_t id() const {
|
||||||
int16_t count() const { return flatbuffers::EndianScalar(count_); }
|
return flatbuffers::EndianScalar(id_);
|
||||||
int8_t prefix() const { return flatbuffers::EndianScalar(prefix_); }
|
}
|
||||||
uint32_t length() const { return flatbuffers::EndianScalar(length_); }
|
int16_t count() const {
|
||||||
|
return flatbuffers::EndianScalar(count_);
|
||||||
|
}
|
||||||
|
int8_t prefix() const {
|
||||||
|
return flatbuffers::EndianScalar(prefix_);
|
||||||
|
}
|
||||||
|
uint32_t length() const {
|
||||||
|
return flatbuffers::EndianScalar(length_);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
FLATBUFFERS_STRUCT_END(Foo, 16);
|
FLATBUFFERS_STRUCT_END(Foo, 16);
|
||||||
|
|
||||||
@@ -81,17 +104,20 @@ FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Bar FLATBUFFERS_FINAL_CLASS {
|
|||||||
int32_t time_;
|
int32_t time_;
|
||||||
float ratio_;
|
float ratio_;
|
||||||
uint16_t size_;
|
uint16_t size_;
|
||||||
int16_t padding0__;
|
int16_t padding0__; int32_t padding1__;
|
||||||
int32_t padding1__;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Bar()
|
Bar()
|
||||||
: parent_(), time_(0), ratio_(0), size_(0), padding0__(0), padding1__(0) {
|
: parent_(),
|
||||||
|
time_(0),
|
||||||
|
ratio_(0),
|
||||||
|
size_(0),
|
||||||
|
padding0__(0),
|
||||||
|
padding1__(0) {
|
||||||
(void)padding0__;
|
(void)padding0__;
|
||||||
(void)padding1__;
|
(void)padding1__;
|
||||||
}
|
}
|
||||||
Bar(const benchmarks_flatbuffers::Foo& _parent, int32_t _time, float _ratio,
|
Bar(const benchmarks_flatbuffers::Foo &_parent, int32_t _time, float _ratio, uint16_t _size)
|
||||||
uint16_t _size)
|
|
||||||
: parent_(_parent),
|
: parent_(_parent),
|
||||||
time_(flatbuffers::EndianScalar(_time)),
|
time_(flatbuffers::EndianScalar(_time)),
|
||||||
ratio_(flatbuffers::EndianScalar(_ratio)),
|
ratio_(flatbuffers::EndianScalar(_ratio)),
|
||||||
@@ -101,10 +127,18 @@ FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Bar FLATBUFFERS_FINAL_CLASS {
|
|||||||
(void)padding0__;
|
(void)padding0__;
|
||||||
(void)padding1__;
|
(void)padding1__;
|
||||||
}
|
}
|
||||||
const benchmarks_flatbuffers::Foo& parent() const { return parent_; }
|
const benchmarks_flatbuffers::Foo &parent() const {
|
||||||
int32_t time() const { return flatbuffers::EndianScalar(time_); }
|
return parent_;
|
||||||
float ratio() const { return flatbuffers::EndianScalar(ratio_); }
|
}
|
||||||
uint16_t size() const { return flatbuffers::EndianScalar(size_); }
|
int32_t time() const {
|
||||||
|
return flatbuffers::EndianScalar(time_);
|
||||||
|
}
|
||||||
|
float ratio() const {
|
||||||
|
return flatbuffers::EndianScalar(ratio_);
|
||||||
|
}
|
||||||
|
uint16_t size() const {
|
||||||
|
return flatbuffers::EndianScalar(size_);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
FLATBUFFERS_STRUCT_END(Bar, 32);
|
FLATBUFFERS_STRUCT_END(Bar, 32);
|
||||||
|
|
||||||
@@ -116,28 +150,34 @@ struct FooBar FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
|||||||
VT_RATING = 8,
|
VT_RATING = 8,
|
||||||
VT_POSTFIX = 10
|
VT_POSTFIX = 10
|
||||||
};
|
};
|
||||||
const benchmarks_flatbuffers::Bar* sibling() const {
|
const benchmarks_flatbuffers::Bar *sibling() const {
|
||||||
return GetStruct<const benchmarks_flatbuffers::Bar*>(VT_SIBLING);
|
return GetStruct<const benchmarks_flatbuffers::Bar *>(VT_SIBLING);
|
||||||
}
|
}
|
||||||
const flatbuffers::String* name() const {
|
const flatbuffers::String *name() const {
|
||||||
return GetPointer<const flatbuffers::String*>(VT_NAME);
|
return GetPointer<const flatbuffers::String *>(VT_NAME);
|
||||||
}
|
}
|
||||||
double rating() const { return GetField<double>(VT_RATING, 0.0); }
|
double rating() const {
|
||||||
uint8_t postfix() const { return GetField<uint8_t>(VT_POSTFIX, 0); }
|
return GetField<double>(VT_RATING, 0.0);
|
||||||
bool Verify(flatbuffers::Verifier& verifier) const {
|
}
|
||||||
|
uint8_t postfix() const {
|
||||||
|
return GetField<uint8_t>(VT_POSTFIX, 0);
|
||||||
|
}
|
||||||
|
bool Verify(flatbuffers::Verifier &verifier) const {
|
||||||
return VerifyTableStart(verifier) &&
|
return VerifyTableStart(verifier) &&
|
||||||
VerifyField<benchmarks_flatbuffers::Bar>(verifier, VT_SIBLING, 8) &&
|
VerifyField<benchmarks_flatbuffers::Bar>(verifier, VT_SIBLING, 8) &&
|
||||||
VerifyOffset(verifier, VT_NAME) && verifier.VerifyString(name()) &&
|
VerifyOffset(verifier, VT_NAME) &&
|
||||||
|
verifier.VerifyString(name()) &&
|
||||||
VerifyField<double>(verifier, VT_RATING, 8) &&
|
VerifyField<double>(verifier, VT_RATING, 8) &&
|
||||||
VerifyField<uint8_t>(verifier, VT_POSTFIX, 1) && verifier.EndTable();
|
VerifyField<uint8_t>(verifier, VT_POSTFIX, 1) &&
|
||||||
|
verifier.EndTable();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FooBarBuilder {
|
struct FooBarBuilder {
|
||||||
typedef FooBar Table;
|
typedef FooBar Table;
|
||||||
flatbuffers::FlatBufferBuilder& fbb_;
|
flatbuffers::FlatBufferBuilder &fbb_;
|
||||||
flatbuffers::uoffset_t start_;
|
flatbuffers::uoffset_t start_;
|
||||||
void add_sibling(const benchmarks_flatbuffers::Bar* sibling) {
|
void add_sibling(const benchmarks_flatbuffers::Bar *sibling) {
|
||||||
fbb_.AddStruct(FooBar::VT_SIBLING, sibling);
|
fbb_.AddStruct(FooBar::VT_SIBLING, sibling);
|
||||||
}
|
}
|
||||||
void add_name(flatbuffers::Offset<flatbuffers::String> name) {
|
void add_name(flatbuffers::Offset<flatbuffers::String> name) {
|
||||||
@@ -149,7 +189,8 @@ struct FooBarBuilder {
|
|||||||
void add_postfix(uint8_t postfix) {
|
void add_postfix(uint8_t postfix) {
|
||||||
fbb_.AddElement<uint8_t>(FooBar::VT_POSTFIX, postfix, 0);
|
fbb_.AddElement<uint8_t>(FooBar::VT_POSTFIX, postfix, 0);
|
||||||
}
|
}
|
||||||
explicit FooBarBuilder(flatbuffers::FlatBufferBuilder& _fbb) : fbb_(_fbb) {
|
explicit FooBarBuilder(flatbuffers::FlatBufferBuilder &_fbb)
|
||||||
|
: fbb_(_fbb) {
|
||||||
start_ = fbb_.StartTable();
|
start_ = fbb_.StartTable();
|
||||||
}
|
}
|
||||||
flatbuffers::Offset<FooBar> Finish() {
|
flatbuffers::Offset<FooBar> Finish() {
|
||||||
@@ -160,9 +201,10 @@ struct FooBarBuilder {
|
|||||||
};
|
};
|
||||||
|
|
||||||
inline flatbuffers::Offset<FooBar> CreateFooBar(
|
inline flatbuffers::Offset<FooBar> CreateFooBar(
|
||||||
flatbuffers::FlatBufferBuilder& _fbb,
|
flatbuffers::FlatBufferBuilder &_fbb,
|
||||||
const benchmarks_flatbuffers::Bar* sibling = nullptr,
|
const benchmarks_flatbuffers::Bar *sibling = nullptr,
|
||||||
flatbuffers::Offset<flatbuffers::String> name = 0, double rating = 0.0,
|
flatbuffers::Offset<flatbuffers::String> name = 0,
|
||||||
|
double rating = 0.0,
|
||||||
uint8_t postfix = 0) {
|
uint8_t postfix = 0) {
|
||||||
FooBarBuilder builder_(_fbb);
|
FooBarBuilder builder_(_fbb);
|
||||||
builder_.add_rating(rating);
|
builder_.add_rating(rating);
|
||||||
@@ -173,12 +215,18 @@ inline flatbuffers::Offset<FooBar> CreateFooBar(
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline flatbuffers::Offset<FooBar> CreateFooBarDirect(
|
inline flatbuffers::Offset<FooBar> CreateFooBarDirect(
|
||||||
flatbuffers::FlatBufferBuilder& _fbb,
|
flatbuffers::FlatBufferBuilder &_fbb,
|
||||||
const benchmarks_flatbuffers::Bar* sibling = nullptr,
|
const benchmarks_flatbuffers::Bar *sibling = nullptr,
|
||||||
const char* name = nullptr, double rating = 0.0, uint8_t postfix = 0) {
|
const char *name = nullptr,
|
||||||
|
double rating = 0.0,
|
||||||
|
uint8_t postfix = 0) {
|
||||||
auto name__ = name ? _fbb.CreateString(name) : 0;
|
auto name__ = name ? _fbb.CreateString(name) : 0;
|
||||||
return benchmarks_flatbuffers::CreateFooBar(_fbb, sibling, name__, rating,
|
return benchmarks_flatbuffers::CreateFooBar(
|
||||||
postfix);
|
_fbb,
|
||||||
|
sibling,
|
||||||
|
name__,
|
||||||
|
rating,
|
||||||
|
postfix);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct FooBarContainer FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
struct FooBarContainer FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
||||||
@@ -189,53 +237,49 @@ struct FooBarContainer FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
|
|||||||
VT_FRUIT = 8,
|
VT_FRUIT = 8,
|
||||||
VT_LOCATION = 10
|
VT_LOCATION = 10
|
||||||
};
|
};
|
||||||
const flatbuffers::Vector<
|
const flatbuffers::Vector<flatbuffers::Offset<benchmarks_flatbuffers::FooBar>> *list() const {
|
||||||
flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>*
|
return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<benchmarks_flatbuffers::FooBar>> *>(VT_LIST);
|
||||||
list() const {
|
}
|
||||||
return GetPointer<const flatbuffers::Vector<
|
bool initialized() const {
|
||||||
flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>*>(VT_LIST);
|
return GetField<uint8_t>(VT_INITIALIZED, 0) != 0;
|
||||||
}
|
}
|
||||||
bool initialized() const { return GetField<uint8_t>(VT_INITIALIZED, 0) != 0; }
|
|
||||||
benchmarks_flatbuffers::Enum fruit() const {
|
benchmarks_flatbuffers::Enum fruit() const {
|
||||||
return static_cast<benchmarks_flatbuffers::Enum>(
|
return static_cast<benchmarks_flatbuffers::Enum>(GetField<int16_t>(VT_FRUIT, 0));
|
||||||
GetField<int16_t>(VT_FRUIT, 0));
|
|
||||||
}
|
}
|
||||||
const flatbuffers::String* location() const {
|
const flatbuffers::String *location() const {
|
||||||
return GetPointer<const flatbuffers::String*>(VT_LOCATION);
|
return GetPointer<const flatbuffers::String *>(VT_LOCATION);
|
||||||
}
|
}
|
||||||
bool Verify(flatbuffers::Verifier& verifier) const {
|
bool Verify(flatbuffers::Verifier &verifier) const {
|
||||||
return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_LIST) &&
|
return VerifyTableStart(verifier) &&
|
||||||
|
VerifyOffset(verifier, VT_LIST) &&
|
||||||
verifier.VerifyVector(list()) &&
|
verifier.VerifyVector(list()) &&
|
||||||
verifier.VerifyVectorOfTables(list()) &&
|
verifier.VerifyVectorOfTables(list()) &&
|
||||||
VerifyField<uint8_t>(verifier, VT_INITIALIZED, 1) &&
|
VerifyField<uint8_t>(verifier, VT_INITIALIZED, 1) &&
|
||||||
VerifyField<int16_t>(verifier, VT_FRUIT, 2) &&
|
VerifyField<int16_t>(verifier, VT_FRUIT, 2) &&
|
||||||
VerifyOffset(verifier, VT_LOCATION) &&
|
VerifyOffset(verifier, VT_LOCATION) &&
|
||||||
verifier.VerifyString(location()) && verifier.EndTable();
|
verifier.VerifyString(location()) &&
|
||||||
|
verifier.EndTable();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FooBarContainerBuilder {
|
struct FooBarContainerBuilder {
|
||||||
typedef FooBarContainer Table;
|
typedef FooBarContainer Table;
|
||||||
flatbuffers::FlatBufferBuilder& fbb_;
|
flatbuffers::FlatBufferBuilder &fbb_;
|
||||||
flatbuffers::uoffset_t start_;
|
flatbuffers::uoffset_t start_;
|
||||||
void add_list(flatbuffers::Offset<flatbuffers::Vector<
|
void add_list(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>> list) {
|
||||||
flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>>
|
|
||||||
list) {
|
|
||||||
fbb_.AddOffset(FooBarContainer::VT_LIST, list);
|
fbb_.AddOffset(FooBarContainer::VT_LIST, list);
|
||||||
}
|
}
|
||||||
void add_initialized(bool initialized) {
|
void add_initialized(bool initialized) {
|
||||||
fbb_.AddElement<uint8_t>(FooBarContainer::VT_INITIALIZED,
|
fbb_.AddElement<uint8_t>(FooBarContainer::VT_INITIALIZED, static_cast<uint8_t>(initialized), 0);
|
||||||
static_cast<uint8_t>(initialized), 0);
|
|
||||||
}
|
}
|
||||||
void add_fruit(benchmarks_flatbuffers::Enum fruit) {
|
void add_fruit(benchmarks_flatbuffers::Enum fruit) {
|
||||||
fbb_.AddElement<int16_t>(FooBarContainer::VT_FRUIT,
|
fbb_.AddElement<int16_t>(FooBarContainer::VT_FRUIT, static_cast<int16_t>(fruit), 0);
|
||||||
static_cast<int16_t>(fruit), 0);
|
|
||||||
}
|
}
|
||||||
void add_location(flatbuffers::Offset<flatbuffers::String> location) {
|
void add_location(flatbuffers::Offset<flatbuffers::String> location) {
|
||||||
fbb_.AddOffset(FooBarContainer::VT_LOCATION, location);
|
fbb_.AddOffset(FooBarContainer::VT_LOCATION, location);
|
||||||
}
|
}
|
||||||
explicit FooBarContainerBuilder(flatbuffers::FlatBufferBuilder& _fbb)
|
explicit FooBarContainerBuilder(flatbuffers::FlatBufferBuilder &_fbb)
|
||||||
: fbb_(_fbb) {
|
: fbb_(_fbb) {
|
||||||
start_ = fbb_.StartTable();
|
start_ = fbb_.StartTable();
|
||||||
}
|
}
|
||||||
flatbuffers::Offset<FooBarContainer> Finish() {
|
flatbuffers::Offset<FooBarContainer> Finish() {
|
||||||
@@ -246,10 +290,8 @@ struct FooBarContainerBuilder {
|
|||||||
};
|
};
|
||||||
|
|
||||||
inline flatbuffers::Offset<FooBarContainer> CreateFooBarContainer(
|
inline flatbuffers::Offset<FooBarContainer> CreateFooBarContainer(
|
||||||
flatbuffers::FlatBufferBuilder& _fbb,
|
flatbuffers::FlatBufferBuilder &_fbb,
|
||||||
flatbuffers::Offset<flatbuffers::Vector<
|
flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>> list = 0,
|
||||||
flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>>
|
|
||||||
list = 0,
|
|
||||||
bool initialized = false,
|
bool initialized = false,
|
||||||
benchmarks_flatbuffers::Enum fruit = benchmarks_flatbuffers::Enum_Apples,
|
benchmarks_flatbuffers::Enum fruit = benchmarks_flatbuffers::Enum_Apples,
|
||||||
flatbuffers::Offset<flatbuffers::String> location = 0) {
|
flatbuffers::Offset<flatbuffers::String> location = 0) {
|
||||||
@@ -262,52 +304,47 @@ inline flatbuffers::Offset<FooBarContainer> CreateFooBarContainer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline flatbuffers::Offset<FooBarContainer> CreateFooBarContainerDirect(
|
inline flatbuffers::Offset<FooBarContainer> CreateFooBarContainerDirect(
|
||||||
flatbuffers::FlatBufferBuilder& _fbb,
|
flatbuffers::FlatBufferBuilder &_fbb,
|
||||||
const std::vector<flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>*
|
const std::vector<flatbuffers::Offset<benchmarks_flatbuffers::FooBar>> *list = nullptr,
|
||||||
list = nullptr,
|
|
||||||
bool initialized = false,
|
bool initialized = false,
|
||||||
benchmarks_flatbuffers::Enum fruit = benchmarks_flatbuffers::Enum_Apples,
|
benchmarks_flatbuffers::Enum fruit = benchmarks_flatbuffers::Enum_Apples,
|
||||||
const char* location = nullptr) {
|
const char *location = nullptr) {
|
||||||
auto list__ =
|
auto list__ = list ? _fbb.CreateVector<flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>(*list) : 0;
|
||||||
list ? _fbb.CreateVector<
|
|
||||||
flatbuffers::Offset<benchmarks_flatbuffers::FooBar>>(*list)
|
|
||||||
: 0;
|
|
||||||
auto location__ = location ? _fbb.CreateString(location) : 0;
|
auto location__ = location ? _fbb.CreateString(location) : 0;
|
||||||
return benchmarks_flatbuffers::CreateFooBarContainer(
|
return benchmarks_flatbuffers::CreateFooBarContainer(
|
||||||
_fbb, list__, initialized, fruit, location__);
|
_fbb,
|
||||||
|
list__,
|
||||||
|
initialized,
|
||||||
|
fruit,
|
||||||
|
location__);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const benchmarks_flatbuffers::FooBarContainer* GetFooBarContainer(
|
inline const benchmarks_flatbuffers::FooBarContainer *GetFooBarContainer(const void *buf) {
|
||||||
const void* buf) {
|
|
||||||
return flatbuffers::GetRoot<benchmarks_flatbuffers::FooBarContainer>(buf);
|
return flatbuffers::GetRoot<benchmarks_flatbuffers::FooBarContainer>(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const benchmarks_flatbuffers::FooBarContainer*
|
inline const benchmarks_flatbuffers::FooBarContainer *GetSizePrefixedFooBarContainer(const void *buf) {
|
||||||
GetSizePrefixedFooBarContainer(const void* buf) {
|
return flatbuffers::GetSizePrefixedRoot<benchmarks_flatbuffers::FooBarContainer>(buf);
|
||||||
return flatbuffers::GetSizePrefixedRoot<
|
|
||||||
benchmarks_flatbuffers::FooBarContainer>(buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool VerifyFooBarContainerBuffer(flatbuffers::Verifier& verifier) {
|
inline bool VerifyFooBarContainerBuffer(
|
||||||
return verifier.VerifyBuffer<benchmarks_flatbuffers::FooBarContainer>(
|
flatbuffers::Verifier &verifier) {
|
||||||
nullptr);
|
return verifier.VerifyBuffer<benchmarks_flatbuffers::FooBarContainer>(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool VerifySizePrefixedFooBarContainerBuffer(
|
inline bool VerifySizePrefixedFooBarContainerBuffer(
|
||||||
flatbuffers::Verifier& verifier) {
|
flatbuffers::Verifier &verifier) {
|
||||||
return verifier
|
return verifier.VerifySizePrefixedBuffer<benchmarks_flatbuffers::FooBarContainer>(nullptr);
|
||||||
.VerifySizePrefixedBuffer<benchmarks_flatbuffers::FooBarContainer>(
|
|
||||||
nullptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void FinishFooBarContainerBuffer(
|
inline void FinishFooBarContainerBuffer(
|
||||||
flatbuffers::FlatBufferBuilder& fbb,
|
flatbuffers::FlatBufferBuilder &fbb,
|
||||||
flatbuffers::Offset<benchmarks_flatbuffers::FooBarContainer> root) {
|
flatbuffers::Offset<benchmarks_flatbuffers::FooBarContainer> root) {
|
||||||
fbb.Finish(root);
|
fbb.Finish(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void FinishSizePrefixedFooBarContainerBuffer(
|
inline void FinishSizePrefixedFooBarContainerBuffer(
|
||||||
flatbuffers::FlatBufferBuilder& fbb,
|
flatbuffers::FlatBufferBuilder &fbb,
|
||||||
flatbuffers::Offset<benchmarks_flatbuffers::FooBarContainer> root) {
|
flatbuffers::Offset<benchmarks_flatbuffers::FooBarContainer> root) {
|
||||||
fbb.FinishSizePrefixed(root);
|
fbb.FinishSizePrefixed(root);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ using namespace benchmarks_flatbuffers;
|
|||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
struct FlatBufferBench : Bench {
|
struct FlatBufferBench : Bench {
|
||||||
explicit FlatBufferBench(int64_t initial_size, Allocator* allocator)
|
explicit FlatBufferBench(int64_t initial_size, Allocator *allocator)
|
||||||
: fbb(initial_size, allocator, false) {}
|
: fbb(initial_size, allocator, false) {}
|
||||||
|
|
||||||
uint8_t* Encode(void*, int64_t& len) override {
|
uint8_t *Encode(void *, int64_t &len) override {
|
||||||
fbb.Clear();
|
fbb.Clear();
|
||||||
|
|
||||||
const int kVectorLength = 3;
|
const int kVectorLength = 3;
|
||||||
@@ -40,7 +40,7 @@ struct FlatBufferBench : Bench {
|
|||||||
return fbb.GetBufferPointer();
|
return fbb.GetBufferPointer();
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t Use(void* decoded) override {
|
int64_t Use(void *decoded) override {
|
||||||
sum = 0;
|
sum = 0;
|
||||||
auto foobarcontainer = GetFooBarContainer(decoded);
|
auto foobarcontainer = GetFooBarContainer(decoded);
|
||||||
sum = 0;
|
sum = 0;
|
||||||
@@ -56,7 +56,7 @@ struct FlatBufferBench : Bench {
|
|||||||
Add(static_cast<int64_t>(bar->ratio()));
|
Add(static_cast<int64_t>(bar->ratio()));
|
||||||
Add(bar->size());
|
Add(bar->size());
|
||||||
Add(bar->time());
|
Add(bar->time());
|
||||||
auto& foo = bar->parent();
|
auto &foo = bar->parent();
|
||||||
Add(foo.count());
|
Add(foo.count());
|
||||||
Add(foo.id());
|
Add(foo.id());
|
||||||
Add(foo.length());
|
Add(foo.length());
|
||||||
@@ -65,8 +65,8 @@ struct FlatBufferBench : Bench {
|
|||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* Decode(void* buffer, int64_t) override { return buffer; }
|
void *Decode(void *buffer, int64_t) override { return buffer; }
|
||||||
void Dealloc(void*) override {};
|
void Dealloc(void *) override {};
|
||||||
|
|
||||||
FlatBufferBuilder fbb;
|
FlatBufferBuilder fbb;
|
||||||
};
|
};
|
||||||
@@ -74,7 +74,7 @@ struct FlatBufferBench : Bench {
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
std::unique_ptr<Bench> NewFlatBuffersBench(int64_t initial_size,
|
std::unique_ptr<Bench> NewFlatBuffersBench(int64_t initial_size,
|
||||||
Allocator* allocator) {
|
Allocator *allocator) {
|
||||||
return std::unique_ptr<FlatBufferBench>(
|
return std::unique_ptr<FlatBufferBench>(
|
||||||
new FlatBufferBench(initial_size, allocator));
|
new FlatBufferBench(initial_size, allocator));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,16 +8,16 @@
|
|||||||
#include "include/flatbuffers/flatbuffers.h"
|
#include "include/flatbuffers/flatbuffers.h"
|
||||||
|
|
||||||
struct StaticAllocator : public flatbuffers::Allocator {
|
struct StaticAllocator : public flatbuffers::Allocator {
|
||||||
explicit StaticAllocator(uint8_t* buffer) : buffer_(buffer) {}
|
explicit StaticAllocator(uint8_t *buffer) : buffer_(buffer) {}
|
||||||
|
|
||||||
uint8_t* allocate(size_t) override { return buffer_; }
|
uint8_t *allocate(size_t) override { return buffer_; }
|
||||||
|
|
||||||
void deallocate(uint8_t*, size_t) override {}
|
void deallocate(uint8_t *, size_t) override {}
|
||||||
|
|
||||||
uint8_t* buffer_;
|
uint8_t *buffer_;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unique_ptr<Bench> NewFlatBuffersBench(
|
std::unique_ptr<Bench> NewFlatBuffersBench(
|
||||||
int64_t initial_size = 1024, flatbuffers::Allocator* allocator = nullptr);
|
int64_t initial_size = 1024, flatbuffers::Allocator *allocator = nullptr);
|
||||||
|
|
||||||
#endif // BENCHMARKS_CPP_FLATBUFFERS_FB_BENCH_H_
|
#endif // BENCHMARKS_CPP_FLATBUFFERS_FB_BENCH_H_
|
||||||
@@ -45,8 +45,8 @@ struct FooBarContainer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct RawBench : Bench {
|
struct RawBench : Bench {
|
||||||
uint8_t* Encode(void* buf, int64_t& len) override {
|
uint8_t *Encode(void *buf, int64_t &len) override {
|
||||||
FooBarContainer* fbc = new (buf) FooBarContainer;
|
FooBarContainer *fbc = new (buf) FooBarContainer;
|
||||||
strcpy(fbc->location, "http://google.com/flatbuffers/"); // Unsafe eek!
|
strcpy(fbc->location, "http://google.com/flatbuffers/"); // Unsafe eek!
|
||||||
fbc->location_len = (int)strlen(fbc->location);
|
fbc->location_len = (int)strlen(fbc->location);
|
||||||
fbc->fruit = Bananas;
|
fbc->fruit = Bananas;
|
||||||
@@ -54,16 +54,16 @@ struct RawBench : Bench {
|
|||||||
for (int i = 0; i < kVectorLength; i++) {
|
for (int i = 0; i < kVectorLength; i++) {
|
||||||
// We add + i to not make these identical copies for a more realistic
|
// We add + i to not make these identical copies for a more realistic
|
||||||
// compression test.
|
// compression test.
|
||||||
auto& foobar = fbc->list[i];
|
auto &foobar = fbc->list[i];
|
||||||
foobar.rating = 3.1415432432445543543 + i;
|
foobar.rating = 3.1415432432445543543 + i;
|
||||||
foobar.postfix = '!' + i;
|
foobar.postfix = '!' + i;
|
||||||
strcpy(foobar.name, "Hello, World!");
|
strcpy(foobar.name, "Hello, World!");
|
||||||
foobar.name_len = (int)strlen(foobar.name);
|
foobar.name_len = (int)strlen(foobar.name);
|
||||||
auto& bar = foobar.sibling;
|
auto &bar = foobar.sibling;
|
||||||
bar.ratio = 3.14159f + i;
|
bar.ratio = 3.14159f + i;
|
||||||
bar.size = 10000 + i;
|
bar.size = 10000 + i;
|
||||||
bar.time = 123456 + i;
|
bar.time = 123456 + i;
|
||||||
auto& foo = bar.parent;
|
auto &foo = bar.parent;
|
||||||
foo.id = 0xABADCAFEABADCAFE + i;
|
foo.id = 0xABADCAFEABADCAFE + i;
|
||||||
foo.count = 10000 + i;
|
foo.count = 10000 + i;
|
||||||
foo.length = 1000000 + i;
|
foo.length = 1000000 + i;
|
||||||
@@ -71,11 +71,11 @@ struct RawBench : Bench {
|
|||||||
}
|
}
|
||||||
|
|
||||||
len = sizeof(FooBarContainer);
|
len = sizeof(FooBarContainer);
|
||||||
return reinterpret_cast<uint8_t*>(fbc);
|
return reinterpret_cast<uint8_t *>(fbc);
|
||||||
};
|
};
|
||||||
|
|
||||||
int64_t Use(void* decoded) override {
|
int64_t Use(void *decoded) override {
|
||||||
auto foobarcontainer = reinterpret_cast<FooBarContainer*>(decoded);
|
auto foobarcontainer = reinterpret_cast<FooBarContainer *>(decoded);
|
||||||
sum = 0;
|
sum = 0;
|
||||||
Add(foobarcontainer->initialized);
|
Add(foobarcontainer->initialized);
|
||||||
Add(foobarcontainer->location_len);
|
Add(foobarcontainer->location_len);
|
||||||
@@ -89,7 +89,7 @@ struct RawBench : Bench {
|
|||||||
Add(static_cast<int64_t>(bar->ratio));
|
Add(static_cast<int64_t>(bar->ratio));
|
||||||
Add(bar->size);
|
Add(bar->size);
|
||||||
Add(bar->time);
|
Add(bar->time);
|
||||||
auto& foo = bar->parent;
|
auto &foo = bar->parent;
|
||||||
Add(foo.count);
|
Add(foo.count);
|
||||||
Add(foo.id);
|
Add(foo.id);
|
||||||
Add(foo.length);
|
Add(foo.length);
|
||||||
@@ -98,8 +98,8 @@ struct RawBench : Bench {
|
|||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* Decode(void* buf, int64_t) override { return buf; }
|
void *Decode(void *buf, int64_t) override { return buf; }
|
||||||
void Dealloc(void*) override {};
|
void Dealloc(void *) override{};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2024 Google Inc. All rights reserved.
|
* Copyright 2023 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");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -15,8 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import Benchmark
|
import Benchmark
|
||||||
|
import CoreFoundation
|
||||||
import FlatBuffers
|
import FlatBuffers
|
||||||
import Foundation
|
|
||||||
|
|
||||||
@usableFromInline
|
@usableFromInline
|
||||||
struct AA: NativeStruct {
|
struct AA: NativeStruct {
|
||||||
@@ -29,15 +29,6 @@ struct AA: NativeStruct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let benchmarks = {
|
let benchmarks = {
|
||||||
let oneGB: Int32 = 1_024_000_000
|
|
||||||
let data = {
|
|
||||||
var array = [8888.88, 8888.88]
|
|
||||||
var data = Data()
|
|
||||||
array.withUnsafeBytes { ptr in
|
|
||||||
data.append(contentsOf: ptr)
|
|
||||||
}
|
|
||||||
return data
|
|
||||||
}()
|
|
||||||
let ints: [Int] = Array(repeating: 42, count: 100)
|
let ints: [Int] = Array(repeating: 42, count: 100)
|
||||||
let bytes: [UInt8] = Array(repeating: 42, count: 100)
|
let bytes: [UInt8] = Array(repeating: 42, count: 100)
|
||||||
let str10 = (0...9).map { _ -> String in "x" }.joined()
|
let str10 = (0...9).map { _ -> String in "x" }.joined()
|
||||||
@@ -82,25 +73,12 @@ let benchmarks = {
|
|||||||
|
|
||||||
Benchmark("Allocating 1GB", configuration: singleConfiguration) { benchmark in
|
Benchmark("Allocating 1GB", configuration: singleConfiguration) { benchmark in
|
||||||
for _ in benchmark.scaledIterations {
|
for _ in benchmark.scaledIterations {
|
||||||
blackHole(FlatBufferBuilder(initialSize: oneGB))
|
blackHole(FlatBufferBuilder(initialSize: 1_024_000_000))
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Benchmark(
|
|
||||||
"Allocating ByteBuffer 1GB",
|
|
||||||
configuration: singleConfiguration)
|
|
||||||
{ benchmark in
|
|
||||||
let memory = UnsafeMutableRawPointer.allocate(
|
|
||||||
byteCount: 1_024_000_000,
|
|
||||||
alignment: 1)
|
|
||||||
benchmark.startMeasurement()
|
|
||||||
for _ in benchmark.scaledIterations {
|
|
||||||
blackHole(ByteBuffer(assumingMemoryBound: memory, capacity: Int(oneGB)))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Benchmark("Clearing 1GB", configuration: singleConfiguration) { benchmark in
|
Benchmark("Clearing 1GB", configuration: singleConfiguration) { benchmark in
|
||||||
var fb = FlatBufferBuilder(initialSize: oneGB)
|
var fb = FlatBufferBuilder(initialSize: 1_024_000_000)
|
||||||
benchmark.startMeasurement()
|
benchmark.startMeasurement()
|
||||||
for _ in benchmark.scaledIterations {
|
for _ in benchmark.scaledIterations {
|
||||||
blackHole(fb.clear())
|
blackHole(fb.clear())
|
||||||
@@ -108,7 +86,7 @@ let benchmarks = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Benchmark("Strings 10") { benchmark in
|
Benchmark("Strings 10") { benchmark in
|
||||||
var fb = FlatBufferBuilder(initialSize: 1 << 20)
|
var fb = FlatBufferBuilder(initialSize: 1<<20)
|
||||||
benchmark.startMeasurement()
|
benchmark.startMeasurement()
|
||||||
for _ in benchmark.scaledIterations {
|
for _ in benchmark.scaledIterations {
|
||||||
blackHole(fb.create(string: str10))
|
blackHole(fb.create(string: str10))
|
||||||
@@ -116,7 +94,7 @@ let benchmarks = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Benchmark("Strings 100") { benchmark in
|
Benchmark("Strings 100") { benchmark in
|
||||||
var fb = FlatBufferBuilder(initialSize: 1 << 20)
|
var fb = FlatBufferBuilder(initialSize: 1<<20)
|
||||||
benchmark.startMeasurement()
|
benchmark.startMeasurement()
|
||||||
for _ in benchmark.scaledIterations {
|
for _ in benchmark.scaledIterations {
|
||||||
blackHole(fb.create(string: str100))
|
blackHole(fb.create(string: str100))
|
||||||
@@ -124,7 +102,7 @@ let benchmarks = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Benchmark("Vector 1 Bytes") { benchmark in
|
Benchmark("Vector 1 Bytes") { benchmark in
|
||||||
var fb = FlatBufferBuilder(initialSize: 1 << 20)
|
var fb = FlatBufferBuilder(initialSize: 1<<20)
|
||||||
benchmark.startMeasurement()
|
benchmark.startMeasurement()
|
||||||
for _ in benchmark.scaledIterations {
|
for _ in benchmark.scaledIterations {
|
||||||
blackHole(fb.createVector(bytes: bytes))
|
blackHole(fb.createVector(bytes: bytes))
|
||||||
@@ -132,7 +110,7 @@ let benchmarks = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Benchmark("Vector 1 Ints") { benchmark in
|
Benchmark("Vector 1 Ints") { benchmark in
|
||||||
var fb = FlatBufferBuilder(initialSize: 1 << 20)
|
var fb = FlatBufferBuilder(initialSize: 1<<20)
|
||||||
benchmark.startMeasurement()
|
benchmark.startMeasurement()
|
||||||
for _ in benchmark.scaledIterations {
|
for _ in benchmark.scaledIterations {
|
||||||
blackHole(fb.createVector(ints))
|
blackHole(fb.createVector(ints))
|
||||||
@@ -140,7 +118,7 @@ let benchmarks = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Benchmark("Vector 100 Ints") { benchmark in
|
Benchmark("Vector 100 Ints") { benchmark in
|
||||||
var fb = FlatBufferBuilder(initialSize: 1 << 20)
|
var fb = FlatBufferBuilder(initialSize: 1<<20)
|
||||||
benchmark.startMeasurement()
|
benchmark.startMeasurement()
|
||||||
for i in benchmark.scaledIterations {
|
for i in benchmark.scaledIterations {
|
||||||
blackHole(fb.createVector(ints))
|
blackHole(fb.createVector(ints))
|
||||||
@@ -148,7 +126,7 @@ let benchmarks = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Benchmark("Vector 100 Bytes") { benchmark in
|
Benchmark("Vector 100 Bytes") { benchmark in
|
||||||
var fb = FlatBufferBuilder(initialSize: 1 << 20)
|
var fb = FlatBufferBuilder(initialSize: 1<<20)
|
||||||
benchmark.startMeasurement()
|
benchmark.startMeasurement()
|
||||||
for i in benchmark.scaledIterations {
|
for i in benchmark.scaledIterations {
|
||||||
blackHole(fb.createVector(bytes))
|
blackHole(fb.createVector(bytes))
|
||||||
@@ -156,7 +134,7 @@ let benchmarks = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Benchmark("Vector 100 ContiguousBytes") { benchmark in
|
Benchmark("Vector 100 ContiguousBytes") { benchmark in
|
||||||
var fb = FlatBufferBuilder(initialSize: 1 << 20)
|
var fb = FlatBufferBuilder(initialSize: 1<<20)
|
||||||
benchmark.startMeasurement()
|
benchmark.startMeasurement()
|
||||||
for i in benchmark.scaledIterations {
|
for i in benchmark.scaledIterations {
|
||||||
blackHole(fb.createVector(bytes: bytes))
|
blackHole(fb.createVector(bytes: bytes))
|
||||||
@@ -180,26 +158,6 @@ let benchmarks = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Benchmark(
|
|
||||||
"FlatBufferBuilder Start table",
|
|
||||||
configuration: kiloConfiguration)
|
|
||||||
{ benchmark in
|
|
||||||
var fb = FlatBufferBuilder(initialSize: 1024 * 1024 * 32)
|
|
||||||
benchmark.startMeasurement()
|
|
||||||
for _ in benchmark.scaledIterations {
|
|
||||||
let s = fb.startTable(with: 4)
|
|
||||||
blackHole(fb.endTable(at: s))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Benchmark("Struct") { benchmark in
|
|
||||||
var fb = FlatBufferBuilder(initialSize: 1024 * 1024 * 32)
|
|
||||||
benchmark.startMeasurement()
|
|
||||||
for _ in benchmark.scaledIterations {
|
|
||||||
blackHole(fb.create(struct: array.first!))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Benchmark("Structs") { benchmark in
|
Benchmark("Structs") { benchmark in
|
||||||
let rawSize = ((16 * 5) * benchmark.scaledIterations.count) / 1024
|
let rawSize = ((16 * 5) * benchmark.scaledIterations.count) / 1024
|
||||||
var fb = FlatBufferBuilder(initialSize: Int32(rawSize * 1600))
|
var fb = FlatBufferBuilder(initialSize: Int32(rawSize * 1600))
|
||||||
@@ -218,33 +176,6 @@ let benchmarks = {
|
|||||||
let start = fb.startTable(with: 1)
|
let start = fb.startTable(with: 1)
|
||||||
fb.add(offset: vector, at: 4)
|
fb.add(offset: vector, at: 4)
|
||||||
let root = Offset(offset: fb.endTable(at: start))
|
let root = Offset(offset: fb.endTable(at: start))
|
||||||
blackHole(fb.finish(offset: root))
|
fb.finish(offset: root)
|
||||||
}
|
|
||||||
|
|
||||||
Benchmark("Vector of Offsets") { benchmark in
|
|
||||||
let rawSize = ((16 * 5) * benchmark.scaledIterations.count) / 1024
|
|
||||||
var fb = FlatBufferBuilder(initialSize: Int32(rawSize * 1600))
|
|
||||||
benchmark.startMeasurement()
|
|
||||||
for _ in benchmark.scaledIterations {
|
|
||||||
let offsets = [
|
|
||||||
fb.create(string: "T"),
|
|
||||||
fb.create(string: "2"),
|
|
||||||
fb.create(string: "3"),
|
|
||||||
]
|
|
||||||
let off = fb.createVector(ofOffsets: [
|
|
||||||
fb.createVector(ofOffsets: offsets),
|
|
||||||
fb.createVector(ofOffsets: offsets),
|
|
||||||
])
|
|
||||||
let s = fb.startTable(with: 2)
|
|
||||||
fb.add(offset: off, at: 2)
|
|
||||||
blackHole(fb.endTable(at: s))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Benchmark("Reading Doubles") { benchmark in
|
|
||||||
let byteBuffer = ByteBuffer(data: data)
|
|
||||||
for _ in benchmark.scaledIterations {
|
|
||||||
blackHole(byteBuffer.read(def: Double.self, position: 0))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// swift-tools-version:5.10
|
// swift-tools-version:5.8
|
||||||
/*
|
/*
|
||||||
* Copyright 2020 Google Inc. All rights reserved.
|
* Copyright 2020 Google Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -26,7 +26,7 @@ let package = Package(
|
|||||||
.package(path: "../.."),
|
.package(path: "../.."),
|
||||||
.package(
|
.package(
|
||||||
url: "https://github.com/ordo-one/package-benchmark",
|
url: "https://github.com/ordo-one/package-benchmark",
|
||||||
from: "1.27.0"),
|
from: "1.12.0"),
|
||||||
],
|
],
|
||||||
targets: [
|
targets: [
|
||||||
.executableTarget(
|
.executableTarget(
|
||||||
|
|||||||
@@ -6,4 +6,4 @@ To open the benchmarks in xcode use:
|
|||||||
|
|
||||||
or running them directly within terminal using:
|
or running them directly within terminal using:
|
||||||
|
|
||||||
`swift package benchmark`
|
`swift package benchmark`
|
||||||
@@ -7,13 +7,13 @@ Rules for building C++ flatbuffers with Bazel.
|
|||||||
|
|
||||||
load("@rules_cc//cc:defs.bzl", "cc_library")
|
load("@rules_cc//cc:defs.bzl", "cc_library")
|
||||||
|
|
||||||
TRUE_FLATC_PATH = Label("//:flatc")
|
TRUE_FLATC_PATH = "@com_github_google_flatbuffers//:flatc"
|
||||||
|
|
||||||
DEFAULT_INCLUDE_PATHS = [
|
DEFAULT_INCLUDE_PATHS = [
|
||||||
"./",
|
"./",
|
||||||
"$(GENDIR)",
|
"$(GENDIR)",
|
||||||
"$(BINDIR)",
|
"$(BINDIR)",
|
||||||
"$(execpath %s).runfiles/%s" % (TRUE_FLATC_PATH, TRUE_FLATC_PATH.repo_name),
|
"$(execpath @com_github_google_flatbuffers//:flatc).runfiles/com_github_google_flatbuffers",
|
||||||
]
|
]
|
||||||
|
|
||||||
def default_include_paths(flatc_path):
|
def default_include_paths(flatc_path):
|
||||||
@@ -21,7 +21,7 @@ def default_include_paths(flatc_path):
|
|||||||
"./",
|
"./",
|
||||||
"$(GENDIR)",
|
"$(GENDIR)",
|
||||||
"$(BINDIR)",
|
"$(BINDIR)",
|
||||||
"$(execpath %s).runfiles/%s" % (flatc_path, flatc_path.repo_name),
|
"$(execpath %s).runfiles/com_github_google_flatbuffers" % (flatc_path),
|
||||||
]
|
]
|
||||||
|
|
||||||
DEFAULT_FLATC_ARGS = [
|
DEFAULT_FLATC_ARGS = [
|
||||||
@@ -47,7 +47,7 @@ def flatbuffer_library_public(
|
|||||||
compatible_with = None,
|
compatible_with = None,
|
||||||
restricted_to = None,
|
restricted_to = None,
|
||||||
target_compatible_with = None,
|
target_compatible_with = None,
|
||||||
flatc_path = None,
|
flatc_path = "@com_github_google_flatbuffers//:flatc",
|
||||||
output_to_bindir = False,
|
output_to_bindir = False,
|
||||||
tools = None,
|
tools = None,
|
||||||
extra_env = None,
|
extra_env = None,
|
||||||
@@ -87,11 +87,6 @@ def flatbuffer_library_public(
|
|||||||
optionally a Fileset([reflection_name]) with all generated reflection
|
optionally a Fileset([reflection_name]) with all generated reflection
|
||||||
binaries.
|
binaries.
|
||||||
"""
|
"""
|
||||||
if flatc_path == None:
|
|
||||||
flatc_path = TRUE_FLATC_PATH
|
|
||||||
else:
|
|
||||||
flatc_path = native.package_relative_label(flatc_path)
|
|
||||||
|
|
||||||
reflection_include_paths = include_paths
|
reflection_include_paths = include_paths
|
||||||
if include_paths == None:
|
if include_paths == None:
|
||||||
include_paths = default_include_paths(flatc_path)
|
include_paths = default_include_paths(flatc_path)
|
||||||
@@ -136,8 +131,6 @@ def flatbuffer_library_public(
|
|||||||
reflection_genrule_cmd = " ".join([
|
reflection_genrule_cmd = " ".join([
|
||||||
"SRCS=($(SRCS));",
|
"SRCS=($(SRCS));",
|
||||||
"for f in $${SRCS[@]:0:%s}; do" % len(srcs),
|
"for f in $${SRCS[@]:0:%s}; do" % len(srcs),
|
||||||
# Move the .fbs file into the current package if it is not there already
|
|
||||||
'if [[ $$(dirname $$f) != "{0}" ]]; then s="$$f"; f="{0}/$$(basename "$$f")"; mkdir -p "{0}"; mv "$$s" "$$f"; fi;'.format(native.package_relative_label(":invalid").package),
|
|
||||||
"$(location %s)" % (TRUE_FLATC_PATH),
|
"$(location %s)" % (TRUE_FLATC_PATH),
|
||||||
"-b --schema",
|
"-b --schema",
|
||||||
" ".join(flatc_args),
|
" ".join(flatc_args),
|
||||||
@@ -148,10 +141,9 @@ def flatbuffer_library_public(
|
|||||||
"done",
|
"done",
|
||||||
])
|
])
|
||||||
reflection_outs = [
|
reflection_outs = [
|
||||||
(out_prefix + "%s.bfbs") % (native.package_relative_label(s).name.removesuffix(".fbs"))
|
(out_prefix + "%s.bfbs") % (s.replace(".fbs", "").split("/")[-1])
|
||||||
for s in srcs
|
for s in srcs
|
||||||
]
|
]
|
||||||
|
|
||||||
native.genrule(
|
native.genrule(
|
||||||
name = "%s_srcs" % reflection_name,
|
name = "%s_srcs" % reflection_name,
|
||||||
srcs = srcs + includes,
|
srcs = srcs + includes,
|
||||||
@@ -187,7 +179,6 @@ def flatbuffer_cc_library(
|
|||||||
visibility = None,
|
visibility = None,
|
||||||
compatible_with = None,
|
compatible_with = None,
|
||||||
restricted_to = None,
|
restricted_to = None,
|
||||||
filename_suffix = "_generated",
|
|
||||||
target_compatible_with = None,
|
target_compatible_with = None,
|
||||||
srcs_filegroup_visibility = None,
|
srcs_filegroup_visibility = None,
|
||||||
gen_reflections = False):
|
gen_reflections = False):
|
||||||
@@ -231,13 +222,10 @@ def flatbuffer_cc_library(
|
|||||||
Fileset([name]_reflection): (Optional) all generated reflection binaries.
|
Fileset([name]_reflection): (Optional) all generated reflection binaries.
|
||||||
cc_library([name]): library with sources and flatbuffers deps.
|
cc_library([name]): library with sources and flatbuffers deps.
|
||||||
"""
|
"""
|
||||||
|
output_headers = [
|
||||||
output_headers = []
|
(out_prefix + "%s_generated.h") % (s.replace(".fbs", "").split("/")[-1].split(":")[-1])
|
||||||
for s in srcs:
|
for s in srcs
|
||||||
base_name = s.split("/")[-1].split(":")[-1].replace(".fbs", "")
|
]
|
||||||
header = out_prefix + base_name + filename_suffix + ".h"
|
|
||||||
output_headers.append(header)
|
|
||||||
|
|
||||||
if deps and includes:
|
if deps and includes:
|
||||||
# There is no inherent reason we couldn't support both, but this discourages
|
# There is no inherent reason we couldn't support both, but this discourages
|
||||||
# use of includes without good reason.
|
# use of includes without good reason.
|
||||||
@@ -274,8 +262,8 @@ def flatbuffer_cc_library(
|
|||||||
"-parse_headers",
|
"-parse_headers",
|
||||||
],
|
],
|
||||||
deps = [
|
deps = [
|
||||||
Label("//:runtime_cc"),
|
"@com_github_google_flatbuffers//:runtime_cc",
|
||||||
Label("//:flatbuffers"),
|
"@com_github_google_flatbuffers//:flatbuffers",
|
||||||
] + deps,
|
] + deps,
|
||||||
includes = cc_include_paths,
|
includes = cc_include_paths,
|
||||||
compatible_with = compatible_with,
|
compatible_with = compatible_with,
|
||||||
|
|||||||
12
conan/CMakeLists.txt
Normal file
12
conan/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
|
||||||
|
message(STATUS "Conan FlatBuffers Wrapper")
|
||||||
|
|
||||||
|
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
|
||||||
|
conan_basic_setup()
|
||||||
|
|
||||||
|
if (WIN32 AND MSVC_LIKE AND FLATBUFFERS_BUILD_SHAREDLIB)
|
||||||
|
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
||||||
|
endif(WIN32 AND MSVC_LIKE AND FLATBUFFERS_BUILD_SHAREDLIB)
|
||||||
|
|
||||||
|
include(${CMAKE_SOURCE_DIR}/CMakeListsOriginal.txt)
|
||||||
50
conan/build.py
Normal file
50
conan/build.py
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
from cpt.packager import ConanMultiPackager
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def get_branch():
|
||||||
|
try:
|
||||||
|
for line in subprocess.check_output("git branch", shell=True).decode().splitlines():
|
||||||
|
line = line.strip()
|
||||||
|
if line.startswith("*") and " (HEAD detached" not in line:
|
||||||
|
return line.replace("*", "", 1).strip()
|
||||||
|
return ""
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def get_version():
|
||||||
|
version = get_branch()
|
||||||
|
match = re.search(r"v(\d+\.\d+\.\d+.*)", version)
|
||||||
|
if match:
|
||||||
|
return match.group(1)
|
||||||
|
return version
|
||||||
|
|
||||||
|
|
||||||
|
def get_reference(username):
|
||||||
|
return "flatbuffers/{}@google/stable".format(get_version())
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
login_username = os.getenv("CONAN_LOGIN_USERNAME", "aardappel")
|
||||||
|
username = os.getenv("CONAN_USERNAME", "google")
|
||||||
|
upload = os.getenv("CONAN_UPLOAD", "https://api.bintray.com/conan/aardappel/flatbuffers")
|
||||||
|
stable_branch_pattern = os.getenv("CONAN_STABLE_BRANCH_PATTERN", r"v\d+\.\d+\.\d+.*")
|
||||||
|
test_folder = os.getenv("CPT_TEST_FOLDER", os.path.join("conan", "test_package"))
|
||||||
|
upload_only_when_stable = os.getenv("CONAN_UPLOAD_ONLY_WHEN_STABLE", True)
|
||||||
|
|
||||||
|
builder = ConanMultiPackager(reference=get_reference(username),
|
||||||
|
username=username,
|
||||||
|
login_username=login_username,
|
||||||
|
upload=upload,
|
||||||
|
stable_branch_pattern=stable_branch_pattern,
|
||||||
|
upload_only_when_stable=upload_only_when_stable,
|
||||||
|
test_folder=test_folder)
|
||||||
|
builder.add_common_builds(pure_c=False)
|
||||||
|
builder.run()
|
||||||
9
conan/test_package/CMakeLists.txt
Normal file
9
conan/test_package/CMakeLists.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
project(test_package CXX)
|
||||||
|
cmake_minimum_required(VERSION 2.8.11)
|
||||||
|
|
||||||
|
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
|
||||||
|
conan_basic_setup()
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} test_package.cpp)
|
||||||
|
target_link_libraries(${PROJECT_NAME} ${CONAN_LIBS})
|
||||||
|
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11)
|
||||||
21
conan/test_package/conanfile.py
Normal file
21
conan/test_package/conanfile.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from conans import ConanFile, CMake
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
class TestPackageConan(ConanFile):
|
||||||
|
settings = "os", "compiler", "build_type", "arch"
|
||||||
|
generators = "cmake"
|
||||||
|
|
||||||
|
def build(self):
|
||||||
|
cmake = CMake(self)
|
||||||
|
cmake.configure()
|
||||||
|
cmake.build()
|
||||||
|
|
||||||
|
def test(self):
|
||||||
|
bin_path = os.path.join("bin", "test_package")
|
||||||
|
self.run(bin_path, run_environment=True)
|
||||||
|
self.run("flatc --version", run_environment=True)
|
||||||
|
self.run("flathash fnv1_16 conan", run_environment=True)
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2024 Google Inc. All rights reserved.
|
* Copyright 2018 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");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -14,15 +14,22 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import ArgumentParser
|
#include <cstdlib>
|
||||||
|
#include <iostream>
|
||||||
|
#include "flatbuffers/util.h"
|
||||||
|
|
||||||
let port = 3000
|
// Test to validate Conan package generated
|
||||||
|
|
||||||
@main
|
int main(int /*argc*/, const char * /*argv*/ []) {
|
||||||
struct GreeterCommand: AsyncParsableCommand {
|
|
||||||
static let configuration = CommandConfiguration(
|
const std::string filename("conanbuildinfo.cmake");
|
||||||
commandName: "greeter",
|
|
||||||
abstract: "A multi-tool to run an echo server and execute RPCs against it.",
|
if (flatbuffers::FileExists(filename.c_str())) {
|
||||||
subcommands: [ServerCommand.self, ClientCommand.self])
|
std::cout << "File " << filename << " exists.\n";
|
||||||
|
} else {
|
||||||
|
std::cout << "File " << filename << " does not exist.\n";
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
75
conanfile.py
Normal file
75
conanfile.py
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""Conan recipe package for Google FlatBuffers
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
from conans import ConanFile, CMake, tools
|
||||||
|
|
||||||
|
|
||||||
|
class FlatbuffersConan(ConanFile):
|
||||||
|
name = "flatbuffers"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
url = "https://github.com/google/flatbuffers"
|
||||||
|
homepage = "http://google.github.io/flatbuffers/"
|
||||||
|
author = "Wouter van Oortmerssen"
|
||||||
|
topics = ("conan", "flatbuffers", "serialization", "rpc", "json-parser")
|
||||||
|
description = "Memory Efficient Serialization Library"
|
||||||
|
settings = "os", "compiler", "build_type", "arch"
|
||||||
|
options = {"shared": [True, False], "fPIC": [True, False]}
|
||||||
|
default_options = {"shared": False, "fPIC": True}
|
||||||
|
generators = "cmake"
|
||||||
|
exports = "LICENSE"
|
||||||
|
exports_sources = ["CMake/*", "include/*", "src/*", "grpc/*", "CMakeLists.txt", "conan/CMakeLists.txt"]
|
||||||
|
|
||||||
|
def source(self):
|
||||||
|
"""Wrap the original CMake file to call conan_basic_setup
|
||||||
|
"""
|
||||||
|
shutil.move("CMakeLists.txt", "CMakeListsOriginal.txt")
|
||||||
|
shutil.move(os.path.join("conan", "CMakeLists.txt"), "CMakeLists.txt")
|
||||||
|
|
||||||
|
def config_options(self):
|
||||||
|
"""Remove fPIC option on Windows platform
|
||||||
|
"""
|
||||||
|
if self.settings.os == "Windows":
|
||||||
|
self.options.remove("fPIC")
|
||||||
|
|
||||||
|
def configure_cmake(self):
|
||||||
|
"""Create CMake instance and execute configure step
|
||||||
|
"""
|
||||||
|
cmake = CMake(self)
|
||||||
|
cmake.definitions["FLATBUFFERS_BUILD_TESTS"] = False
|
||||||
|
cmake.definitions["FLATBUFFERS_BUILD_SHAREDLIB"] = self.options.shared
|
||||||
|
cmake.definitions["FLATBUFFERS_BUILD_FLATLIB"] = not self.options.shared
|
||||||
|
cmake.configure()
|
||||||
|
return cmake
|
||||||
|
|
||||||
|
def build(self):
|
||||||
|
"""Configure, build and install FlatBuffers using CMake.
|
||||||
|
"""
|
||||||
|
cmake = self.configure_cmake()
|
||||||
|
cmake.build()
|
||||||
|
|
||||||
|
def package(self):
|
||||||
|
"""Copy Flatbuffers' artifacts to package folder
|
||||||
|
"""
|
||||||
|
cmake = self.configure_cmake()
|
||||||
|
cmake.install()
|
||||||
|
self.copy(pattern="LICENSE", dst="licenses")
|
||||||
|
self.copy(pattern="FindFlatBuffers.cmake", dst=os.path.join("lib", "cmake", "flatbuffers"), src="CMake")
|
||||||
|
self.copy(pattern="flathash*", dst="bin", src="bin")
|
||||||
|
self.copy(pattern="flatc*", dst="bin", src="bin")
|
||||||
|
if self.settings.os == "Windows" and self.options.shared:
|
||||||
|
if self.settings.compiler == "Visual Studio":
|
||||||
|
shutil.move(os.path.join(self.package_folder, "lib", "%s.dll" % self.name),
|
||||||
|
os.path.join(self.package_folder, "bin", "%s.dll" % self.name))
|
||||||
|
elif self.settings.compiler == "gcc":
|
||||||
|
shutil.move(os.path.join(self.package_folder, "lib", "lib%s.dll" % self.name),
|
||||||
|
os.path.join(self.package_folder, "bin", "lib%s.dll" % self.name))
|
||||||
|
|
||||||
|
def package_info(self):
|
||||||
|
"""Collect built libraries names and solve flatc path.
|
||||||
|
"""
|
||||||
|
self.cpp_info.libs = tools.collect_libs(self)
|
||||||
|
self.user_info.flatc = os.path.join(self.package_folder, "bin", "flatc")
|
||||||
@@ -1,11 +1,5 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## 25.9.23
|
|
||||||
|
|
||||||
- use enhanced enums (#8313)
|
|
||||||
- fix incorrect write in Float64 write method (#8290)
|
|
||||||
- code format improvements (#8707)
|
|
||||||
|
|
||||||
## 23.5.26
|
## 23.5.26
|
||||||
|
|
||||||
- omit type annotationes for local variables (#7067, #7069, #7070)
|
- omit type annotationes for local variables (#7067, #7069, #7070)
|
||||||
|
|||||||
@@ -15,7 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
||||||
|
|
||||||
import './monster_my_game.sample_generated.dart' as my_game;
|
import './monster_my_game.sample_generated.dart' as my_game;
|
||||||
|
|
||||||
// Example how to use FlatBuffers to create and read binary buffers.
|
// Example how to use FlatBuffers to create and read binary buffers.
|
||||||
@@ -79,8 +78,7 @@ void builderTest() {
|
|||||||
builder.finish(monsteroff);
|
builder.finish(monsteroff);
|
||||||
if (verify(builder.buffer)) {
|
if (verify(builder.buffer)) {
|
||||||
print(
|
print(
|
||||||
"The FlatBuffer was successfully created with a builder and verified!",
|
"The FlatBuffer was successfully created with a builder and verified!");
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,10 +94,7 @@ void objectBuilderTest() {
|
|||||||
name: 'Orc',
|
name: 'Orc',
|
||||||
inventory: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
|
inventory: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
|
||||||
color: my_game.Color.Red,
|
color: my_game.Color.Red,
|
||||||
weapons: [
|
weapons: [my_game.WeaponObjectBuilder(name: 'Sword', damage: 3), axe],
|
||||||
my_game.WeaponObjectBuilder(name: 'Sword', damage: 3),
|
|
||||||
axe,
|
|
||||||
],
|
|
||||||
equippedType: my_game.EquipmentTypeId.Weapon,
|
equippedType: my_game.EquipmentTypeId.Weapon,
|
||||||
equipped: axe,
|
equipped: axe,
|
||||||
);
|
);
|
||||||
@@ -113,8 +108,7 @@ void objectBuilderTest() {
|
|||||||
// Instead, we're going to access it right away (as if we just received it).
|
// Instead, we're going to access it right away (as if we just received it).
|
||||||
if (verify(buffer)) {
|
if (verify(buffer)) {
|
||||||
print(
|
print(
|
||||||
"The FlatBuffer was successfully created with an object builder and verified!",
|
"The FlatBuffer was successfully created with an object builder and verified!");
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
library my_game.sample;
|
library my_game.sample;
|
||||||
|
|
||||||
import 'dart:typed_data' show Uint8List;
|
import 'dart:typed_data' show Uint8List;
|
||||||
|
|
||||||
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
||||||
|
|
||||||
|
|
||||||
class Color {
|
class Color {
|
||||||
final int value;
|
final int value;
|
||||||
const Color._(this.value);
|
const Color._(this.value);
|
||||||
@@ -19,7 +19,7 @@ class Color {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Color? _createOrNull(int? value) =>
|
static Color? _createOrNull(int? value) =>
|
||||||
value == null ? null : Color.fromValue(value);
|
value == null ? null : Color.fromValue(value);
|
||||||
|
|
||||||
static const int minValue = 0;
|
static const int minValue = 0;
|
||||||
@@ -29,7 +29,10 @@ class Color {
|
|||||||
static const Color Red = Color._(0);
|
static const Color Red = Color._(0);
|
||||||
static const Color Green = Color._(1);
|
static const Color Green = Color._(1);
|
||||||
static const Color Blue = Color._(2);
|
static const Color Blue = Color._(2);
|
||||||
static const Map<int, Color> values = {0: Red, 1: Green, 2: Blue};
|
static const Map<int, Color> values = {
|
||||||
|
0: Red,
|
||||||
|
1: Green,
|
||||||
|
2: Blue};
|
||||||
|
|
||||||
static const fb.Reader<Color> reader = _ColorReader();
|
static const fb.Reader<Color> reader = _ColorReader();
|
||||||
|
|
||||||
@@ -57,14 +60,12 @@ class EquipmentTypeId {
|
|||||||
factory EquipmentTypeId.fromValue(int value) {
|
factory EquipmentTypeId.fromValue(int value) {
|
||||||
final result = values[value];
|
final result = values[value];
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
throw StateError(
|
throw StateError('Invalid value $value for bit flag enum EquipmentTypeId');
|
||||||
'Invalid value $value for bit flag enum EquipmentTypeId',
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static EquipmentTypeId? _createOrNull(int? value) =>
|
static EquipmentTypeId? _createOrNull(int? value) =>
|
||||||
value == null ? null : EquipmentTypeId.fromValue(value);
|
value == null ? null : EquipmentTypeId.fromValue(value);
|
||||||
|
|
||||||
static const int minValue = 0;
|
static const int minValue = 0;
|
||||||
@@ -73,7 +74,9 @@ class EquipmentTypeId {
|
|||||||
|
|
||||||
static const EquipmentTypeId NONE = EquipmentTypeId._(0);
|
static const EquipmentTypeId NONE = EquipmentTypeId._(0);
|
||||||
static const EquipmentTypeId Weapon = EquipmentTypeId._(1);
|
static const EquipmentTypeId Weapon = EquipmentTypeId._(1);
|
||||||
static const Map<int, EquipmentTypeId> values = {0: NONE, 1: Weapon};
|
static const Map<int, EquipmentTypeId> values = {
|
||||||
|
0: NONE,
|
||||||
|
1: Weapon};
|
||||||
|
|
||||||
static const fb.Reader<EquipmentTypeId> reader = _EquipmentTypeIdReader();
|
static const fb.Reader<EquipmentTypeId> reader = _EquipmentTypeIdReader();
|
||||||
|
|
||||||
@@ -119,7 +122,8 @@ class _Vec3Reader extends fb.StructReader<Vec3> {
|
|||||||
int get size => 12;
|
int get size => 12;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Vec3 createObject(fb.BufferContext bc, int offset) => Vec3._(bc, offset);
|
Vec3 createObject(fb.BufferContext bc, int offset) =>
|
||||||
|
Vec3._(bc, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
class Vec3Builder {
|
class Vec3Builder {
|
||||||
@@ -133,6 +137,7 @@ class Vec3Builder {
|
|||||||
fbBuilder.putFloat32(x);
|
fbBuilder.putFloat32(x);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class Vec3ObjectBuilder extends fb.ObjectBuilder {
|
class Vec3ObjectBuilder extends fb.ObjectBuilder {
|
||||||
@@ -140,10 +145,14 @@ class Vec3ObjectBuilder extends fb.ObjectBuilder {
|
|||||||
final double _y;
|
final double _y;
|
||||||
final double _z;
|
final double _z;
|
||||||
|
|
||||||
Vec3ObjectBuilder({required double x, required double y, required double z})
|
Vec3ObjectBuilder({
|
||||||
: _x = x,
|
required double x,
|
||||||
_y = y,
|
required double y,
|
||||||
_z = z;
|
required double z,
|
||||||
|
})
|
||||||
|
: _x = x,
|
||||||
|
_y = y,
|
||||||
|
_z = z;
|
||||||
|
|
||||||
/// Finish building, and store into the [fbBuilder].
|
/// Finish building, and store into the [fbBuilder].
|
||||||
@override
|
@override
|
||||||
@@ -162,7 +171,6 @@ class Vec3ObjectBuilder extends fb.ObjectBuilder {
|
|||||||
return fbBuilder.buffer;
|
return fbBuilder.buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Monster {
|
class Monster {
|
||||||
Monster._(this._bc, this._bcOffset);
|
Monster._(this._bc, this._bcOffset);
|
||||||
factory Monster(List<int> bytes) {
|
factory Monster(List<int> bytes) {
|
||||||
@@ -178,30 +186,18 @@ class Monster {
|
|||||||
Vec3? get pos => Vec3.reader.vTableGetNullable(_bc, _bcOffset, 4);
|
Vec3? get pos => Vec3.reader.vTableGetNullable(_bc, _bcOffset, 4);
|
||||||
int get mana => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 6, 150);
|
int get mana => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 6, 150);
|
||||||
int get hp => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 8, 100);
|
int get hp => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 8, 100);
|
||||||
String? get name =>
|
String? get name => const fb.StringReader().vTableGetNullable(_bc, _bcOffset, 10);
|
||||||
const fb.StringReader().vTableGetNullable(_bc, _bcOffset, 10);
|
List<int>? get inventory => const fb.Uint8ListReader().vTableGetNullable(_bc, _bcOffset, 14);
|
||||||
List<int>? get inventory =>
|
Color get color => Color.fromValue(const fb.Int8Reader().vTableGet(_bc, _bcOffset, 16, 2));
|
||||||
const fb.Uint8ListReader().vTableGetNullable(_bc, _bcOffset, 14);
|
List<Weapon>? get weapons => const fb.ListReader<Weapon>(Weapon.reader).vTableGetNullable(_bc, _bcOffset, 18);
|
||||||
Color get color =>
|
EquipmentTypeId? get equippedType => EquipmentTypeId._createOrNull(const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 20));
|
||||||
Color.fromValue(const fb.Int8Reader().vTableGet(_bc, _bcOffset, 16, 2));
|
|
||||||
List<Weapon>? get weapons => const fb.ListReader<Weapon>(
|
|
||||||
Weapon.reader,
|
|
||||||
).vTableGetNullable(_bc, _bcOffset, 18);
|
|
||||||
EquipmentTypeId? get equippedType => EquipmentTypeId._createOrNull(
|
|
||||||
const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 20),
|
|
||||||
);
|
|
||||||
dynamic get equipped {
|
dynamic get equipped {
|
||||||
switch (equippedType?.value) {
|
switch (equippedType?.value) {
|
||||||
case 1:
|
case 1: return Weapon.reader.vTableGetNullable(_bc, _bcOffset, 22);
|
||||||
return Weapon.reader.vTableGetNullable(_bc, _bcOffset, 22);
|
default: return null;
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
List<Vec3>? get path => const fb.ListReader<Vec3>(Vec3.reader).vTableGetNullable(_bc, _bcOffset, 24);
|
||||||
List<Vec3>? get path => const fb.ListReader<Vec3>(
|
|
||||||
Vec3.reader,
|
|
||||||
).vTableGetNullable(_bc, _bcOffset, 24);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
@@ -213,8 +209,8 @@ class _MonsterReader extends fb.TableReader<Monster> {
|
|||||||
const _MonsterReader();
|
const _MonsterReader();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Monster createObject(fb.BufferContext bc, int offset) =>
|
Monster createObject(fb.BufferContext bc, int offset) =>
|
||||||
Monster._(bc, offset);
|
Monster._(bc, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
class MonsterBuilder {
|
class MonsterBuilder {
|
||||||
@@ -230,47 +226,38 @@ class MonsterBuilder {
|
|||||||
fbBuilder.addStruct(0, offset);
|
fbBuilder.addStruct(0, offset);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int addMana(int? mana) {
|
int addMana(int? mana) {
|
||||||
fbBuilder.addInt16(1, mana);
|
fbBuilder.addInt16(1, mana);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int addHp(int? hp) {
|
int addHp(int? hp) {
|
||||||
fbBuilder.addInt16(2, hp);
|
fbBuilder.addInt16(2, hp);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int addNameOffset(int? offset) {
|
int addNameOffset(int? offset) {
|
||||||
fbBuilder.addOffset(3, offset);
|
fbBuilder.addOffset(3, offset);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int addInventoryOffset(int? offset) {
|
int addInventoryOffset(int? offset) {
|
||||||
fbBuilder.addOffset(5, offset);
|
fbBuilder.addOffset(5, offset);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int addColor(Color? color) {
|
int addColor(Color? color) {
|
||||||
fbBuilder.addInt8(6, color?.value);
|
fbBuilder.addInt8(6, color?.value);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int addWeaponsOffset(int? offset) {
|
int addWeaponsOffset(int? offset) {
|
||||||
fbBuilder.addOffset(7, offset);
|
fbBuilder.addOffset(7, offset);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int addEquippedType(EquipmentTypeId? equippedType) {
|
int addEquippedType(EquipmentTypeId? equippedType) {
|
||||||
fbBuilder.addUint8(8, equippedType?.value);
|
fbBuilder.addUint8(8, equippedType?.value);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int addEquippedOffset(int? offset) {
|
int addEquippedOffset(int? offset) {
|
||||||
fbBuilder.addOffset(9, offset);
|
fbBuilder.addOffset(9, offset);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int addPathOffset(int? offset) {
|
int addPathOffset(int? offset) {
|
||||||
fbBuilder.addOffset(10, offset);
|
fbBuilder.addOffset(10, offset);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
@@ -304,34 +291,29 @@ class MonsterObjectBuilder extends fb.ObjectBuilder {
|
|||||||
EquipmentTypeId? equippedType,
|
EquipmentTypeId? equippedType,
|
||||||
dynamic equipped,
|
dynamic equipped,
|
||||||
List<Vec3ObjectBuilder>? path,
|
List<Vec3ObjectBuilder>? path,
|
||||||
}) : _pos = pos,
|
})
|
||||||
_mana = mana,
|
: _pos = pos,
|
||||||
_hp = hp,
|
_mana = mana,
|
||||||
_name = name,
|
_hp = hp,
|
||||||
_inventory = inventory,
|
_name = name,
|
||||||
_color = color,
|
_inventory = inventory,
|
||||||
_weapons = weapons,
|
_color = color,
|
||||||
_equippedType = equippedType,
|
_weapons = weapons,
|
||||||
_equipped = equipped,
|
_equippedType = equippedType,
|
||||||
_path = path;
|
_equipped = equipped,
|
||||||
|
_path = path;
|
||||||
|
|
||||||
/// Finish building, and store into the [fbBuilder].
|
/// Finish building, and store into the [fbBuilder].
|
||||||
@override
|
@override
|
||||||
int finish(fb.Builder fbBuilder) {
|
int finish(fb.Builder fbBuilder) {
|
||||||
final int? nameOffset = _name == null
|
final int? nameOffset = _name == null ? null
|
||||||
? null
|
|
||||||
: fbBuilder.writeString(_name!);
|
: fbBuilder.writeString(_name!);
|
||||||
final int? inventoryOffset = _inventory == null
|
final int? inventoryOffset = _inventory == null ? null
|
||||||
? null
|
|
||||||
: fbBuilder.writeListUint8(_inventory!);
|
: fbBuilder.writeListUint8(_inventory!);
|
||||||
final int? weaponsOffset = _weapons == null
|
final int? weaponsOffset = _weapons == null ? null
|
||||||
? null
|
: fbBuilder.writeList(_weapons!.map((b) => b.getOrCreateOffset(fbBuilder)).toList());
|
||||||
: fbBuilder.writeList(
|
|
||||||
_weapons!.map((b) => b.getOrCreateOffset(fbBuilder)).toList(),
|
|
||||||
);
|
|
||||||
final int? equippedOffset = _equipped?.getOrCreateOffset(fbBuilder);
|
final int? equippedOffset = _equipped?.getOrCreateOffset(fbBuilder);
|
||||||
final int? pathOffset = _path == null
|
final int? pathOffset = _path == null ? null
|
||||||
? null
|
|
||||||
: fbBuilder.writeListOfStructs(_path!);
|
: fbBuilder.writeListOfStructs(_path!);
|
||||||
fbBuilder.startTable(10);
|
fbBuilder.startTable(10);
|
||||||
if (_pos != null) {
|
if (_pos != null) {
|
||||||
@@ -357,7 +339,6 @@ class MonsterObjectBuilder extends fb.ObjectBuilder {
|
|||||||
return fbBuilder.buffer;
|
return fbBuilder.buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Weapon {
|
class Weapon {
|
||||||
Weapon._(this._bc, this._bcOffset);
|
Weapon._(this._bc, this._bcOffset);
|
||||||
factory Weapon(List<int> bytes) {
|
factory Weapon(List<int> bytes) {
|
||||||
@@ -370,8 +351,7 @@ class Weapon {
|
|||||||
final fb.BufferContext _bc;
|
final fb.BufferContext _bc;
|
||||||
final int _bcOffset;
|
final int _bcOffset;
|
||||||
|
|
||||||
String? get name =>
|
String? get name => const fb.StringReader().vTableGetNullable(_bc, _bcOffset, 4);
|
||||||
const fb.StringReader().vTableGetNullable(_bc, _bcOffset, 4);
|
|
||||||
int get damage => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 6, 0);
|
int get damage => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 6, 0);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -384,7 +364,8 @@ class _WeaponReader extends fb.TableReader<Weapon> {
|
|||||||
const _WeaponReader();
|
const _WeaponReader();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Weapon createObject(fb.BufferContext bc, int offset) => Weapon._(bc, offset);
|
Weapon createObject(fb.BufferContext bc, int offset) =>
|
||||||
|
Weapon._(bc, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
class WeaponBuilder {
|
class WeaponBuilder {
|
||||||
@@ -400,7 +381,6 @@ class WeaponBuilder {
|
|||||||
fbBuilder.addOffset(0, offset);
|
fbBuilder.addOffset(0, offset);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int addDamage(int? damage) {
|
int addDamage(int? damage) {
|
||||||
fbBuilder.addInt16(1, damage);
|
fbBuilder.addInt16(1, damage);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
@@ -415,15 +395,17 @@ class WeaponObjectBuilder extends fb.ObjectBuilder {
|
|||||||
final String? _name;
|
final String? _name;
|
||||||
final int? _damage;
|
final int? _damage;
|
||||||
|
|
||||||
WeaponObjectBuilder({String? name, int? damage})
|
WeaponObjectBuilder({
|
||||||
: _name = name,
|
String? name,
|
||||||
_damage = damage;
|
int? damage,
|
||||||
|
})
|
||||||
|
: _name = name,
|
||||||
|
_damage = damage;
|
||||||
|
|
||||||
/// Finish building, and store into the [fbBuilder].
|
/// Finish building, and store into the [fbBuilder].
|
||||||
@override
|
@override
|
||||||
int finish(fb.Builder fbBuilder) {
|
int finish(fb.Builder fbBuilder) {
|
||||||
final int? nameOffset = _name == null
|
final int? nameOffset = _name == null ? null
|
||||||
? null
|
|
||||||
: fbBuilder.writeString(_name!);
|
: fbBuilder.writeString(_name!);
|
||||||
fbBuilder.startTable(2);
|
fbBuilder.startTable(2);
|
||||||
fbBuilder.addOffset(0, nameOffset);
|
fbBuilder.addOffset(0, nameOffset);
|
||||||
|
|||||||
@@ -27,11 +27,10 @@ class BufferContext {
|
|||||||
ByteData get buffer => _buffer;
|
ByteData get buffer => _buffer;
|
||||||
|
|
||||||
/// Create from a FlatBuffer represented by a list of bytes (uint8).
|
/// Create from a FlatBuffer represented by a list of bytes (uint8).
|
||||||
factory BufferContext.fromBytes(List<int> byteList) => BufferContext(
|
factory BufferContext.fromBytes(List<int> byteList) =>
|
||||||
byteList is Uint8List
|
BufferContext(byteList is Uint8List
|
||||||
? byteList.buffer.asByteData(byteList.offsetInBytes)
|
? byteList.buffer.asByteData(byteList.offsetInBytes)
|
||||||
: ByteData.view(Uint8List.fromList(byteList).buffer),
|
: ByteData.view(Uint8List.fromList(byteList).buffer));
|
||||||
);
|
|
||||||
|
|
||||||
/// Create from a FlatBuffer represented by ByteData.
|
/// Create from a FlatBuffer represented by ByteData.
|
||||||
BufferContext(this._buffer);
|
BufferContext(this._buffer);
|
||||||
@@ -150,9 +149,9 @@ class Builder {
|
|||||||
bool internStrings = false,
|
bool internStrings = false,
|
||||||
Allocator allocator = const DefaultAllocator(),
|
Allocator allocator = const DefaultAllocator(),
|
||||||
this.deduplicateTables = true,
|
this.deduplicateTables = true,
|
||||||
}) : _allocator = allocator,
|
}) : _allocator = allocator,
|
||||||
_buf = allocator.allocate(initialSize),
|
_buf = allocator.allocate(initialSize),
|
||||||
_vTables = deduplicateTables ? [] : const [] {
|
_vTables = deduplicateTables ? [] : const [] {
|
||||||
if (internStrings) {
|
if (internStrings) {
|
||||||
_strings = <String, int>{};
|
_strings = <String, int>{};
|
||||||
}
|
}
|
||||||
@@ -351,10 +350,8 @@ class Builder {
|
|||||||
Uint8List get buffer {
|
Uint8List get buffer {
|
||||||
assert(_finished);
|
assert(_finished);
|
||||||
final finishedSize = size();
|
final finishedSize = size();
|
||||||
return _buf.buffer.asUint8List(
|
return _buf.buffer
|
||||||
_buf.lengthInBytes - finishedSize,
|
.asUint8List(_buf.lengthInBytes - finishedSize, finishedSize);
|
||||||
finishedSize,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Finish off the creation of the buffer. The given [offset] is used as the
|
/// Finish off the creation of the buffer. The given [offset] is used as the
|
||||||
@@ -371,18 +368,14 @@ class Builder {
|
|||||||
if (fileIdentifier != null) {
|
if (fileIdentifier != null) {
|
||||||
for (var i = 0; i < 4; i++) {
|
for (var i = 0; i < 4; i++) {
|
||||||
_setUint8AtTail(
|
_setUint8AtTail(
|
||||||
finishedSize - _sizeofUint32 - i,
|
finishedSize - _sizeofUint32 - i, fileIdentifier.codeUnitAt(i));
|
||||||
fileIdentifier.codeUnitAt(i),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// zero out the added padding
|
// zero out the added padding
|
||||||
for (
|
for (var i = sizeBeforePadding + 1;
|
||||||
var i = sizeBeforePadding + 1;
|
i <= finishedSize - requiredBytes;
|
||||||
i <= finishedSize - requiredBytes;
|
i++) {
|
||||||
i++
|
|
||||||
) {
|
|
||||||
_setUint8AtTail(i, 0);
|
_setUint8AtTail(i, 0);
|
||||||
}
|
}
|
||||||
_finished = true;
|
_finished = true;
|
||||||
@@ -393,7 +386,7 @@ class Builder {
|
|||||||
/// Updates the [offset] pointer. This method is intended for use when writing structs to the buffer.
|
/// Updates the [offset] pointer. This method is intended for use when writing structs to the buffer.
|
||||||
void putFloat64(double value) {
|
void putFloat64(double value) {
|
||||||
_prepare(_sizeofFloat64, 1);
|
_prepare(_sizeofFloat64, 1);
|
||||||
_setFloat64AtTail(_tail, value);
|
_setFloat32AtTail(_tail, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Writes a Float32 to the tail of the buffer after preparing space for it.
|
/// Writes a Float32 to the tail of the buffer after preparing space for it.
|
||||||
@@ -694,10 +687,8 @@ class Builder {
|
|||||||
int writeString(String value, {bool asciiOptimization = false}) {
|
int writeString(String value, {bool asciiOptimization = false}) {
|
||||||
assert(!_inVTable);
|
assert(!_inVTable);
|
||||||
if (_strings != null) {
|
if (_strings != null) {
|
||||||
return _strings!.putIfAbsent(
|
return _strings!
|
||||||
value,
|
.putIfAbsent(value, () => _writeString(value, asciiOptimization));
|
||||||
() => _writeString(value, asciiOptimization),
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
return _writeString(value, asciiOptimization);
|
return _writeString(value, asciiOptimization);
|
||||||
}
|
}
|
||||||
@@ -1014,11 +1005,8 @@ class ListReader<E> extends Reader<List<E>> {
|
|||||||
: List<E>.generate(
|
: List<E>.generate(
|
||||||
bc.buffer.getUint32(listOffset, Endian.little),
|
bc.buffer.getUint32(listOffset, Endian.little),
|
||||||
(int index) => _elementReader.read(
|
(int index) => _elementReader.read(
|
||||||
bc,
|
bc, listOffset + size + _elementReader.size * index),
|
||||||
listOffset + size + _elementReader.size * index,
|
growable: true);
|
||||||
),
|
|
||||||
growable: true,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1296,7 +1284,7 @@ class _FbGenericList<E> extends _FbList<E> {
|
|||||||
List<E?>? _items;
|
List<E?>? _items;
|
||||||
|
|
||||||
_FbGenericList(this.elementReader, BufferContext bp, int offset)
|
_FbGenericList(this.elementReader, BufferContext bp, int offset)
|
||||||
: super(bp, offset);
|
: super(bp, offset);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@@ -1466,11 +1454,7 @@ abstract class Allocator {
|
|||||||
/// Params [inUseBack] and [inUseFront] indicate how much of [oldData] is
|
/// Params [inUseBack] and [inUseFront] indicate how much of [oldData] is
|
||||||
/// actually in use at each end, and needs to be copied.
|
/// actually in use at each end, and needs to be copied.
|
||||||
ByteData resize(
|
ByteData resize(
|
||||||
ByteData oldData,
|
ByteData oldData, int newSize, int inUseBack, int inUseFront) {
|
||||||
int newSize,
|
|
||||||
int inUseBack,
|
|
||||||
int inUseFront,
|
|
||||||
) {
|
|
||||||
final newData = allocate(newSize);
|
final newData = allocate(newSize);
|
||||||
_copyDownward(oldData, newData, inUseBack, inUseFront);
|
_copyDownward(oldData, newData, inUseBack, inUseFront);
|
||||||
deallocate(oldData);
|
deallocate(oldData);
|
||||||
@@ -1481,25 +1465,17 @@ abstract class Allocator {
|
|||||||
/// memory of size [inUseFront] and [inUseBack] will be copied from the front
|
/// memory of size [inUseFront] and [inUseBack] will be copied from the front
|
||||||
/// and back of the old memory allocation.
|
/// and back of the old memory allocation.
|
||||||
void _copyDownward(
|
void _copyDownward(
|
||||||
ByteData oldData,
|
ByteData oldData, ByteData newData, int inUseBack, int inUseFront) {
|
||||||
ByteData newData,
|
|
||||||
int inUseBack,
|
|
||||||
int inUseFront,
|
|
||||||
) {
|
|
||||||
if (inUseBack != 0) {
|
if (inUseBack != 0) {
|
||||||
newData.buffer.asUint8List().setAll(
|
newData.buffer.asUint8List().setAll(
|
||||||
newData.lengthInBytes - inUseBack,
|
newData.lengthInBytes - inUseBack,
|
||||||
oldData.buffer.asUint8List().getRange(
|
oldData.buffer.asUint8List().getRange(
|
||||||
oldData.lengthInBytes - inUseBack,
|
oldData.lengthInBytes - inUseBack, oldData.lengthInBytes));
|
||||||
oldData.lengthInBytes,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (inUseFront != 0) {
|
if (inUseFront != 0) {
|
||||||
newData.buffer.asUint8List().setAll(
|
newData.buffer
|
||||||
0,
|
.asUint8List()
|
||||||
oldData.buffer.asUint8List().getRange(0, inUseFront),
|
.setAll(0, oldData.buffer.asUint8List().getRange(0, inUseFront));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -107,11 +107,8 @@ class Builder {
|
|||||||
final newOffset = _newOffset(length + 1);
|
final newOffset = _newOffset(length + 1);
|
||||||
_pushBuffer(utf8String);
|
_pushBuffer(utf8String);
|
||||||
_offset = newOffset;
|
_offset = newOffset;
|
||||||
final stackValue = _StackValue.withOffset(
|
final stackValue =
|
||||||
stringOffset,
|
_StackValue.withOffset(stringOffset, ValueType.String, bitWidth);
|
||||||
ValueType.String,
|
|
||||||
bitWidth,
|
|
||||||
);
|
|
||||||
_stack.add(stackValue);
|
_stack.add(stackValue);
|
||||||
_stringCache[value] = stackValue;
|
_stringCache[value] = stackValue;
|
||||||
}
|
}
|
||||||
@@ -131,11 +128,8 @@ class Builder {
|
|||||||
final newOffset = _newOffset(length + 1);
|
final newOffset = _newOffset(length + 1);
|
||||||
_pushBuffer(utf8String);
|
_pushBuffer(utf8String);
|
||||||
_offset = newOffset;
|
_offset = newOffset;
|
||||||
final stackValue = _StackValue.withOffset(
|
final stackValue =
|
||||||
keyOffset,
|
_StackValue.withOffset(keyOffset, ValueType.Key, BitWidth.width8);
|
||||||
ValueType.Key,
|
|
||||||
BitWidth.width8,
|
|
||||||
);
|
|
||||||
_stack.add(stackValue);
|
_stack.add(stackValue);
|
||||||
_keyCache[value] = stackValue;
|
_keyCache[value] = stackValue;
|
||||||
}
|
}
|
||||||
@@ -153,11 +147,8 @@ class Builder {
|
|||||||
final newOffset = _newOffset(length);
|
final newOffset = _newOffset(length);
|
||||||
_pushBuffer(value.asUint8List());
|
_pushBuffer(value.asUint8List());
|
||||||
_offset = newOffset;
|
_offset = newOffset;
|
||||||
final stackValue = _StackValue.withOffset(
|
final stackValue =
|
||||||
blobOffset,
|
_StackValue.withOffset(blobOffset, ValueType.Blob, bitWidth);
|
||||||
ValueType.Blob,
|
|
||||||
bitWidth,
|
|
||||||
);
|
|
||||||
_stack.add(stackValue);
|
_stack.add(stackValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,10 +170,7 @@ class Builder {
|
|||||||
final valueOffset = _offset;
|
final valueOffset = _offset;
|
||||||
_pushBuffer(stackValue.asU8List(stackValue.width));
|
_pushBuffer(stackValue.asU8List(stackValue.width));
|
||||||
final stackOffset = _StackValue.withOffset(
|
final stackOffset = _StackValue.withOffset(
|
||||||
valueOffset,
|
valueOffset, ValueType.IndirectInt, stackValue.width);
|
||||||
ValueType.IndirectInt,
|
|
||||||
stackValue.width,
|
|
||||||
);
|
|
||||||
_stack.add(stackOffset);
|
_stack.add(stackOffset);
|
||||||
_offset = newOffset;
|
_offset = newOffset;
|
||||||
if (cache) {
|
if (cache) {
|
||||||
@@ -207,10 +195,7 @@ class Builder {
|
|||||||
final valueOffset = _offset;
|
final valueOffset = _offset;
|
||||||
_pushBuffer(stackValue.asU8List(stackValue.width));
|
_pushBuffer(stackValue.asU8List(stackValue.width));
|
||||||
final stackOffset = _StackValue.withOffset(
|
final stackOffset = _StackValue.withOffset(
|
||||||
valueOffset,
|
valueOffset, ValueType.IndirectFloat, stackValue.width);
|
||||||
ValueType.IndirectFloat,
|
|
||||||
stackValue.width,
|
|
||||||
);
|
|
||||||
_stack.add(stackOffset);
|
_stack.add(stackOffset);
|
||||||
_offset = newOffset;
|
_offset = newOffset;
|
||||||
if (cache) {
|
if (cache) {
|
||||||
@@ -267,10 +252,9 @@ class Builder {
|
|||||||
tmp._offset = _offset;
|
tmp._offset = _offset;
|
||||||
tmp._stack = List.from(_stack);
|
tmp._stack = List.from(_stack);
|
||||||
tmp._stackPointers = List.from(_stackPointers);
|
tmp._stackPointers = List.from(_stackPointers);
|
||||||
tmp._buffer.buffer.asUint8List().setAll(
|
tmp._buffer.buffer
|
||||||
0,
|
.asUint8List()
|
||||||
_buffer.buffer.asUint8List(0, _offset),
|
.setAll(0, _buffer.buffer.asUint8List(0, _offset));
|
||||||
);
|
|
||||||
for (var i = 0; i < tmp._stackPointers.length; i++) {
|
for (var i = 0; i < tmp._stackPointers.length; i++) {
|
||||||
tmp.end();
|
tmp.end();
|
||||||
}
|
}
|
||||||
@@ -287,8 +271,7 @@ class Builder {
|
|||||||
if (_stackPointers.isNotEmpty && _stackPointers.last.isVector == false) {
|
if (_stackPointers.isNotEmpty && _stackPointers.last.isVector == false) {
|
||||||
if (_stack.last.type != ValueType.Key) {
|
if (_stack.last.type != ValueType.Key) {
|
||||||
throw StateError(
|
throw StateError(
|
||||||
'Adding value to a map before adding a key is prohibited',
|
'Adding value to a map before adding a key is prohibited');
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -305,8 +288,7 @@ class Builder {
|
|||||||
void _finish() {
|
void _finish() {
|
||||||
if (_stack.length != 1) {
|
if (_stack.length != 1) {
|
||||||
throw StateError(
|
throw StateError(
|
||||||
'Stack has to be exactly 1, but is ${_stack.length}. You have to end all started vectors and maps, before calling [finish]',
|
'Stack has to be exactly 1, but is ${_stack.length}. You have to end all started vectors and maps, before calling [finish]');
|
||||||
);
|
|
||||||
}
|
}
|
||||||
final value = _stack[0];
|
final value = _stack[0];
|
||||||
final byteWidth = _align(value.elementWidth(_offset, 0));
|
final byteWidth = _align(value.elementWidth(_offset, 0));
|
||||||
@@ -316,12 +298,8 @@ class Builder {
|
|||||||
_finished = true;
|
_finished = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
_StackValue _createVector(
|
_StackValue _createVector(int start, int vecLength, int step,
|
||||||
int start,
|
[_StackValue? keys]) {
|
||||||
int vecLength,
|
|
||||||
int step, [
|
|
||||||
_StackValue? keys,
|
|
||||||
]) {
|
|
||||||
var bitWidth = BitWidthUtil.uwidth(vecLength);
|
var bitWidth = BitWidthUtil.uwidth(vecLength);
|
||||||
var prefixElements = 1;
|
var prefixElements = 1;
|
||||||
if (keys != null) {
|
if (keys != null) {
|
||||||
@@ -348,8 +326,7 @@ class Builder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
final byteWidth = _align(bitWidth);
|
final byteWidth = _align(bitWidth);
|
||||||
final fix =
|
final fix = typed & ValueTypeUtils.isNumber(vectorType) &&
|
||||||
typed & ValueTypeUtils.isNumber(vectorType) &&
|
|
||||||
vecLength >= 2 &&
|
vecLength >= 2 &&
|
||||||
vecLength <= 4;
|
vecLength <= 4;
|
||||||
if (keys != null) {
|
if (keys != null) {
|
||||||
@@ -372,10 +349,8 @@ class Builder {
|
|||||||
return _StackValue.withOffset(vecOffset, ValueType.Map, bitWidth);
|
return _StackValue.withOffset(vecOffset, ValueType.Map, bitWidth);
|
||||||
}
|
}
|
||||||
if (typed) {
|
if (typed) {
|
||||||
final vType = ValueTypeUtils.toTypedVector(
|
final vType =
|
||||||
vectorType,
|
ValueTypeUtils.toTypedVector(vectorType, fix ? vecLength : 0);
|
||||||
fix ? vecLength : 0,
|
|
||||||
);
|
|
||||||
return _StackValue.withOffset(vecOffset, vType, bitWidth);
|
return _StackValue.withOffset(vecOffset, vType, bitWidth);
|
||||||
}
|
}
|
||||||
return _StackValue.withOffset(vecOffset, ValueType.Vector, bitWidth);
|
return _StackValue.withOffset(vecOffset, ValueType.Vector, bitWidth);
|
||||||
@@ -391,8 +366,7 @@ class Builder {
|
|||||||
void _sortKeysAndEndMap(_StackPointer pointer) {
|
void _sortKeysAndEndMap(_StackPointer pointer) {
|
||||||
if (((_stack.length - pointer.stackPosition) & 1) == 1) {
|
if (((_stack.length - pointer.stackPosition) & 1) == 1) {
|
||||||
throw StateError(
|
throw StateError(
|
||||||
'The stack needs to hold key value pairs (even number of elements). Check if you combined [addKey] with add... method calls properly.',
|
'The stack needs to hold key value pairs (even number of elements). Check if you combined [addKey] with add... method calls properly.');
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var sorted = true;
|
var sorted = true;
|
||||||
@@ -438,12 +412,8 @@ class Builder {
|
|||||||
keysStackValue = _createVector(pointer.stackPosition, vecLength, 2);
|
keysStackValue = _createVector(pointer.stackPosition, vecLength, 2);
|
||||||
_keyVectorCache[keysHash] = keysStackValue;
|
_keyVectorCache[keysHash] = keysStackValue;
|
||||||
}
|
}
|
||||||
final vec = _createVector(
|
final vec =
|
||||||
pointer.stackPosition + 1,
|
_createVector(pointer.stackPosition + 1, vecLength, 2, keysStackValue);
|
||||||
vecLength,
|
|
||||||
2,
|
|
||||||
keysStackValue,
|
|
||||||
);
|
|
||||||
_stack.removeRange(pointer.stackPosition, _stack.length);
|
_stack.removeRange(pointer.stackPosition, _stack.length);
|
||||||
_stack.add(vec);
|
_stack.add(vec);
|
||||||
}
|
}
|
||||||
@@ -451,8 +421,7 @@ class Builder {
|
|||||||
bool _shouldFlip(_StackValue v1, _StackValue v2) {
|
bool _shouldFlip(_StackValue v1, _StackValue v2) {
|
||||||
if (v1.type != ValueType.Key || v2.type != ValueType.Key) {
|
if (v1.type != ValueType.Key || v2.type != ValueType.Key) {
|
||||||
throw StateError(
|
throw StateError(
|
||||||
'Stack values are not keys $v1 | $v2. Check if you combined [addKey] with add... method calls properly.',
|
'Stack values are not keys $v1 | $v2. Check if you combined [addKey] with add... method calls properly.');
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
late int c1, c2;
|
late int c1, c2;
|
||||||
@@ -481,8 +450,7 @@ class Builder {
|
|||||||
_writeUInt(relativeOffset, byteWidth);
|
_writeUInt(relativeOffset, byteWidth);
|
||||||
} else {
|
} else {
|
||||||
throw StateError(
|
throw StateError(
|
||||||
'Unexpected size $byteWidth. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new',
|
'Unexpected size $byteWidth. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new');
|
||||||
);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_pushBuffer(value.asU8List(BitWidthUtil.fromByteWidth(byteWidth)));
|
_pushBuffer(value.asU8List(BitWidthUtil.fromByteWidth(byteWidth)));
|
||||||
@@ -506,7 +474,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;
|
||||||
}
|
}
|
||||||
@@ -556,27 +523,29 @@ class _StackValue {
|
|||||||
final ValueType _type;
|
final ValueType _type;
|
||||||
final BitWidth _width;
|
final BitWidth _width;
|
||||||
|
|
||||||
_StackValue.withNull() : _type = ValueType.Null, _width = BitWidth.width8;
|
_StackValue.withNull()
|
||||||
|
: _type = ValueType.Null,
|
||||||
|
_width = BitWidth.width8;
|
||||||
|
|
||||||
_StackValue.withInt(int value)
|
_StackValue.withInt(int value)
|
||||||
: _type = ValueType.Int,
|
: _type = ValueType.Int,
|
||||||
_width = BitWidthUtil.width(value),
|
_width = BitWidthUtil.width(value),
|
||||||
_value = value;
|
_value = value;
|
||||||
|
|
||||||
_StackValue.withBool(bool value)
|
_StackValue.withBool(bool value)
|
||||||
: _type = ValueType.Bool,
|
: _type = ValueType.Bool,
|
||||||
_width = BitWidth.width8,
|
_width = BitWidth.width8,
|
||||||
_value = value;
|
_value = value;
|
||||||
|
|
||||||
_StackValue.withDouble(double value)
|
_StackValue.withDouble(double value)
|
||||||
: _type = ValueType.Float,
|
: _type = ValueType.Float,
|
||||||
_width = BitWidthUtil.width(value),
|
_width = BitWidthUtil.width(value),
|
||||||
_value = value;
|
_value = value;
|
||||||
|
|
||||||
_StackValue.withOffset(int value, ValueType type, BitWidth width)
|
_StackValue.withOffset(int value, ValueType type, BitWidth width)
|
||||||
: _offset = value,
|
: _offset = value,
|
||||||
_type = type,
|
_type = type,
|
||||||
_width = width;
|
_width = width;
|
||||||
|
|
||||||
BitWidth storedWidth({BitWidth width = BitWidth.width8}) {
|
BitWidth storedWidth({BitWidth width = BitWidth.width8}) {
|
||||||
return ValueTypeUtils.isInline(_type)
|
return ValueTypeUtils.isInline(_type)
|
||||||
@@ -593,16 +562,16 @@ class _StackValue {
|
|||||||
final offset = _offset!;
|
final offset = _offset!;
|
||||||
for (var i = 0; i < 4; i++) {
|
for (var i = 0; i < 4; i++) {
|
||||||
final width = 1 << i;
|
final width = 1 << i;
|
||||||
final bitWidth = BitWidthUtil.uwidth(
|
final bitWidth = BitWidthUtil.uwidth(size +
|
||||||
size + BitWidthUtil.paddingSize(size, width) + index * width - offset,
|
BitWidthUtil.paddingSize(size, width) +
|
||||||
);
|
index * width -
|
||||||
|
offset);
|
||||||
if (1 << bitWidth.index == width) {
|
if (1 << bitWidth.index == width) {
|
||||||
return bitWidth;
|
return bitWidth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw StateError(
|
throw StateError(
|
||||||
'Element is of unknown. Size: $size at index: $index. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new',
|
'Element is of unknown. Size: $size at index: $index. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new');
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<int> asU8List(BitWidth width) {
|
List<int> asU8List(BitWidth width) {
|
||||||
@@ -650,8 +619,7 @@ class _StackValue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
throw StateError(
|
throw StateError(
|
||||||
'Unexpected type: $_type. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new',
|
'Unexpected type: $_type. This might be a bug. Please create an issue https://github.com/google/flatbuffers/issues/new');
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueType get type {
|
ValueType get type {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'types.dart';
|
import 'types.dart';
|
||||||
|
|
||||||
/// Main class to read a value out of a FlexBuffer.
|
/// Main class to read a value out of a FlexBuffer.
|
||||||
@@ -17,15 +16,10 @@ class Reference {
|
|||||||
int? _length;
|
int? _length;
|
||||||
|
|
||||||
Reference._(
|
Reference._(
|
||||||
this._buffer,
|
this._buffer, this._offset, this._parentWidth, int packedType, this._path,
|
||||||
this._offset,
|
[int? byteWidth, ValueType? valueType])
|
||||||
this._parentWidth,
|
: _byteWidth = byteWidth ?? 1 << (packedType & 3),
|
||||||
int packedType,
|
_valueType = valueType ?? ValueTypeUtils.fromInt(packedType >> 2);
|
||||||
this._path, [
|
|
||||||
int? byteWidth,
|
|
||||||
ValueType? valueType,
|
|
||||||
]) : _byteWidth = byteWidth ?? 1 << (packedType & 3),
|
|
||||||
_valueType = valueType ?? ValueTypeUtils.fromInt(packedType >> 2);
|
|
||||||
|
|
||||||
/// Use this method to access the root value of a FlexBuffer.
|
/// Use this method to access the root value of a FlexBuffer.
|
||||||
static Reference fromBuffer(ByteBuffer buffer) {
|
static Reference fromBuffer(ByteBuffer buffer) {
|
||||||
@@ -37,13 +31,8 @@ class Reference {
|
|||||||
final byteWidth = byteData.getUint8(len - 1);
|
final byteWidth = byteData.getUint8(len - 1);
|
||||||
final packedType = byteData.getUint8(len - 2);
|
final packedType = byteData.getUint8(len - 2);
|
||||||
final offset = len - byteWidth - 2;
|
final offset = len - byteWidth - 2;
|
||||||
return Reference._(
|
return Reference._(ByteData.view(buffer), offset,
|
||||||
ByteData.view(buffer),
|
BitWidthUtil.fromByteWidth(byteWidth), packedType, "/");
|
||||||
offset,
|
|
||||||
BitWidthUtil.fromByteWidth(byteWidth),
|
|
||||||
packedType,
|
|
||||||
"/",
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns true if the underlying value is null.
|
/// Returns true if the underlying value is null.
|
||||||
@@ -149,8 +138,7 @@ class Reference {
|
|||||||
final index = key;
|
final index = key;
|
||||||
if (index >= length || index < 0) {
|
if (index >= length || index < 0) {
|
||||||
throw ArgumentError(
|
throw ArgumentError(
|
||||||
'Key: [$key] is not applicable on: $_path of: $_valueType length: $length',
|
'Key: [$key] is not applicable on: $_path of: $_valueType length: $length');
|
||||||
);
|
|
||||||
}
|
}
|
||||||
final elementOffset = _indirect + index * _byteWidth;
|
final elementOffset = _indirect + index * _byteWidth;
|
||||||
int packedType = 0;
|
int packedType = 0;
|
||||||
@@ -166,14 +154,13 @@ class Reference {
|
|||||||
packedType = _buffer.getUint8(_indirect + length * _byteWidth + index);
|
packedType = _buffer.getUint8(_indirect + length * _byteWidth + index);
|
||||||
}
|
}
|
||||||
return Reference._(
|
return Reference._(
|
||||||
_buffer,
|
_buffer,
|
||||||
elementOffset,
|
elementOffset,
|
||||||
BitWidthUtil.fromByteWidth(_byteWidth),
|
BitWidthUtil.fromByteWidth(_byteWidth),
|
||||||
packedType,
|
packedType,
|
||||||
"$_path[$index]",
|
"$_path[$index]",
|
||||||
byteWidth,
|
byteWidth,
|
||||||
valueType,
|
valueType);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (key is String && _valueType == ValueType.Map) {
|
if (key is String && _valueType == ValueType.Map) {
|
||||||
final index = _keyIndex(key);
|
final index = _keyIndex(key);
|
||||||
@@ -182,8 +169,7 @@ class Reference {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw ArgumentError(
|
throw ArgumentError(
|
||||||
'Key: [$key] is not applicable on: $_path of: $_valueType',
|
'Key: [$key] is not applicable on: $_path of: $_valueType');
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get an iterable if the underlying flexBuffer value is a vector.
|
/// Get an iterable if the underlying flexBuffer value is a vector.
|
||||||
@@ -227,24 +213,18 @@ class Reference {
|
|||||||
ValueTypeUtils.isAVector(_valueType) ||
|
ValueTypeUtils.isAVector(_valueType) ||
|
||||||
_valueType == ValueType.Map) {
|
_valueType == ValueType.Map) {
|
||||||
_length = _readUInt(
|
_length = _readUInt(
|
||||||
_indirect - _byteWidth,
|
_indirect - _byteWidth, BitWidthUtil.fromByteWidth(_byteWidth));
|
||||||
BitWidthUtil.fromByteWidth(_byteWidth),
|
|
||||||
);
|
|
||||||
} else if (_valueType == ValueType.Null) {
|
} else if (_valueType == ValueType.Null) {
|
||||||
_length = 0;
|
_length = 0;
|
||||||
} else if (_valueType == ValueType.String) {
|
} else if (_valueType == ValueType.String) {
|
||||||
final indirect = _indirect;
|
final indirect = _indirect;
|
||||||
var sizeByteWidth = _byteWidth;
|
var sizeByteWidth = _byteWidth;
|
||||||
var size = _readUInt(
|
var size = _readUInt(indirect - sizeByteWidth,
|
||||||
indirect - sizeByteWidth,
|
BitWidthUtil.fromByteWidth(sizeByteWidth));
|
||||||
BitWidthUtil.fromByteWidth(sizeByteWidth),
|
|
||||||
);
|
|
||||||
while (_buffer.getInt8(indirect + size) != 0) {
|
while (_buffer.getInt8(indirect + size) != 0) {
|
||||||
sizeByteWidth <<= 1;
|
sizeByteWidth <<= 1;
|
||||||
size = _readUInt(
|
size = _readUInt(indirect - sizeByteWidth,
|
||||||
indirect - sizeByteWidth,
|
BitWidthUtil.fromByteWidth(sizeByteWidth));
|
||||||
BitWidthUtil.fromByteWidth(sizeByteWidth),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
_length = size;
|
_length = size;
|
||||||
} else if (_valueType == ValueType.Key) {
|
} else if (_valueType == ValueType.Key) {
|
||||||
@@ -309,8 +289,7 @@ class Reference {
|
|||||||
return result.toString();
|
return result.toString();
|
||||||
}
|
}
|
||||||
throw UnsupportedError(
|
throw UnsupportedError(
|
||||||
'Type: $_valueType is not supported for JSON conversion',
|
'Type: $_valueType is not supported for JSON conversion');
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Computes the indirect offset of the value.
|
/// Computes the indirect offset of the value.
|
||||||
@@ -375,13 +354,10 @@ class Reference {
|
|||||||
int? _keyIndex(String key) {
|
int? _keyIndex(String key) {
|
||||||
final input = utf8.encode(key);
|
final input = utf8.encode(key);
|
||||||
final keysVectorOffset = _indirect - _byteWidth * 3;
|
final keysVectorOffset = _indirect - _byteWidth * 3;
|
||||||
final indirectOffset =
|
final indirectOffset = keysVectorOffset -
|
||||||
keysVectorOffset -
|
|
||||||
_readUInt(keysVectorOffset, BitWidthUtil.fromByteWidth(_byteWidth));
|
_readUInt(keysVectorOffset, BitWidthUtil.fromByteWidth(_byteWidth));
|
||||||
final byteWidth = _readUInt(
|
final byteWidth = _readUInt(
|
||||||
keysVectorOffset + _byteWidth,
|
keysVectorOffset + _byteWidth, BitWidthUtil.fromByteWidth(_byteWidth));
|
||||||
BitWidthUtil.fromByteWidth(_byteWidth),
|
|
||||||
);
|
|
||||||
var low = 0;
|
var low = 0;
|
||||||
var high = length - 1;
|
var high = length - 1;
|
||||||
while (low <= high) {
|
while (low <= high) {
|
||||||
@@ -414,37 +390,24 @@ class Reference {
|
|||||||
final indirect = _indirect;
|
final indirect = _indirect;
|
||||||
final elementOffset = indirect + index * _byteWidth;
|
final elementOffset = indirect + index * _byteWidth;
|
||||||
final packedType = _buffer.getUint8(indirect + length * _byteWidth + index);
|
final packedType = _buffer.getUint8(indirect + length * _byteWidth + index);
|
||||||
return Reference._(
|
return Reference._(_buffer, elementOffset,
|
||||||
_buffer,
|
BitWidthUtil.fromByteWidth(_byteWidth), packedType, "$_path/$key");
|
||||||
elementOffset,
|
|
||||||
BitWidthUtil.fromByteWidth(_byteWidth),
|
|
||||||
packedType,
|
|
||||||
"$_path/$key",
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Reference _valueForIndex(int index) {
|
Reference _valueForIndex(int index) {
|
||||||
final indirect = _indirect;
|
final indirect = _indirect;
|
||||||
final elementOffset = indirect + index * _byteWidth;
|
final elementOffset = indirect + index * _byteWidth;
|
||||||
final packedType = _buffer.getUint8(indirect + length * _byteWidth + index);
|
final packedType = _buffer.getUint8(indirect + length * _byteWidth + index);
|
||||||
return Reference._(
|
return Reference._(_buffer, elementOffset,
|
||||||
_buffer,
|
BitWidthUtil.fromByteWidth(_byteWidth), packedType, "$_path/[$index]");
|
||||||
elementOffset,
|
|
||||||
BitWidthUtil.fromByteWidth(_byteWidth),
|
|
||||||
packedType,
|
|
||||||
"$_path/[$index]",
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String _keyForIndex(int index) {
|
String _keyForIndex(int index) {
|
||||||
final keysVectorOffset = _indirect - _byteWidth * 3;
|
final keysVectorOffset = _indirect - _byteWidth * 3;
|
||||||
final indirectOffset =
|
final indirectOffset = keysVectorOffset -
|
||||||
keysVectorOffset -
|
|
||||||
_readUInt(keysVectorOffset, BitWidthUtil.fromByteWidth(_byteWidth));
|
_readUInt(keysVectorOffset, BitWidthUtil.fromByteWidth(_byteWidth));
|
||||||
final byteWidth = _readUInt(
|
final byteWidth = _readUInt(
|
||||||
keysVectorOffset + _byteWidth,
|
keysVectorOffset + _byteWidth, BitWidthUtil.fromByteWidth(_byteWidth));
|
||||||
BitWidthUtil.fromByteWidth(_byteWidth),
|
|
||||||
);
|
|
||||||
final keyOffset = indirectOffset + index * byteWidth;
|
final keyOffset = indirectOffset + index * byteWidth;
|
||||||
final keyIndirectOffset =
|
final keyIndirectOffset =
|
||||||
keyOffset - _readUInt(keyOffset, BitWidthUtil.fromByteWidth(byteWidth));
|
keyOffset - _readUInt(keyOffset, BitWidthUtil.fromByteWidth(byteWidth));
|
||||||
|
|||||||
@@ -86,8 +86,7 @@ enum ValueType {
|
|||||||
VectorFloat,
|
VectorFloat,
|
||||||
VectorKey,
|
VectorKey,
|
||||||
@Deprecated(
|
@Deprecated(
|
||||||
'VectorString is deprecated due to a flaw in the binary format (https://github.com/google/flatbuffers/issues/5627)',
|
'VectorString is deprecated due to a flaw in the binary format (https://github.com/google/flatbuffers/issues/5627)')
|
||||||
)
|
|
||||||
VectorString,
|
VectorString,
|
||||||
VectorInt2,
|
VectorInt2,
|
||||||
VectorUInt2,
|
VectorUInt2,
|
||||||
@@ -100,7 +99,7 @@ enum ValueType {
|
|||||||
VectorFloat4,
|
VectorFloat4,
|
||||||
Blob,
|
Blob,
|
||||||
Bool,
|
Bool,
|
||||||
VectorBool,
|
VectorBool
|
||||||
}
|
}
|
||||||
|
|
||||||
class ValueTypeUtils {
|
class ValueTypeUtils {
|
||||||
@@ -154,37 +153,31 @@ class ValueTypeUtils {
|
|||||||
static ValueType toTypedVector(ValueType self, int length) {
|
static ValueType toTypedVector(ValueType self, int length) {
|
||||||
if (length == 0) {
|
if (length == 0) {
|
||||||
return ValueTypeUtils.fromInt(
|
return ValueTypeUtils.fromInt(
|
||||||
toInt(self) - toInt(ValueType.Int) + toInt(ValueType.VectorInt),
|
toInt(self) - toInt(ValueType.Int) + toInt(ValueType.VectorInt));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (length == 2) {
|
if (length == 2) {
|
||||||
return ValueTypeUtils.fromInt(
|
return ValueTypeUtils.fromInt(
|
||||||
toInt(self) - toInt(ValueType.Int) + toInt(ValueType.VectorInt2),
|
toInt(self) - toInt(ValueType.Int) + toInt(ValueType.VectorInt2));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (length == 3) {
|
if (length == 3) {
|
||||||
return ValueTypeUtils.fromInt(
|
return ValueTypeUtils.fromInt(
|
||||||
toInt(self) - toInt(ValueType.Int) + toInt(ValueType.VectorInt3),
|
toInt(self) - toInt(ValueType.Int) + toInt(ValueType.VectorInt3));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (length == 4) {
|
if (length == 4) {
|
||||||
return ValueTypeUtils.fromInt(
|
return ValueTypeUtils.fromInt(
|
||||||
toInt(self) - toInt(ValueType.Int) + toInt(ValueType.VectorInt4),
|
toInt(self) - toInt(ValueType.Int) + toInt(ValueType.VectorInt4));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
throw Exception('unexpected length ' + length.toString());
|
throw Exception('unexpected length ' + length.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
static ValueType typedVectorElementType(ValueType self) {
|
static ValueType typedVectorElementType(ValueType self) {
|
||||||
return ValueTypeUtils.fromInt(
|
return ValueTypeUtils.fromInt(
|
||||||
toInt(self) - toInt(ValueType.VectorInt) + toInt(ValueType.Int),
|
toInt(self) - toInt(ValueType.VectorInt) + toInt(ValueType.Int));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ValueType fixedTypedVectorElementType(ValueType self) {
|
static ValueType fixedTypedVectorElementType(ValueType self) {
|
||||||
return ValueTypeUtils.fromInt(
|
return ValueTypeUtils.fromInt(
|
||||||
(toInt(self) - toInt(ValueType.VectorInt2)) % 3 + toInt(ValueType.Int),
|
(toInt(self) - toInt(ValueType.VectorInt2)) % 3 + toInt(ValueType.Int));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fixedTypedVectorElementSize(ValueType self) {
|
static int fixedTypedVectorElementSize(ValueType self) {
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
name: flat_buffers
|
name: flat_buffers
|
||||||
version: 25.12.19
|
version: 24.3.6
|
||||||
description: FlatBuffers reading and writing library for Dart. Based on original work by Konstantin Scheglov and Paul Berry of the Dart SDK team.
|
description: FlatBuffers reading and writing library for Dart. Based on original work by Konstantin Scheglov and Paul Berry of the Dart SDK team.
|
||||||
homepage: https://github.com/google/flatbuffers
|
homepage: https://github.com/google/flatbuffers
|
||||||
documentation: https://google.github.io/flatbuffers/index.html
|
documentation: https://google.github.io/flatbuffers/index.html
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=2.17.0 <4.0.0'
|
sdk: '>=2.12.0 <4.0.0'
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
test: ^1.17.7
|
test: ^1.17.7
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
// automatically generated by the FlatBuffers compiler, do not modify
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names
|
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable
|
||||||
|
|
||||||
import 'dart:typed_data' show Uint8List;
|
import 'dart:typed_data' show Uint8List;
|
||||||
|
|
||||||
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
||||||
|
|
||||||
|
|
||||||
class Foo {
|
class Foo {
|
||||||
Foo._(this._bc, this._bcOffset);
|
Foo._(this._bc, this._bcOffset);
|
||||||
factory Foo(List<int> bytes) {
|
factory Foo(List<int> bytes) {
|
||||||
@@ -17,15 +17,15 @@ class Foo {
|
|||||||
final fb.BufferContext _bc;
|
final fb.BufferContext _bc;
|
||||||
final int _bcOffset;
|
final int _bcOffset;
|
||||||
|
|
||||||
FooProperties? get myFoo =>
|
FooProperties? get myFoo => FooProperties.reader.vTableGetNullable(_bc, _bcOffset, 4);
|
||||||
FooProperties.reader.vTableGetNullable(_bc, _bcOffset, 4);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'Foo{myFoo: ${myFoo}}';
|
return 'Foo{myFoo: ${myFoo}}';
|
||||||
}
|
}
|
||||||
|
|
||||||
FooT unpack() => FooT(myFoo: myFoo?.unpack());
|
FooT unpack() => FooT(
|
||||||
|
myFoo: myFoo?.unpack());
|
||||||
|
|
||||||
static int pack(fb.Builder fbBuilder, FooT? object) {
|
static int pack(fb.Builder fbBuilder, FooT? object) {
|
||||||
if (object == null) return 0;
|
if (object == null) return 0;
|
||||||
@@ -36,7 +36,8 @@ class Foo {
|
|||||||
class FooT implements fb.Packable {
|
class FooT implements fb.Packable {
|
||||||
FooPropertiesT? myFoo;
|
FooPropertiesT? myFoo;
|
||||||
|
|
||||||
FooT({this.myFoo});
|
FooT({
|
||||||
|
this.myFoo});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int pack(fb.Builder fbBuilder) {
|
int pack(fb.Builder fbBuilder) {
|
||||||
@@ -57,7 +58,8 @@ class _FooReader extends fb.TableReader<Foo> {
|
|||||||
const _FooReader();
|
const _FooReader();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Foo createObject(fb.BufferContext bc, int offset) => Foo._(bc, offset);
|
Foo createObject(fb.BufferContext bc, int offset) =>
|
||||||
|
Foo._(bc, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
class FooBuilder {
|
class FooBuilder {
|
||||||
@@ -82,7 +84,10 @@ class FooBuilder {
|
|||||||
class FooObjectBuilder extends fb.ObjectBuilder {
|
class FooObjectBuilder extends fb.ObjectBuilder {
|
||||||
final FooPropertiesObjectBuilder? _myFoo;
|
final FooPropertiesObjectBuilder? _myFoo;
|
||||||
|
|
||||||
FooObjectBuilder({FooPropertiesObjectBuilder? myFoo}) : _myFoo = myFoo;
|
FooObjectBuilder({
|
||||||
|
FooPropertiesObjectBuilder? myFoo,
|
||||||
|
})
|
||||||
|
: _myFoo = myFoo;
|
||||||
|
|
||||||
/// Finish building, and store into the [fbBuilder].
|
/// Finish building, and store into the [fbBuilder].
|
||||||
@override
|
@override
|
||||||
@@ -102,7 +107,6 @@ class FooObjectBuilder extends fb.ObjectBuilder {
|
|||||||
return fbBuilder.buffer;
|
return fbBuilder.buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class FooProperties {
|
class FooProperties {
|
||||||
FooProperties._(this._bc, this._bcOffset);
|
FooProperties._(this._bc, this._bcOffset);
|
||||||
|
|
||||||
@@ -119,7 +123,9 @@ class FooProperties {
|
|||||||
return 'FooProperties{a: ${a}, b: ${b}}';
|
return 'FooProperties{a: ${a}, b: ${b}}';
|
||||||
}
|
}
|
||||||
|
|
||||||
FooPropertiesT unpack() => FooPropertiesT(a: a, b: b);
|
FooPropertiesT unpack() => FooPropertiesT(
|
||||||
|
a: a,
|
||||||
|
b: b);
|
||||||
|
|
||||||
static int pack(fb.Builder fbBuilder, FooPropertiesT? object) {
|
static int pack(fb.Builder fbBuilder, FooPropertiesT? object) {
|
||||||
if (object == null) return 0;
|
if (object == null) return 0;
|
||||||
@@ -131,7 +137,9 @@ class FooPropertiesT implements fb.Packable {
|
|||||||
bool a;
|
bool a;
|
||||||
bool b;
|
bool b;
|
||||||
|
|
||||||
FooPropertiesT({required this.a, required this.b});
|
FooPropertiesT({
|
||||||
|
required this.a,
|
||||||
|
required this.b});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int pack(fb.Builder fbBuilder) {
|
int pack(fb.Builder fbBuilder) {
|
||||||
@@ -153,8 +161,8 @@ class _FooPropertiesReader extends fb.StructReader<FooProperties> {
|
|||||||
int get size => 2;
|
int get size => 2;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FooProperties createObject(fb.BufferContext bc, int offset) =>
|
FooProperties createObject(fb.BufferContext bc, int offset) =>
|
||||||
FooProperties._(bc, offset);
|
FooProperties._(bc, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
class FooPropertiesBuilder {
|
class FooPropertiesBuilder {
|
||||||
@@ -167,15 +175,19 @@ class FooPropertiesBuilder {
|
|||||||
fbBuilder.putBool(a);
|
fbBuilder.putBool(a);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class FooPropertiesObjectBuilder extends fb.ObjectBuilder {
|
class FooPropertiesObjectBuilder extends fb.ObjectBuilder {
|
||||||
final bool _a;
|
final bool _a;
|
||||||
final bool _b;
|
final bool _b;
|
||||||
|
|
||||||
FooPropertiesObjectBuilder({required bool a, required bool b})
|
FooPropertiesObjectBuilder({
|
||||||
: _a = a,
|
required bool a,
|
||||||
_b = b;
|
required bool b,
|
||||||
|
})
|
||||||
|
: _a = a,
|
||||||
|
_b = b;
|
||||||
|
|
||||||
/// Finish building, and store into the [fbBuilder].
|
/// Finish building, and store into the [fbBuilder].
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
import 'dart:io' as io;
|
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
import 'dart:io' as io;
|
||||||
|
|
||||||
|
import 'package:path/path.dart' as path;
|
||||||
|
|
||||||
import 'package:flat_buffers/flat_buffers.dart';
|
import 'package:flat_buffers/flat_buffers.dart';
|
||||||
import 'package:path/path.dart' as path;
|
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
import 'package:test_reflective_loader/test_reflective_loader.dart';
|
import 'package:test_reflective_loader/test_reflective_loader.dart';
|
||||||
|
|
||||||
import './bool_structs_generated.dart' as example4;
|
|
||||||
import './monster_test_my_game.example2_generated.dart' as example2;
|
|
||||||
import './monster_test_my_game.example_generated.dart' as example;
|
import './monster_test_my_game.example_generated.dart' as example;
|
||||||
import 'enums_generated.dart' as example3;
|
import './monster_test_my_game.example2_generated.dart' as example2;
|
||||||
|
import './list_of_enums_generated.dart' as example3;
|
||||||
|
import './bool_structs_generated.dart' as example4;
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
defineReflectiveSuite(() {
|
defineReflectiveSuite(() {
|
||||||
@@ -28,9 +29,11 @@ int indexToField(int index) {
|
|||||||
@reflectiveTest
|
@reflectiveTest
|
||||||
class CheckOtherLangaugesData {
|
class CheckOtherLangaugesData {
|
||||||
test_cppData() async {
|
test_cppData() async {
|
||||||
List<int> data = await io.File(
|
List<int> data = await io.File(path.join(
|
||||||
path.join(path.context.current, 'test', 'monsterdata_test.mon'),
|
path.context.current,
|
||||||
).readAsBytes();
|
'test',
|
||||||
|
'monsterdata_test.mon',
|
||||||
|
)).readAsBytes();
|
||||||
example.Monster mon = example.Monster(data);
|
example.Monster mon = example.Monster(data);
|
||||||
expect(mon.hp, 80);
|
expect(mon.hp, 80);
|
||||||
expect(mon.mana, 150);
|
expect(mon.mana, 150);
|
||||||
@@ -58,92 +61,91 @@ class CheckOtherLangaugesData {
|
|||||||
|
|
||||||
// this will fail if accessing any field fails.
|
// this will fail if accessing any field fails.
|
||||||
expect(
|
expect(
|
||||||
mon.toString(),
|
mon.toString(),
|
||||||
'Monster{'
|
'Monster{'
|
||||||
'pos: Vec3{x: 1.0, y: 2.0, z: 3.0, test1: 3.0, test2: Color.Green, test3: Test{a: 5, b: 6}}, '
|
'pos: Vec3{x: 1.0, y: 2.0, z: 3.0, test1: 3.0, test2: Color{value: 2}, test3: Test{a: 5, b: 6}}, '
|
||||||
'mana: 150, hp: 80, name: MyMonster, inventory: [0, 1, 2, 3, 4], '
|
'mana: 150, hp: 80, name: MyMonster, inventory: [0, 1, 2, 3, 4], '
|
||||||
'color: Color.Blue, testType: AnyTypeId.Monster, '
|
'color: Color{value: 8}, testType: AnyTypeId{value: 1}, '
|
||||||
'test: Monster{pos: null, mana: 150, hp: 100, name: Fred, '
|
'test: Monster{pos: null, mana: 150, hp: 100, name: Fred, '
|
||||||
'inventory: null, color: Color.Blue, testType: null, '
|
'inventory: null, color: Color{value: 8}, testType: null, '
|
||||||
'test: null, test4: null, testarrayofstring: null, '
|
'test: null, test4: null, testarrayofstring: null, '
|
||||||
'testarrayoftables: null, enemy: null, testnestedflatbuffer: null, '
|
'testarrayoftables: null, enemy: null, testnestedflatbuffer: null, '
|
||||||
'testempty: null, testbool: false, testhashs32Fnv1: 0, '
|
'testempty: null, testbool: false, testhashs32Fnv1: 0, '
|
||||||
'testhashu32Fnv1: 0, testhashs64Fnv1: 0, testhashu64Fnv1: 0, '
|
'testhashu32Fnv1: 0, testhashs64Fnv1: 0, testhashu64Fnv1: 0, '
|
||||||
'testhashs32Fnv1a: 0, testhashu32Fnv1a: 0, testhashs64Fnv1a: 0, '
|
'testhashs32Fnv1a: 0, testhashu32Fnv1a: 0, testhashs64Fnv1a: 0, '
|
||||||
'testhashu64Fnv1a: 0, testarrayofbools: null, testf: 3.14159, '
|
'testhashu64Fnv1a: 0, testarrayofbools: null, testf: 3.14159, '
|
||||||
'testf2: 3.0, testf3: 0.0, testarrayofstring2: null, '
|
'testf2: 3.0, testf3: 0.0, testarrayofstring2: null, '
|
||||||
'testarrayofsortedstruct: null, flex: null, test5: null, '
|
'testarrayofsortedstruct: null, flex: null, test5: null, '
|
||||||
'vectorOfLongs: null, vectorOfDoubles: null, parentNamespaceTest: null, '
|
'vectorOfLongs: null, vectorOfDoubles: null, parentNamespaceTest: null, '
|
||||||
'vectorOfReferrables: null, singleWeakReference: 0, '
|
'vectorOfReferrables: null, singleWeakReference: 0, '
|
||||||
'vectorOfWeakReferences: null, vectorOfStrongReferrables: null, '
|
'vectorOfWeakReferences: null, vectorOfStrongReferrables: null, '
|
||||||
'coOwningReference: 0, vectorOfCoOwningReferences: null, '
|
'coOwningReference: 0, vectorOfCoOwningReferences: null, '
|
||||||
'nonOwningReference: 0, vectorOfNonOwningReferences: null, '
|
'nonOwningReference: 0, vectorOfNonOwningReferences: null, '
|
||||||
'anyUniqueType: null, anyUnique: null, anyAmbiguousType: null, '
|
'anyUniqueType: null, anyUnique: null, anyAmbiguousType: null, '
|
||||||
'anyAmbiguous: null, vectorOfEnums: null, signedEnum: Race.None, '
|
'anyAmbiguous: null, vectorOfEnums: null, signedEnum: Race{value: -1}, '
|
||||||
'testrequirednestedflatbuffer: null, scalarKeySortedTables: null, '
|
'testrequirednestedflatbuffer: null, scalarKeySortedTables: null, '
|
||||||
'nativeInline: null, '
|
'nativeInline: null, '
|
||||||
'longEnumNonEnumDefault: LongEnum._default, '
|
'longEnumNonEnumDefault: LongEnum{value: 0}, '
|
||||||
'longEnumNormalDefault: LongEnum.LongOne, nanDefault: NaN, '
|
'longEnumNormalDefault: LongEnum{value: 2}, nanDefault: NaN, '
|
||||||
'infDefault: Infinity, positiveInfDefault: Infinity, infinityDefault: '
|
'infDefault: Infinity, positiveInfDefault: Infinity, infinityDefault: '
|
||||||
'Infinity, positiveInfinityDefault: Infinity, negativeInfDefault: '
|
'Infinity, positiveInfinityDefault: Infinity, negativeInfDefault: '
|
||||||
'-Infinity, negativeInfinityDefault: -Infinity, doubleInfDefault: Infinity}, '
|
'-Infinity, negativeInfinityDefault: -Infinity, doubleInfDefault: Infinity}, '
|
||||||
'test4: [Test{a: 10, b: 20}, Test{a: 30, b: 40}], '
|
'test4: [Test{a: 10, b: 20}, Test{a: 30, b: 40}], '
|
||||||
'testarrayofstring: [test1, test2], testarrayoftables: null, '
|
'testarrayofstring: [test1, test2], testarrayoftables: null, '
|
||||||
'enemy: Monster{pos: null, mana: 150, hp: 100, name: Fred, '
|
'enemy: Monster{pos: null, mana: 150, hp: 100, name: Fred, '
|
||||||
'inventory: null, color: Color.Blue, testType: null, '
|
'inventory: null, color: Color{value: 8}, testType: null, '
|
||||||
'test: null, test4: null, testarrayofstring: null, '
|
'test: null, test4: null, testarrayofstring: null, '
|
||||||
'testarrayoftables: null, enemy: null, testnestedflatbuffer: null, '
|
'testarrayoftables: null, enemy: null, testnestedflatbuffer: null, '
|
||||||
'testempty: null, testbool: false, testhashs32Fnv1: 0, '
|
'testempty: null, testbool: false, testhashs32Fnv1: 0, '
|
||||||
'testhashu32Fnv1: 0, testhashs64Fnv1: 0, testhashu64Fnv1: 0, '
|
'testhashu32Fnv1: 0, testhashs64Fnv1: 0, testhashu64Fnv1: 0, '
|
||||||
'testhashs32Fnv1a: 0, testhashu32Fnv1a: 0, testhashs64Fnv1a: 0, '
|
'testhashs32Fnv1a: 0, testhashu32Fnv1a: 0, testhashs64Fnv1a: 0, '
|
||||||
'testhashu64Fnv1a: 0, testarrayofbools: null, testf: 3.14159, '
|
'testhashu64Fnv1a: 0, testarrayofbools: null, testf: 3.14159, '
|
||||||
'testf2: 3.0, testf3: 0.0, testarrayofstring2: null, '
|
'testf2: 3.0, testf3: 0.0, testarrayofstring2: null, '
|
||||||
'testarrayofsortedstruct: null, flex: null, test5: null, '
|
'testarrayofsortedstruct: null, flex: null, test5: null, '
|
||||||
'vectorOfLongs: null, vectorOfDoubles: null, parentNamespaceTest: null, '
|
'vectorOfLongs: null, vectorOfDoubles: null, parentNamespaceTest: null, '
|
||||||
'vectorOfReferrables: null, singleWeakReference: 0, '
|
'vectorOfReferrables: null, singleWeakReference: 0, '
|
||||||
'vectorOfWeakReferences: null, vectorOfStrongReferrables: null, '
|
'vectorOfWeakReferences: null, vectorOfStrongReferrables: null, '
|
||||||
'coOwningReference: 0, vectorOfCoOwningReferences: null, '
|
'coOwningReference: 0, vectorOfCoOwningReferences: null, '
|
||||||
'nonOwningReference: 0, vectorOfNonOwningReferences: null, '
|
'nonOwningReference: 0, vectorOfNonOwningReferences: null, '
|
||||||
'anyUniqueType: null, anyUnique: null, anyAmbiguousType: null, '
|
'anyUniqueType: null, anyUnique: null, anyAmbiguousType: null, '
|
||||||
'anyAmbiguous: null, vectorOfEnums: null, signedEnum: Race.None, '
|
'anyAmbiguous: null, vectorOfEnums: null, signedEnum: Race{value: -1}, '
|
||||||
'testrequirednestedflatbuffer: null, scalarKeySortedTables: null, '
|
'testrequirednestedflatbuffer: null, scalarKeySortedTables: null, '
|
||||||
'nativeInline: null, '
|
'nativeInline: null, '
|
||||||
'longEnumNonEnumDefault: LongEnum._default, '
|
'longEnumNonEnumDefault: LongEnum{value: 0}, '
|
||||||
'longEnumNormalDefault: LongEnum.LongOne, nanDefault: NaN, '
|
'longEnumNormalDefault: LongEnum{value: 2}, nanDefault: NaN, '
|
||||||
'infDefault: Infinity, positiveInfDefault: Infinity, infinityDefault: '
|
'infDefault: Infinity, positiveInfDefault: Infinity, infinityDefault: '
|
||||||
'Infinity, positiveInfinityDefault: Infinity, negativeInfDefault: '
|
'Infinity, positiveInfinityDefault: Infinity, negativeInfDefault: '
|
||||||
'-Infinity, negativeInfinityDefault: -Infinity, doubleInfDefault: Infinity}, '
|
'-Infinity, negativeInfinityDefault: -Infinity, doubleInfDefault: Infinity}, '
|
||||||
'testnestedflatbuffer: null, testempty: null, testbool: true, '
|
'testnestedflatbuffer: null, testempty: null, testbool: true, '
|
||||||
'testhashs32Fnv1: -579221183, testhashu32Fnv1: 3715746113, '
|
'testhashs32Fnv1: -579221183, testhashu32Fnv1: 3715746113, '
|
||||||
'testhashs64Fnv1: 7930699090847568257, '
|
'testhashs64Fnv1: 7930699090847568257, '
|
||||||
'testhashu64Fnv1: 7930699090847568257, '
|
'testhashu64Fnv1: 7930699090847568257, '
|
||||||
'testhashs32Fnv1a: -1904106383, testhashu32Fnv1a: 2390860913, '
|
'testhashs32Fnv1a: -1904106383, testhashu32Fnv1a: 2390860913, '
|
||||||
'testhashs64Fnv1a: 4898026182817603057, '
|
'testhashs64Fnv1a: 4898026182817603057, '
|
||||||
'testhashu64Fnv1a: 4898026182817603057, '
|
'testhashu64Fnv1a: 4898026182817603057, '
|
||||||
'testarrayofbools: [true, false, true], testf: 3.14159, testf2: 3.0, '
|
'testarrayofbools: [true, false, true], testf: 3.14159, testf2: 3.0, '
|
||||||
'testf3: 0.0, testarrayofstring2: null, testarrayofsortedstruct: ['
|
'testf3: 0.0, testarrayofstring2: null, testarrayofsortedstruct: ['
|
||||||
'Ability{id: 0, distance: 45}, Ability{id: 1, distance: 21}, '
|
'Ability{id: 0, distance: 45}, Ability{id: 1, distance: 21}, '
|
||||||
'Ability{id: 5, distance: 12}], '
|
'Ability{id: 5, distance: 12}], '
|
||||||
'flex: null, test5: [Test{a: 10, b: 20}, Test{a: 30, b: 40}], '
|
'flex: null, test5: [Test{a: 10, b: 20}, Test{a: 30, b: 40}], '
|
||||||
'vectorOfLongs: [1, 100, 10000, 1000000, 100000000], '
|
'vectorOfLongs: [1, 100, 10000, 1000000, 100000000], '
|
||||||
'vectorOfDoubles: [-1.7976931348623157e+308, 0.0, 1.7976931348623157e+308], '
|
'vectorOfDoubles: [-1.7976931348623157e+308, 0.0, 1.7976931348623157e+308], '
|
||||||
'parentNamespaceTest: null, vectorOfReferrables: null, '
|
'parentNamespaceTest: null, vectorOfReferrables: null, '
|
||||||
'singleWeakReference: 0, vectorOfWeakReferences: null, '
|
'singleWeakReference: 0, vectorOfWeakReferences: null, '
|
||||||
'vectorOfStrongReferrables: null, coOwningReference: 0, '
|
'vectorOfStrongReferrables: null, coOwningReference: 0, '
|
||||||
'vectorOfCoOwningReferences: null, nonOwningReference: 0, '
|
'vectorOfCoOwningReferences: null, nonOwningReference: 0, '
|
||||||
'vectorOfNonOwningReferences: null, '
|
'vectorOfNonOwningReferences: null, '
|
||||||
'anyUniqueType: null, anyUnique: null, '
|
'anyUniqueType: null, anyUnique: null, '
|
||||||
'anyAmbiguousType: null, '
|
'anyAmbiguousType: null, '
|
||||||
'anyAmbiguous: null, vectorOfEnums: null, signedEnum: Race.None, '
|
'anyAmbiguous: null, vectorOfEnums: null, signedEnum: Race{value: -1}, '
|
||||||
'testrequirednestedflatbuffer: null, scalarKeySortedTables: [Stat{id: '
|
'testrequirednestedflatbuffer: null, scalarKeySortedTables: [Stat{id: '
|
||||||
'miss, val: 0, count: 0}, Stat{id: hit, val: 10, count: 1}], '
|
'miss, val: 0, count: 0}, Stat{id: hit, val: 10, count: 1}], '
|
||||||
'nativeInline: Test{a: 1, b: 2}, '
|
'nativeInline: Test{a: 1, b: 2}, '
|
||||||
'longEnumNonEnumDefault: LongEnum._default, '
|
'longEnumNonEnumDefault: LongEnum{value: 0}, '
|
||||||
'longEnumNormalDefault: LongEnum.LongOne, nanDefault: NaN, '
|
'longEnumNormalDefault: LongEnum{value: 2}, nanDefault: NaN, '
|
||||||
'infDefault: Infinity, positiveInfDefault: Infinity, infinityDefault: '
|
'infDefault: Infinity, positiveInfDefault: Infinity, infinityDefault: '
|
||||||
'Infinity, positiveInfinityDefault: Infinity, negativeInfDefault: '
|
'Infinity, positiveInfinityDefault: Infinity, negativeInfDefault: '
|
||||||
'-Infinity, negativeInfinityDefault: -Infinity, doubleInfDefault: Infinity}',
|
'-Infinity, negativeInfinityDefault: -Infinity, doubleInfDefault: Infinity}');
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,10 +215,6 @@ class BuilderTest {
|
|||||||
..addTestarrayofstringOffset(testArrayOfString);
|
..addTestarrayofstringOffset(testArrayOfString);
|
||||||
final mon = monBuilder.finish();
|
final mon = monBuilder.finish();
|
||||||
fbBuilder.finish(mon);
|
fbBuilder.finish(mon);
|
||||||
|
|
||||||
final mon3 = example.Monster(fbBuilder.buffer);
|
|
||||||
expect(mon3.name, 'MyMonster');
|
|
||||||
expect(mon3.pos!.test1, 3.0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_error_addInt32_withoutStartTable([Builder? builder]) {
|
void test_error_addInt32_withoutStartTable([Builder? builder]) {
|
||||||
@@ -296,72 +294,20 @@ class BuilderTest {
|
|||||||
expect(allocator.buffer(builder.size()), [2, 0, 0, 0, 0, 0, 0, 1]);
|
expect(allocator.buffer(builder.size()), [2, 0, 0, 0, 0, 0, 0, 1]);
|
||||||
|
|
||||||
builder.putUint8(3);
|
builder.putUint8(3);
|
||||||
expect(allocator.buffer(builder.size()), [
|
expect(
|
||||||
0,
|
allocator.buffer(builder.size()), [0, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0, 1]);
|
||||||
0,
|
|
||||||
0,
|
|
||||||
3,
|
|
||||||
2,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
]);
|
|
||||||
|
|
||||||
builder.putUint8(4);
|
builder.putUint8(4);
|
||||||
expect(allocator.buffer(builder.size()), [
|
expect(
|
||||||
0,
|
allocator.buffer(builder.size()), [0, 0, 4, 3, 2, 0, 0, 0, 0, 0, 0, 1]);
|
||||||
0,
|
|
||||||
4,
|
|
||||||
3,
|
|
||||||
2,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
]);
|
|
||||||
|
|
||||||
builder.putUint8(5);
|
builder.putUint8(5);
|
||||||
expect(allocator.buffer(builder.size()), [
|
expect(
|
||||||
0,
|
allocator.buffer(builder.size()), [0, 5, 4, 3, 2, 0, 0, 0, 0, 0, 0, 1]);
|
||||||
5,
|
|
||||||
4,
|
|
||||||
3,
|
|
||||||
2,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
]);
|
|
||||||
|
|
||||||
builder.putUint32(6);
|
builder.putUint32(6);
|
||||||
expect(allocator.buffer(builder.size()), [
|
expect(allocator.buffer(builder.size()),
|
||||||
6,
|
[6, 0, 0, 0, 0, 5, 4, 3, 2, 0, 0, 0, 0, 0, 0, 1]);
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
5,
|
|
||||||
4,
|
|
||||||
3,
|
|
||||||
2,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_table_default() {
|
void test_table_default() {
|
||||||
@@ -381,14 +327,14 @@ class BuilderTest {
|
|||||||
int objectOffset = buffer.derefObject(0);
|
int objectOffset = buffer.derefObject(0);
|
||||||
// was not written, so uses the new default value
|
// was not written, so uses the new default value
|
||||||
expect(
|
expect(
|
||||||
const Int32Reader().vTableGet(buffer, objectOffset, indexToField(0), 15),
|
const Int32Reader()
|
||||||
15,
|
.vTableGet(buffer, objectOffset, indexToField(0), 15),
|
||||||
);
|
15);
|
||||||
// has the written value
|
// has the written value
|
||||||
expect(
|
expect(
|
||||||
const Int32Reader().vTableGet(buffer, objectOffset, indexToField(1), 15),
|
const Int32Reader()
|
||||||
20,
|
.vTableGet(buffer, objectOffset, indexToField(1), 15),
|
||||||
);
|
20);
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_table_format([Builder? builder]) {
|
void test_table_format([Builder? builder]) {
|
||||||
@@ -420,9 +366,7 @@ class BuilderTest {
|
|||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
int offset = byteData.getUint16(vTableLoc + 4 + 2 * i, Endian.little);
|
int offset = byteData.getUint16(vTableLoc + 4 + 2 * i, Endian.little);
|
||||||
expect(
|
expect(
|
||||||
byteData.getInt32(tableDataLoc + offset, Endian.little),
|
byteData.getInt32(tableDataLoc + offset, Endian.little), 10 + 10 * i);
|
||||||
10 + 10 * i,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -432,14 +376,10 @@ class BuilderTest {
|
|||||||
List<int> byteList;
|
List<int> byteList;
|
||||||
{
|
{
|
||||||
Builder builder = Builder(initialSize: 0);
|
Builder builder = Builder(initialSize: 0);
|
||||||
int? latinStringOffset = builder.writeString(
|
int? latinStringOffset =
|
||||||
latinString,
|
builder.writeString(latinString, asciiOptimization: true);
|
||||||
asciiOptimization: true,
|
int? unicodeStringOffset =
|
||||||
);
|
builder.writeString(unicodeString, asciiOptimization: true);
|
||||||
int? unicodeStringOffset = builder.writeString(
|
|
||||||
unicodeString,
|
|
||||||
asciiOptimization: true,
|
|
||||||
);
|
|
||||||
builder.startTable(2);
|
builder.startTable(2);
|
||||||
builder.addOffset(0, latinStringOffset);
|
builder.addOffset(0, latinStringOffset);
|
||||||
builder.addOffset(1, unicodeStringOffset);
|
builder.addOffset(1, unicodeStringOffset);
|
||||||
@@ -451,19 +391,13 @@ class BuilderTest {
|
|||||||
BufferContext buf = BufferContext.fromBytes(byteList);
|
BufferContext buf = BufferContext.fromBytes(byteList);
|
||||||
int objectOffset = buf.derefObject(0);
|
int objectOffset = buf.derefObject(0);
|
||||||
expect(
|
expect(
|
||||||
const StringReader().vTableGetNullable(
|
const StringReader()
|
||||||
buf,
|
.vTableGetNullable(buf, objectOffset, indexToField(0)),
|
||||||
objectOffset,
|
latinString);
|
||||||
indexToField(0),
|
|
||||||
),
|
|
||||||
latinString,
|
|
||||||
);
|
|
||||||
expect(
|
expect(
|
||||||
const StringReader(
|
const StringReader(asciiOptimization: true)
|
||||||
asciiOptimization: true,
|
.vTableGetNullable(buf, objectOffset, indexToField(1)),
|
||||||
).vTableGetNullable(buf, objectOffset, indexToField(1)),
|
unicodeString);
|
||||||
unicodeString,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_table_types([Builder? builder]) {
|
void test_table_types([Builder? builder]) {
|
||||||
@@ -487,41 +421,33 @@ class BuilderTest {
|
|||||||
BufferContext buf = BufferContext.fromBytes(byteList);
|
BufferContext buf = BufferContext.fromBytes(byteList);
|
||||||
int objectOffset = buf.derefObject(0);
|
int objectOffset = buf.derefObject(0);
|
||||||
expect(
|
expect(
|
||||||
const BoolReader().vTableGetNullable(buf, objectOffset, indexToField(0)),
|
const BoolReader()
|
||||||
true,
|
.vTableGetNullable(buf, objectOffset, indexToField(0)),
|
||||||
);
|
true);
|
||||||
expect(
|
expect(
|
||||||
const Int8Reader().vTableGetNullable(buf, objectOffset, indexToField(1)),
|
const Int8Reader()
|
||||||
10,
|
.vTableGetNullable(buf, objectOffset, indexToField(1)),
|
||||||
);
|
10);
|
||||||
expect(
|
expect(
|
||||||
const Int32Reader().vTableGetNullable(buf, objectOffset, indexToField(2)),
|
const Int32Reader()
|
||||||
20,
|
.vTableGetNullable(buf, objectOffset, indexToField(2)),
|
||||||
);
|
20);
|
||||||
expect(
|
expect(
|
||||||
const StringReader().vTableGetNullable(
|
const StringReader()
|
||||||
buf,
|
.vTableGetNullable(buf, objectOffset, indexToField(3)),
|
||||||
objectOffset,
|
'12345');
|
||||||
indexToField(3),
|
|
||||||
),
|
|
||||||
'12345',
|
|
||||||
);
|
|
||||||
expect(
|
expect(
|
||||||
const Int32Reader().vTableGetNullable(buf, objectOffset, indexToField(4)),
|
const Int32Reader()
|
||||||
40,
|
.vTableGetNullable(buf, objectOffset, indexToField(4)),
|
||||||
);
|
40);
|
||||||
expect(
|
expect(
|
||||||
const Uint32Reader().vTableGetNullable(
|
const Uint32Reader()
|
||||||
buf,
|
.vTableGetNullable(buf, objectOffset, indexToField(5)),
|
||||||
objectOffset,
|
0x9ABCDEF0);
|
||||||
indexToField(5),
|
|
||||||
),
|
|
||||||
0x9ABCDEF0,
|
|
||||||
);
|
|
||||||
expect(
|
expect(
|
||||||
const Uint8Reader().vTableGetNullable(buf, objectOffset, indexToField(6)),
|
const Uint8Reader()
|
||||||
0x9A,
|
.vTableGetNullable(buf, objectOffset, indexToField(6)),
|
||||||
);
|
0x9A);
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_writeList_of_Uint32() {
|
void test_writeList_of_Uint32() {
|
||||||
@@ -666,9 +592,8 @@ class BuilderTest {
|
|||||||
}
|
}
|
||||||
// read and verify
|
// read and verify
|
||||||
BufferContext buf = BufferContext.fromBytes(byteList);
|
BufferContext buf = BufferContext.fromBytes(byteList);
|
||||||
List<TestPointImpl> items = const ListReader<TestPointImpl>(
|
List<TestPointImpl> items =
|
||||||
TestPointReader(),
|
const ListReader<TestPointImpl>(TestPointReader()).read(buf, 0);
|
||||||
).read(buf, 0);
|
|
||||||
expect(items, hasLength(2));
|
expect(items, hasLength(2));
|
||||||
expect(items[0].x, 10);
|
expect(items[0].x, 10);
|
||||||
expect(items[0].y, 20);
|
expect(items[0].y, 20);
|
||||||
@@ -698,10 +623,8 @@ class BuilderTest {
|
|||||||
List<int> byteList;
|
List<int> byteList;
|
||||||
{
|
{
|
||||||
builder ??= Builder(initialSize: 0);
|
builder ??= Builder(initialSize: 0);
|
||||||
int listOffset = builder.writeList([
|
int listOffset = builder.writeList(
|
||||||
builder.writeString('12345'),
|
[builder.writeString('12345'), builder.writeString('ABC')]);
|
||||||
builder.writeString('ABC'),
|
|
||||||
]);
|
|
||||||
builder.startTable(1);
|
builder.startTable(1);
|
||||||
builder.addOffset(0, listOffset);
|
builder.addOffset(0, listOffset);
|
||||||
int offset = builder.endTable();
|
int offset = builder.endTable();
|
||||||
@@ -780,14 +703,13 @@ class BuilderTest {
|
|||||||
test_table_format,
|
test_table_format,
|
||||||
test_table_types,
|
test_table_types,
|
||||||
test_writeList_ofObjects,
|
test_writeList_ofObjects,
|
||||||
test_writeList_ofStrings_inObject,
|
test_writeList_ofStrings_inObject
|
||||||
];
|
];
|
||||||
|
|
||||||
// Execute all test cases in all permutations of their order.
|
// Execute all test cases in all permutations of their order.
|
||||||
// To do that, we generate permutations of test case indexes.
|
// To do that, we generate permutations of test case indexes.
|
||||||
final testCasesPermutations = _permutationsOf(
|
final testCasesPermutations =
|
||||||
List.generate(testCases.length, (index) => index),
|
_permutationsOf(List.generate(testCases.length, (index) => index));
|
||||||
);
|
|
||||||
expect(testCasesPermutations.length, _factorial(testCases.length));
|
expect(testCasesPermutations.length, _factorial(testCases.length));
|
||||||
|
|
||||||
for (var indexes in testCasesPermutations) {
|
for (var indexes in testCasesPermutations) {
|
||||||
@@ -857,28 +779,28 @@ class ObjectAPITest {
|
|||||||
void test_tableMonster() {
|
void test_tableMonster() {
|
||||||
final monster = example.MonsterT()
|
final monster = example.MonsterT()
|
||||||
..pos = example.Vec3T(
|
..pos = example.Vec3T(
|
||||||
x: 1,
|
x: 1,
|
||||||
y: 2,
|
y: 2,
|
||||||
z: 3,
|
z: 3,
|
||||||
test1: 4.0,
|
test1: 4.0,
|
||||||
test2: example.Color.Red,
|
test2: example.Color.Red,
|
||||||
test3: example.TestT(a: 1, b: 2),
|
test3: example.TestT(a: 1, b: 2))
|
||||||
)
|
|
||||||
..mana = 2
|
..mana = 2
|
||||||
..name = 'Monstrous'
|
..name = 'Monstrous'
|
||||||
..inventory = [24, 42]
|
..inventory = [24, 42]
|
||||||
..color = example.Color.Green
|
..color = example.Color.Green
|
||||||
|
// TODO be smarter for unions and automatically set the `type` field?
|
||||||
..testType = example.AnyTypeId.MyGame_Example2_Monster
|
..testType = example.AnyTypeId.MyGame_Example2_Monster
|
||||||
..test = example2.MonsterT()
|
..test = example2.MonsterT()
|
||||||
..test4 = [example.TestT(a: 3, b: 4), example.TestT(a: 5, b: 6)]
|
..test4 = [example.TestT(a: 3, b: 4), example.TestT(a: 5, b: 6)]
|
||||||
..testarrayofstring = ["foo", "bar"]
|
..testarrayofstring = ["foo", "bar"]
|
||||||
..testarrayoftables = [example.MonsterT(name: 'Oof', testf: 2.75)]
|
..testarrayoftables = [example.MonsterT(name: 'Oof')]
|
||||||
..enemy = example.MonsterT(name: 'Enemy', testf: 2.5)
|
..enemy = example.MonsterT(name: 'Enemy')
|
||||||
..testarrayofbools = [false, true, false]
|
..testarrayofbools = [false, true, false]
|
||||||
..testf = 42.25
|
..testf = 42.24
|
||||||
..testarrayofsortedstruct = [
|
..testarrayofsortedstruct = [
|
||||||
example.AbilityT(id: 1, distance: 5),
|
example.AbilityT(id: 1, distance: 5),
|
||||||
example.AbilityT(id: 3, distance: 7),
|
example.AbilityT(id: 3, distance: 7)
|
||||||
]
|
]
|
||||||
..vectorOfLongs = [5, 6, 7]
|
..vectorOfLongs = [5, 6, 7]
|
||||||
..vectorOfDoubles = [8.9, 9.0, 10.1, 11.2]
|
..vectorOfDoubles = [8.9, 9.0, 10.1, 11.2]
|
||||||
@@ -893,15 +815,16 @@ class ObjectAPITest {
|
|||||||
fbBuilder.finish(offset);
|
fbBuilder.finish(offset);
|
||||||
final data = fbBuilder.buffer;
|
final data = fbBuilder.buffer;
|
||||||
|
|
||||||
final monster2 = example.Monster(data); // Monster (reader)
|
// TODO currently broken because of struct builder issue, see #6688
|
||||||
expect(
|
// final monster2 = example.Monster(data); // Monster (reader)
|
||||||
// map Monster => MonsterT, Vec3 => Vec3T, ...
|
// expect(
|
||||||
monster2.toString().replaceAllMapped(
|
// // map Monster => MonsterT, Vec3 => Vec3T, ...
|
||||||
RegExp('([a-zA-z0-9]+){'), (match) => match.group(1)! + 'T{'),
|
// monster2.toString().replaceAllMapped(
|
||||||
monster.toString());
|
// RegExp('([a-zA-z0-9]+){'), (match) => match.group(1) + 'T{'),
|
||||||
|
// monster.toString());
|
||||||
final monster3 = monster2.unpack(); // MonsterT
|
//
|
||||||
expect(monster3.toString(), monster.toString());
|
// final monster3 = monster2.unpack(); // MonsterT
|
||||||
|
// expect(monster3.toString(), monster.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_Lists() {
|
void test_Lists() {
|
||||||
@@ -940,9 +863,8 @@ class StringListWrapperImpl {
|
|||||||
|
|
||||||
StringListWrapperImpl(this.bp, this.offset);
|
StringListWrapperImpl(this.bp, this.offset);
|
||||||
|
|
||||||
List<String>? get items => const ListReader<String>(
|
List<String>? get items => const ListReader<String>(StringReader())
|
||||||
StringReader(),
|
.vTableGetNullable(bp, offset, indexToField(0));
|
||||||
).vTableGetNullable(bp, offset, indexToField(0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class StringListWrapperReader extends TableReader<StringListWrapperImpl> {
|
class StringListWrapperReader extends TableReader<StringListWrapperImpl> {
|
||||||
@@ -980,14 +902,10 @@ class GeneratorTest {
|
|||||||
expect(example.Color.values, same(example.Color.values));
|
expect(example.Color.values, same(example.Color.values));
|
||||||
expect(example.Race.values, same(example.Race.values));
|
expect(example.Race.values, same(example.Race.values));
|
||||||
expect(example.AnyTypeId.values, same(example.AnyTypeId.values));
|
expect(example.AnyTypeId.values, same(example.AnyTypeId.values));
|
||||||
expect(
|
expect(example.AnyUniqueAliasesTypeId.values,
|
||||||
example.AnyUniqueAliasesTypeId.values,
|
same(example.AnyUniqueAliasesTypeId.values));
|
||||||
same(example.AnyUniqueAliasesTypeId.values),
|
expect(example.AnyAmbiguousAliasesTypeId.values,
|
||||||
);
|
same(example.AnyAmbiguousAliasesTypeId.values));
|
||||||
expect(
|
|
||||||
example.AnyAmbiguousAliasesTypeId.values,
|
|
||||||
same(example.AnyAmbiguousAliasesTypeId.values),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -995,13 +913,11 @@ class GeneratorTest {
|
|||||||
@reflectiveTest
|
@reflectiveTest
|
||||||
class ListOfEnumsTest {
|
class ListOfEnumsTest {
|
||||||
void test_listOfEnums() async {
|
void test_listOfEnums() async {
|
||||||
var mytable = example3.MyTableObjectBuilder(
|
var mytable = example3.MyTableObjectBuilder(options: [
|
||||||
options: [
|
example3.OptionsEnum.A,
|
||||||
example3.OptionsEnum.A,
|
example3.OptionsEnum.B,
|
||||||
example3.OptionsEnum.B,
|
example3.OptionsEnum.C
|
||||||
example3.OptionsEnum.C,
|
]);
|
||||||
],
|
|
||||||
);
|
|
||||||
var bytes = mytable.toBytes();
|
var bytes = mytable.toBytes();
|
||||||
var mytable_read = example3.MyTable(bytes);
|
var mytable_read = example3.MyTable(bytes);
|
||||||
expect(mytable_read.options![0].value, example3.OptionsEnum.A.value);
|
expect(mytable_read.options![0].value, example3.OptionsEnum.A.value);
|
||||||
@@ -1014,8 +930,7 @@ class ListOfEnumsTest {
|
|||||||
class BoolInStructTest {
|
class BoolInStructTest {
|
||||||
void test_boolInStruct() async {
|
void test_boolInStruct() async {
|
||||||
var mystruct = example4.FooObjectBuilder(
|
var mystruct = example4.FooObjectBuilder(
|
||||||
myFoo: example4.FooPropertiesObjectBuilder(a: true, b: false),
|
myFoo: example4.FooPropertiesObjectBuilder(a: true, b: false));
|
||||||
);
|
|
||||||
var bytes = mystruct.toBytes();
|
var bytes = mystruct.toBytes();
|
||||||
var mystruct_read = example4.Foo(bytes);
|
var mystruct_read = example4.Foo(bytes);
|
||||||
expect(mystruct_read.myFoo!.a, true);
|
expect(mystruct_read.myFoo!.a, true);
|
||||||
|
|||||||
@@ -62,23 +62,8 @@ void main() {
|
|||||||
{
|
{
|
||||||
var flx = Builder();
|
var flx = Builder();
|
||||||
flx.addString('hello 😱');
|
flx.addString('hello 😱');
|
||||||
expect(flx.finish(), [
|
expect(flx.finish(),
|
||||||
10,
|
[10, 104, 101, 108, 108, 111, 32, 240, 159, 152, 177, 0, 11, 20, 1]);
|
||||||
104,
|
|
||||||
101,
|
|
||||||
108,
|
|
||||||
108,
|
|
||||||
111,
|
|
||||||
32,
|
|
||||||
240,
|
|
||||||
159,
|
|
||||||
152,
|
|
||||||
177,
|
|
||||||
0,
|
|
||||||
11,
|
|
||||||
20,
|
|
||||||
1,
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -132,7 +117,7 @@ void main() {
|
|||||||
192,
|
192,
|
||||||
16,
|
16,
|
||||||
75,
|
75,
|
||||||
1,
|
1
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@@ -192,7 +177,7 @@ void main() {
|
|||||||
7,
|
7,
|
||||||
3,
|
3,
|
||||||
60,
|
60,
|
||||||
1,
|
1
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@@ -230,7 +215,7 @@ void main() {
|
|||||||
10,
|
10,
|
||||||
6,
|
6,
|
||||||
60,
|
60,
|
||||||
1,
|
1
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@@ -315,24 +300,9 @@ void main() {
|
|||||||
104,
|
104,
|
||||||
45,
|
45,
|
||||||
43,
|
43,
|
||||||
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', () {
|
||||||
@@ -352,24 +322,8 @@ void main() {
|
|||||||
..addKey('')
|
..addKey('')
|
||||||
..addInt(45)
|
..addInt(45)
|
||||||
..end();
|
..end();
|
||||||
expect(flx.finish(), [
|
expect(
|
||||||
97,
|
flx.finish(), [97, 0, 0, 2, 2, 5, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]);
|
||||||
0,
|
|
||||||
0,
|
|
||||||
2,
|
|
||||||
2,
|
|
||||||
5,
|
|
||||||
2,
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
45,
|
|
||||||
12,
|
|
||||||
4,
|
|
||||||
4,
|
|
||||||
4,
|
|
||||||
36,
|
|
||||||
1,
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
var flx = Builder()
|
var flx = Builder()
|
||||||
@@ -413,7 +367,7 @@ void main() {
|
|||||||
36,
|
36,
|
||||||
4,
|
4,
|
||||||
40,
|
40,
|
||||||
1,
|
1
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -427,152 +381,133 @@ void main() {
|
|||||||
|
|
||||||
test('build from object', () {
|
test('build from object', () {
|
||||||
expect(
|
expect(
|
||||||
Builder.buildFromObject(
|
Builder.buildFromObject(Uint8List.fromList([1, 2, 3]).buffer)
|
||||||
Uint8List.fromList([1, 2, 3]).buffer,
|
.asUint8List(),
|
||||||
).asUint8List(),
|
[3, 1, 2, 3, 3, 100, 1]);
|
||||||
[3, 1, 2, 3, 3, 100, 1],
|
|
||||||
);
|
|
||||||
expect(Builder.buildFromObject(null).asUint8List(), [0, 0, 1]);
|
expect(Builder.buildFromObject(null).asUint8List(), [0, 0, 1]);
|
||||||
expect(Builder.buildFromObject(true).asUint8List(), [1, 104, 1]);
|
expect(Builder.buildFromObject(true).asUint8List(), [1, 104, 1]);
|
||||||
expect(Builder.buildFromObject(false).asUint8List(), [0, 104, 1]);
|
expect(Builder.buildFromObject(false).asUint8List(), [0, 104, 1]);
|
||||||
expect(Builder.buildFromObject(25).asUint8List(), [25, 4, 1]);
|
expect(Builder.buildFromObject(25).asUint8List(), [25, 4, 1]);
|
||||||
expect(Builder.buildFromObject(-250).asUint8List(), [6, 255, 5, 2]);
|
expect(Builder.buildFromObject(-250).asUint8List(), [6, 255, 5, 2]);
|
||||||
expect(Builder.buildFromObject(-2.50).asUint8List(), [
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
32,
|
|
||||||
192,
|
|
||||||
14,
|
|
||||||
4,
|
|
||||||
]);
|
|
||||||
expect(Builder.buildFromObject('Maxim').asUint8List(), [
|
|
||||||
5,
|
|
||||||
77,
|
|
||||||
97,
|
|
||||||
120,
|
|
||||||
105,
|
|
||||||
109,
|
|
||||||
0,
|
|
||||||
6,
|
|
||||||
20,
|
|
||||||
1,
|
|
||||||
]);
|
|
||||||
expect(
|
expect(
|
||||||
Builder.buildFromObject([1, 3.3, 'max', true, null, false]).asUint8List(),
|
Builder.buildFromObject(-2.50).asUint8List(), [0, 0, 32, 192, 14, 4]);
|
||||||
[
|
expect(Builder.buildFromObject('Maxim').asUint8List(),
|
||||||
3,
|
[5, 77, 97, 120, 105, 109, 0, 6, 20, 1]);
|
||||||
109,
|
|
||||||
97,
|
|
||||||
120,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
6,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
102,
|
|
||||||
102,
|
|
||||||
102,
|
|
||||||
102,
|
|
||||||
102,
|
|
||||||
102,
|
|
||||||
10,
|
|
||||||
64,
|
|
||||||
31,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
4,
|
|
||||||
15,
|
|
||||||
20,
|
|
||||||
104,
|
|
||||||
0,
|
|
||||||
104,
|
|
||||||
54,
|
|
||||||
43,
|
|
||||||
1,
|
|
||||||
],
|
|
||||||
);
|
|
||||||
expect(
|
expect(
|
||||||
Builder.buildFromObject([
|
Builder.buildFromObject([1, 3.3, 'max', true, null, false])
|
||||||
{'something': 12},
|
.asUint8List(),
|
||||||
{'something': 45},
|
[
|
||||||
]).asUint8List(),
|
3,
|
||||||
[
|
109,
|
||||||
115,
|
97,
|
||||||
111,
|
120,
|
||||||
109,
|
0,
|
||||||
101,
|
0,
|
||||||
116,
|
0,
|
||||||
104,
|
0,
|
||||||
105,
|
6,
|
||||||
110,
|
0,
|
||||||
103,
|
0,
|
||||||
0,
|
0,
|
||||||
1,
|
0,
|
||||||
11,
|
0,
|
||||||
1,
|
0,
|
||||||
1,
|
0,
|
||||||
1,
|
1,
|
||||||
12,
|
0,
|
||||||
4,
|
0,
|
||||||
6,
|
0,
|
||||||
1,
|
0,
|
||||||
1,
|
0,
|
||||||
45,
|
0,
|
||||||
4,
|
0,
|
||||||
2,
|
102,
|
||||||
8,
|
102,
|
||||||
4,
|
102,
|
||||||
36,
|
102,
|
||||||
36,
|
102,
|
||||||
4,
|
102,
|
||||||
40,
|
10,
|
||||||
1,
|
64,
|
||||||
],
|
31,
|
||||||
);
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
4,
|
||||||
|
15,
|
||||||
|
20,
|
||||||
|
104,
|
||||||
|
0,
|
||||||
|
104,
|
||||||
|
54,
|
||||||
|
43,
|
||||||
|
1
|
||||||
|
]);
|
||||||
|
expect(
|
||||||
|
Builder.buildFromObject([
|
||||||
|
{'something': 12},
|
||||||
|
{'something': 45}
|
||||||
|
]).asUint8List(),
|
||||||
|
[
|
||||||
|
115,
|
||||||
|
111,
|
||||||
|
109,
|
||||||
|
101,
|
||||||
|
116,
|
||||||
|
104,
|
||||||
|
105,
|
||||||
|
110,
|
||||||
|
103,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
11,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
12,
|
||||||
|
4,
|
||||||
|
6,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
45,
|
||||||
|
4,
|
||||||
|
2,
|
||||||
|
8,
|
||||||
|
4,
|
||||||
|
36,
|
||||||
|
36,
|
||||||
|
4,
|
||||||
|
40,
|
||||||
|
1
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('add double indirectly', () {
|
test('add double indirectly', () {
|
||||||
@@ -608,7 +543,7 @@ void main() {
|
|||||||
35,
|
35,
|
||||||
8,
|
8,
|
||||||
40,
|
40,
|
||||||
1,
|
1
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -645,7 +580,7 @@ void main() {
|
|||||||
27,
|
27,
|
||||||
8,
|
8,
|
||||||
40,
|
40,
|
||||||
1,
|
1
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -48,210 +48,116 @@ void main() {
|
|||||||
expect(ValueTypeUtils.isFixedTypedVector(ValueType.VectorInt), isFalse);
|
expect(ValueTypeUtils.isFixedTypedVector(ValueType.VectorInt), isFalse);
|
||||||
});
|
});
|
||||||
test('to typed vector', () {
|
test('to typed vector', () {
|
||||||
expect(
|
expect(ValueTypeUtils.toTypedVector(ValueType.Int, 0),
|
||||||
ValueTypeUtils.toTypedVector(ValueType.Int, 0),
|
equals(ValueType.VectorInt));
|
||||||
equals(ValueType.VectorInt),
|
expect(ValueTypeUtils.toTypedVector(ValueType.UInt, 0),
|
||||||
);
|
equals(ValueType.VectorUInt));
|
||||||
expect(
|
expect(ValueTypeUtils.toTypedVector(ValueType.Bool, 0),
|
||||||
ValueTypeUtils.toTypedVector(ValueType.UInt, 0),
|
equals(ValueType.VectorBool));
|
||||||
equals(ValueType.VectorUInt),
|
expect(ValueTypeUtils.toTypedVector(ValueType.Float, 0),
|
||||||
);
|
equals(ValueType.VectorFloat));
|
||||||
expect(
|
expect(ValueTypeUtils.toTypedVector(ValueType.Key, 0),
|
||||||
ValueTypeUtils.toTypedVector(ValueType.Bool, 0),
|
equals(ValueType.VectorKey));
|
||||||
equals(ValueType.VectorBool),
|
expect(ValueTypeUtils.toTypedVector(ValueType.String, 0),
|
||||||
);
|
equals(ValueType.VectorString));
|
||||||
expect(
|
|
||||||
ValueTypeUtils.toTypedVector(ValueType.Float, 0),
|
|
||||||
equals(ValueType.VectorFloat),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.toTypedVector(ValueType.Key, 0),
|
|
||||||
equals(ValueType.VectorKey),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.toTypedVector(ValueType.String, 0),
|
|
||||||
equals(ValueType.VectorString),
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
expect(ValueTypeUtils.toTypedVector(ValueType.Int, 2),
|
||||||
ValueTypeUtils.toTypedVector(ValueType.Int, 2),
|
equals(ValueType.VectorInt2));
|
||||||
equals(ValueType.VectorInt2),
|
expect(ValueTypeUtils.toTypedVector(ValueType.UInt, 2),
|
||||||
);
|
equals(ValueType.VectorUInt2));
|
||||||
expect(
|
expect(ValueTypeUtils.toTypedVector(ValueType.Float, 2),
|
||||||
ValueTypeUtils.toTypedVector(ValueType.UInt, 2),
|
equals(ValueType.VectorFloat2));
|
||||||
equals(ValueType.VectorUInt2),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.toTypedVector(ValueType.Float, 2),
|
|
||||||
equals(ValueType.VectorFloat2),
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
expect(ValueTypeUtils.toTypedVector(ValueType.Int, 3),
|
||||||
ValueTypeUtils.toTypedVector(ValueType.Int, 3),
|
equals(ValueType.VectorInt3));
|
||||||
equals(ValueType.VectorInt3),
|
expect(ValueTypeUtils.toTypedVector(ValueType.UInt, 3),
|
||||||
);
|
equals(ValueType.VectorUInt3));
|
||||||
expect(
|
expect(ValueTypeUtils.toTypedVector(ValueType.Float, 3),
|
||||||
ValueTypeUtils.toTypedVector(ValueType.UInt, 3),
|
equals(ValueType.VectorFloat3));
|
||||||
equals(ValueType.VectorUInt3),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.toTypedVector(ValueType.Float, 3),
|
|
||||||
equals(ValueType.VectorFloat3),
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
expect(ValueTypeUtils.toTypedVector(ValueType.Int, 4),
|
||||||
ValueTypeUtils.toTypedVector(ValueType.Int, 4),
|
equals(ValueType.VectorInt4));
|
||||||
equals(ValueType.VectorInt4),
|
expect(ValueTypeUtils.toTypedVector(ValueType.UInt, 4),
|
||||||
);
|
equals(ValueType.VectorUInt4));
|
||||||
expect(
|
expect(ValueTypeUtils.toTypedVector(ValueType.Float, 4),
|
||||||
ValueTypeUtils.toTypedVector(ValueType.UInt, 4),
|
equals(ValueType.VectorFloat4));
|
||||||
equals(ValueType.VectorUInt4),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.toTypedVector(ValueType.Float, 4),
|
|
||||||
equals(ValueType.VectorFloat4),
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
test('typed vector element type', () {
|
test('typed vector element type', () {
|
||||||
expect(
|
expect(ValueTypeUtils.typedVectorElementType(ValueType.VectorInt),
|
||||||
ValueTypeUtils.typedVectorElementType(ValueType.VectorInt),
|
equals(ValueType.Int));
|
||||||
equals(ValueType.Int),
|
expect(ValueTypeUtils.typedVectorElementType(ValueType.VectorUInt),
|
||||||
);
|
equals(ValueType.UInt));
|
||||||
expect(
|
expect(ValueTypeUtils.typedVectorElementType(ValueType.VectorFloat),
|
||||||
ValueTypeUtils.typedVectorElementType(ValueType.VectorUInt),
|
equals(ValueType.Float));
|
||||||
equals(ValueType.UInt),
|
expect(ValueTypeUtils.typedVectorElementType(ValueType.VectorString),
|
||||||
);
|
equals(ValueType.String));
|
||||||
expect(
|
expect(ValueTypeUtils.typedVectorElementType(ValueType.VectorKey),
|
||||||
ValueTypeUtils.typedVectorElementType(ValueType.VectorFloat),
|
equals(ValueType.Key));
|
||||||
equals(ValueType.Float),
|
expect(ValueTypeUtils.typedVectorElementType(ValueType.VectorBool),
|
||||||
);
|
equals(ValueType.Bool));
|
||||||
expect(
|
|
||||||
ValueTypeUtils.typedVectorElementType(ValueType.VectorString),
|
|
||||||
equals(ValueType.String),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.typedVectorElementType(ValueType.VectorKey),
|
|
||||||
equals(ValueType.Key),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.typedVectorElementType(ValueType.VectorBool),
|
|
||||||
equals(ValueType.Bool),
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
test('fixed typed vector element type', () {
|
test('fixed typed vector element type', () {
|
||||||
expect(
|
expect(ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorInt2),
|
||||||
ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorInt2),
|
equals(ValueType.Int));
|
||||||
equals(ValueType.Int),
|
expect(ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorInt3),
|
||||||
);
|
equals(ValueType.Int));
|
||||||
expect(
|
expect(ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorInt4),
|
||||||
ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorInt3),
|
equals(ValueType.Int));
|
||||||
equals(ValueType.Int),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorInt4),
|
|
||||||
equals(ValueType.Int),
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
expect(ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorUInt2),
|
||||||
ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorUInt2),
|
equals(ValueType.UInt));
|
||||||
equals(ValueType.UInt),
|
expect(ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorUInt3),
|
||||||
);
|
equals(ValueType.UInt));
|
||||||
expect(
|
expect(ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorUInt4),
|
||||||
ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorUInt3),
|
equals(ValueType.UInt));
|
||||||
equals(ValueType.UInt),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorUInt4),
|
|
||||||
equals(ValueType.UInt),
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
expect(ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorFloat2),
|
||||||
ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorFloat2),
|
equals(ValueType.Float));
|
||||||
equals(ValueType.Float),
|
expect(ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorFloat3),
|
||||||
);
|
equals(ValueType.Float));
|
||||||
expect(
|
expect(ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorFloat4),
|
||||||
ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorFloat3),
|
equals(ValueType.Float));
|
||||||
equals(ValueType.Float),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.fixedTypedVectorElementType(ValueType.VectorFloat4),
|
|
||||||
equals(ValueType.Float),
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
test('fixed typed vector element size', () {
|
test('fixed typed vector element size', () {
|
||||||
expect(
|
expect(ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorInt2),
|
||||||
ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorInt2),
|
equals(2));
|
||||||
equals(2),
|
expect(ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorInt3),
|
||||||
);
|
equals(3));
|
||||||
expect(
|
expect(ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorInt4),
|
||||||
ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorInt3),
|
equals(4));
|
||||||
equals(3),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorInt4),
|
|
||||||
equals(4),
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
expect(ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorUInt2),
|
||||||
ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorUInt2),
|
equals(2));
|
||||||
equals(2),
|
expect(ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorUInt3),
|
||||||
);
|
equals(3));
|
||||||
expect(
|
expect(ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorUInt4),
|
||||||
ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorUInt3),
|
equals(4));
|
||||||
equals(3),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorUInt4),
|
|
||||||
equals(4),
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
expect(ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorFloat2),
|
||||||
ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorFloat2),
|
equals(2));
|
||||||
equals(2),
|
expect(ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorFloat3),
|
||||||
);
|
equals(3));
|
||||||
expect(
|
expect(ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorFloat4),
|
||||||
ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorFloat3),
|
equals(4));
|
||||||
equals(3),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
ValueTypeUtils.fixedTypedVectorElementSize(ValueType.VectorFloat4),
|
|
||||||
equals(4),
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
test('packed type', () {
|
test('packed type', () {
|
||||||
expect(
|
expect(
|
||||||
ValueTypeUtils.packedType(ValueType.Null, BitWidth.width8),
|
ValueTypeUtils.packedType(ValueType.Null, BitWidth.width8), equals(0));
|
||||||
equals(0),
|
|
||||||
);
|
|
||||||
expect(
|
expect(
|
||||||
ValueTypeUtils.packedType(ValueType.Null, BitWidth.width16),
|
ValueTypeUtils.packedType(ValueType.Null, BitWidth.width16), equals(1));
|
||||||
equals(1),
|
|
||||||
);
|
|
||||||
expect(
|
expect(
|
||||||
ValueTypeUtils.packedType(ValueType.Null, BitWidth.width32),
|
ValueTypeUtils.packedType(ValueType.Null, BitWidth.width32), equals(2));
|
||||||
equals(2),
|
|
||||||
);
|
|
||||||
expect(
|
expect(
|
||||||
ValueTypeUtils.packedType(ValueType.Null, BitWidth.width64),
|
ValueTypeUtils.packedType(ValueType.Null, BitWidth.width64), equals(3));
|
||||||
equals(3),
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
ValueTypeUtils.packedType(ValueType.Int, BitWidth.width8),
|
ValueTypeUtils.packedType(ValueType.Int, BitWidth.width8), equals(4));
|
||||||
equals(4),
|
|
||||||
);
|
|
||||||
expect(
|
expect(
|
||||||
ValueTypeUtils.packedType(ValueType.Int, BitWidth.width16),
|
ValueTypeUtils.packedType(ValueType.Int, BitWidth.width16), equals(5));
|
||||||
equals(5),
|
|
||||||
);
|
|
||||||
expect(
|
expect(
|
||||||
ValueTypeUtils.packedType(ValueType.Int, BitWidth.width32),
|
ValueTypeUtils.packedType(ValueType.Int, BitWidth.width32), equals(6));
|
||||||
equals(6),
|
|
||||||
);
|
|
||||||
expect(
|
expect(
|
||||||
ValueTypeUtils.packedType(ValueType.Int, BitWidth.width64),
|
ValueTypeUtils.packedType(ValueType.Int, BitWidth.width64), equals(7));
|
||||||
equals(7),
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
test('bit width', () {
|
test('bit width', () {
|
||||||
expect(BitWidthUtil.width(0), BitWidth.width8);
|
expect(BitWidthUtil.width(0), BitWidth.width8);
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
// automatically generated by the FlatBuffers compiler, do not modify
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names
|
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable
|
||||||
|
|
||||||
import 'dart:typed_data' show Uint8List;
|
import 'dart:typed_data' show Uint8List;
|
||||||
|
|
||||||
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
||||||
|
|
||||||
import './include_test2_my_game.other_name_space_generated.dart'
|
|
||||||
as my_game_other_name_space;
|
import './include_test2_my_game.other_name_space_generated.dart' as my_game_other_name_space;
|
||||||
|
|
||||||
class TableA {
|
class TableA {
|
||||||
TableA._(this._bc, this._bcOffset);
|
TableA._(this._bc, this._bcOffset);
|
||||||
@@ -20,17 +19,15 @@ class TableA {
|
|||||||
final fb.BufferContext _bc;
|
final fb.BufferContext _bc;
|
||||||
final int _bcOffset;
|
final int _bcOffset;
|
||||||
|
|
||||||
my_game_other_name_space.TableB? get b => my_game_other_name_space
|
my_game_other_name_space.TableB? get b => my_game_other_name_space.TableB.reader.vTableGetNullable(_bc, _bcOffset, 4);
|
||||||
.TableB
|
|
||||||
.reader
|
|
||||||
.vTableGetNullable(_bc, _bcOffset, 4);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'TableA{b: ${b}}';
|
return 'TableA{b: ${b}}';
|
||||||
}
|
}
|
||||||
|
|
||||||
TableAT unpack() => TableAT(b: b?.unpack());
|
TableAT unpack() => TableAT(
|
||||||
|
b: b?.unpack());
|
||||||
|
|
||||||
static int pack(fb.Builder fbBuilder, TableAT? object) {
|
static int pack(fb.Builder fbBuilder, TableAT? object) {
|
||||||
if (object == null) return 0;
|
if (object == null) return 0;
|
||||||
@@ -41,7 +38,8 @@ class TableA {
|
|||||||
class TableAT implements fb.Packable {
|
class TableAT implements fb.Packable {
|
||||||
my_game_other_name_space.TableBT? b;
|
my_game_other_name_space.TableBT? b;
|
||||||
|
|
||||||
TableAT({this.b});
|
TableAT({
|
||||||
|
this.b});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int pack(fb.Builder fbBuilder) {
|
int pack(fb.Builder fbBuilder) {
|
||||||
@@ -61,7 +59,8 @@ class _TableAReader extends fb.TableReader<TableA> {
|
|||||||
const _TableAReader();
|
const _TableAReader();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
TableA createObject(fb.BufferContext bc, int offset) => TableA._(bc, offset);
|
TableA createObject(fb.BufferContext bc, int offset) =>
|
||||||
|
TableA._(bc, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
class TableABuilder {
|
class TableABuilder {
|
||||||
@@ -86,8 +85,10 @@ class TableABuilder {
|
|||||||
class TableAObjectBuilder extends fb.ObjectBuilder {
|
class TableAObjectBuilder extends fb.ObjectBuilder {
|
||||||
final my_game_other_name_space.TableBObjectBuilder? _b;
|
final my_game_other_name_space.TableBObjectBuilder? _b;
|
||||||
|
|
||||||
TableAObjectBuilder({my_game_other_name_space.TableBObjectBuilder? b})
|
TableAObjectBuilder({
|
||||||
: _b = b;
|
my_game_other_name_space.TableBObjectBuilder? b,
|
||||||
|
})
|
||||||
|
: _b = b;
|
||||||
|
|
||||||
/// Finish building, and store into the [fbBuilder].
|
/// Finish building, and store into the [fbBuilder].
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -1,35 +1,43 @@
|
|||||||
// automatically generated by the FlatBuffers compiler, do not modify
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names
|
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable
|
||||||
|
|
||||||
library my_game.other_name_space;
|
library my_game.other_name_space;
|
||||||
|
|
||||||
import 'dart:typed_data' show Uint8List;
|
import 'dart:typed_data' show Uint8List;
|
||||||
|
|
||||||
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
||||||
|
|
||||||
|
|
||||||
import './include_test1_generated.dart';
|
import './include_test1_generated.dart';
|
||||||
|
|
||||||
enum FromInclude {
|
class FromInclude {
|
||||||
IncludeVal(0);
|
|
||||||
|
|
||||||
final int value;
|
final int value;
|
||||||
const FromInclude(this.value);
|
const FromInclude._(this.value);
|
||||||
|
|
||||||
factory FromInclude.fromValue(int value) {
|
factory FromInclude.fromValue(int value) {
|
||||||
switch (value) {
|
final result = values[value];
|
||||||
case 0:
|
if (result == null) {
|
||||||
return FromInclude.IncludeVal;
|
throw StateError('Invalid value $value for bit flag enum FromInclude');
|
||||||
default:
|
|
||||||
throw StateError('Invalid value $value for bit flag enum');
|
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FromInclude? _createOrNull(int? value) =>
|
static FromInclude? _createOrNull(int? value) =>
|
||||||
value == null ? null : FromInclude.fromValue(value);
|
value == null ? null : FromInclude.fromValue(value);
|
||||||
|
|
||||||
static const int minValue = 0;
|
static const int minValue = 0;
|
||||||
static const int maxValue = 0;
|
static const int maxValue = 0;
|
||||||
|
static bool containsValue(int value) => values.containsKey(value);
|
||||||
|
|
||||||
|
static const FromInclude IncludeVal = FromInclude._(0);
|
||||||
|
static const Map<int, FromInclude> values = {
|
||||||
|
0: IncludeVal};
|
||||||
|
|
||||||
static const fb.Reader<FromInclude> reader = _FromIncludeReader();
|
static const fb.Reader<FromInclude> reader = _FromIncludeReader();
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'FromInclude{value: $value}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _FromIncludeReader extends fb.Reader<FromInclude> {
|
class _FromIncludeReader extends fb.Reader<FromInclude> {
|
||||||
@@ -58,7 +66,8 @@ class Unused {
|
|||||||
return 'Unused{a: ${a}}';
|
return 'Unused{a: ${a}}';
|
||||||
}
|
}
|
||||||
|
|
||||||
UnusedT unpack() => UnusedT(a: a);
|
UnusedT unpack() => UnusedT(
|
||||||
|
a: a);
|
||||||
|
|
||||||
static int pack(fb.Builder fbBuilder, UnusedT? object) {
|
static int pack(fb.Builder fbBuilder, UnusedT? object) {
|
||||||
if (object == null) return 0;
|
if (object == null) return 0;
|
||||||
@@ -69,7 +78,8 @@ class Unused {
|
|||||||
class UnusedT implements fb.Packable {
|
class UnusedT implements fb.Packable {
|
||||||
int a;
|
int a;
|
||||||
|
|
||||||
UnusedT({required this.a});
|
UnusedT({
|
||||||
|
required this.a});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int pack(fb.Builder fbBuilder) {
|
int pack(fb.Builder fbBuilder) {
|
||||||
@@ -90,7 +100,8 @@ class _UnusedReader extends fb.StructReader<Unused> {
|
|||||||
int get size => 4;
|
int get size => 4;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Unused createObject(fb.BufferContext bc, int offset) => Unused._(bc, offset);
|
Unused createObject(fb.BufferContext bc, int offset) =>
|
||||||
|
Unused._(bc, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
class UnusedBuilder {
|
class UnusedBuilder {
|
||||||
@@ -102,12 +113,16 @@ class UnusedBuilder {
|
|||||||
fbBuilder.putInt32(a);
|
fbBuilder.putInt32(a);
|
||||||
return fbBuilder.offset;
|
return fbBuilder.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class UnusedObjectBuilder extends fb.ObjectBuilder {
|
class UnusedObjectBuilder extends fb.ObjectBuilder {
|
||||||
final int _a;
|
final int _a;
|
||||||
|
|
||||||
UnusedObjectBuilder({required int a}) : _a = a;
|
UnusedObjectBuilder({
|
||||||
|
required int a,
|
||||||
|
})
|
||||||
|
: _a = a;
|
||||||
|
|
||||||
/// Finish building, and store into the [fbBuilder].
|
/// Finish building, and store into the [fbBuilder].
|
||||||
@override
|
@override
|
||||||
@@ -124,7 +139,6 @@ class UnusedObjectBuilder extends fb.ObjectBuilder {
|
|||||||
return fbBuilder.buffer;
|
return fbBuilder.buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class TableB {
|
class TableB {
|
||||||
TableB._(this._bc, this._bcOffset);
|
TableB._(this._bc, this._bcOffset);
|
||||||
factory TableB(List<int> bytes) {
|
factory TableB(List<int> bytes) {
|
||||||
@@ -144,7 +158,8 @@ class TableB {
|
|||||||
return 'TableB{a: ${a}}';
|
return 'TableB{a: ${a}}';
|
||||||
}
|
}
|
||||||
|
|
||||||
TableBT unpack() => TableBT(a: a?.unpack());
|
TableBT unpack() => TableBT(
|
||||||
|
a: a?.unpack());
|
||||||
|
|
||||||
static int pack(fb.Builder fbBuilder, TableBT? object) {
|
static int pack(fb.Builder fbBuilder, TableBT? object) {
|
||||||
if (object == null) return 0;
|
if (object == null) return 0;
|
||||||
@@ -155,7 +170,8 @@ class TableB {
|
|||||||
class TableBT implements fb.Packable {
|
class TableBT implements fb.Packable {
|
||||||
TableAT? a;
|
TableAT? a;
|
||||||
|
|
||||||
TableBT({this.a});
|
TableBT({
|
||||||
|
this.a});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int pack(fb.Builder fbBuilder) {
|
int pack(fb.Builder fbBuilder) {
|
||||||
@@ -175,7 +191,8 @@ class _TableBReader extends fb.TableReader<TableB> {
|
|||||||
const _TableBReader();
|
const _TableBReader();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
TableB createObject(fb.BufferContext bc, int offset) => TableB._(bc, offset);
|
TableB createObject(fb.BufferContext bc, int offset) =>
|
||||||
|
TableB._(bc, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
class TableBBuilder {
|
class TableBBuilder {
|
||||||
@@ -200,7 +217,10 @@ class TableBBuilder {
|
|||||||
class TableBObjectBuilder extends fb.ObjectBuilder {
|
class TableBObjectBuilder extends fb.ObjectBuilder {
|
||||||
final TableAObjectBuilder? _a;
|
final TableAObjectBuilder? _a;
|
||||||
|
|
||||||
TableBObjectBuilder({TableAObjectBuilder? a}) : _a = a;
|
TableBObjectBuilder({
|
||||||
|
TableAObjectBuilder? a,
|
||||||
|
})
|
||||||
|
: _a = a;
|
||||||
|
|
||||||
/// Finish building, and store into the [fbBuilder].
|
/// Finish building, and store into the [fbBuilder].
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// automatically generated by the FlatBuffers compiler, do not modify
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names
|
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable
|
||||||
|
|
||||||
library keyword_test;
|
library keyword_test;
|
||||||
|
|
||||||
@@ -7,30 +7,39 @@ import 'dart:typed_data' show Uint8List;
|
|||||||
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
||||||
|
|
||||||
|
|
||||||
|
class Abc {
|
||||||
enum Abc {
|
|
||||||
$void(0),
|
|
||||||
where(1),
|
|
||||||
stackalloc(2);
|
|
||||||
|
|
||||||
final int value;
|
final int value;
|
||||||
const Abc(this.value);
|
const Abc._(this.value);
|
||||||
|
|
||||||
factory Abc.fromValue(int value) {
|
factory Abc.fromValue(int value) {
|
||||||
switch (value) {
|
final result = values[value];
|
||||||
case 0: return Abc.$void;
|
if (result == null) {
|
||||||
case 1: return Abc.where;
|
throw StateError('Invalid value $value for bit flag enum Abc');
|
||||||
case 2: return Abc.stackalloc;
|
|
||||||
default: throw StateError('Invalid value $value for bit flag enum');
|
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Abc? _createOrNull(int? value) =>
|
static Abc? _createOrNull(int? value) =>
|
||||||
value == null ? null : Abc.fromValue(value);
|
value == null ? null : Abc.fromValue(value);
|
||||||
|
|
||||||
static const int minValue = 0;
|
static const int minValue = 0;
|
||||||
static const int maxValue = 2;
|
static const int maxValue = 2;
|
||||||
|
static bool containsValue(int value) => values.containsKey(value);
|
||||||
|
|
||||||
|
static const Abc $void = Abc._(0);
|
||||||
|
static const Abc where = Abc._(1);
|
||||||
|
static const Abc stackalloc = Abc._(2);
|
||||||
|
static const Map<int, Abc> values = {
|
||||||
|
0: $void,
|
||||||
|
1: where,
|
||||||
|
2: stackalloc};
|
||||||
|
|
||||||
static const fb.Reader<Abc> reader = _AbcReader();
|
static const fb.Reader<Abc> reader = _AbcReader();
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'Abc{value: $value}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _AbcReader extends fb.Reader<Abc> {
|
class _AbcReader extends fb.Reader<Abc> {
|
||||||
@@ -44,25 +53,35 @@ class _AbcReader extends fb.Reader<Abc> {
|
|||||||
Abc.fromValue(const fb.Int32Reader().read(bc, offset));
|
Abc.fromValue(const fb.Int32Reader().read(bc, offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Public {
|
class Public {
|
||||||
NONE(0);
|
|
||||||
|
|
||||||
final int value;
|
final int value;
|
||||||
const Public(this.value);
|
const Public._(this.value);
|
||||||
|
|
||||||
factory Public.fromValue(int value) {
|
factory Public.fromValue(int value) {
|
||||||
switch (value) {
|
final result = values[value];
|
||||||
case 0: return Public.NONE;
|
if (result == null) {
|
||||||
default: throw StateError('Invalid value $value for bit flag enum');
|
throw StateError('Invalid value $value for bit flag enum Public');
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Public? _createOrNull(int? value) =>
|
static Public? _createOrNull(int? value) =>
|
||||||
value == null ? null : Public.fromValue(value);
|
value == null ? null : Public.fromValue(value);
|
||||||
|
|
||||||
static const int minValue = 0;
|
static const int minValue = 0;
|
||||||
static const int maxValue = 0;
|
static const int maxValue = 0;
|
||||||
|
static bool containsValue(int value) => values.containsKey(value);
|
||||||
|
|
||||||
|
static const Public NONE = Public._(0);
|
||||||
|
static const Map<int, Public> values = {
|
||||||
|
0: NONE};
|
||||||
|
|
||||||
static const fb.Reader<Public> reader = _PublicReader();
|
static const fb.Reader<Public> reader = _PublicReader();
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'Public{value: $value}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _PublicReader extends fb.Reader<Public> {
|
class _PublicReader extends fb.Reader<Public> {
|
||||||
@@ -76,29 +95,39 @@ class _PublicReader extends fb.Reader<Public> {
|
|||||||
Public.fromValue(const fb.Int32Reader().read(bc, offset));
|
Public.fromValue(const fb.Int32Reader().read(bc, offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
enum KeywordsInUnionTypeId {
|
class KeywordsInUnionTypeId {
|
||||||
NONE(0),
|
|
||||||
$static(1),
|
|
||||||
internal(2);
|
|
||||||
|
|
||||||
final int value;
|
final int value;
|
||||||
const KeywordsInUnionTypeId(this.value);
|
const KeywordsInUnionTypeId._(this.value);
|
||||||
|
|
||||||
factory KeywordsInUnionTypeId.fromValue(int value) {
|
factory KeywordsInUnionTypeId.fromValue(int value) {
|
||||||
switch (value) {
|
final result = values[value];
|
||||||
case 0: return KeywordsInUnionTypeId.NONE;
|
if (result == null) {
|
||||||
case 1: return KeywordsInUnionTypeId.$static;
|
throw StateError('Invalid value $value for bit flag enum KeywordsInUnionTypeId');
|
||||||
case 2: return KeywordsInUnionTypeId.internal;
|
|
||||||
default: throw StateError('Invalid value $value for bit flag enum');
|
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static KeywordsInUnionTypeId? _createOrNull(int? value) =>
|
static KeywordsInUnionTypeId? _createOrNull(int? value) =>
|
||||||
value == null ? null : KeywordsInUnionTypeId.fromValue(value);
|
value == null ? null : KeywordsInUnionTypeId.fromValue(value);
|
||||||
|
|
||||||
static const int minValue = 0;
|
static const int minValue = 0;
|
||||||
static const int maxValue = 2;
|
static const int maxValue = 2;
|
||||||
|
static bool containsValue(int value) => values.containsKey(value);
|
||||||
|
|
||||||
|
static const KeywordsInUnionTypeId NONE = KeywordsInUnionTypeId._(0);
|
||||||
|
static const KeywordsInUnionTypeId $static = KeywordsInUnionTypeId._(1);
|
||||||
|
static const KeywordsInUnionTypeId internal = KeywordsInUnionTypeId._(2);
|
||||||
|
static const Map<int, KeywordsInUnionTypeId> values = {
|
||||||
|
0: NONE,
|
||||||
|
1: $static,
|
||||||
|
2: internal};
|
||||||
|
|
||||||
static const fb.Reader<KeywordsInUnionTypeId> reader = _KeywordsInUnionTypeIdReader();
|
static const fb.Reader<KeywordsInUnionTypeId> reader = _KeywordsInUnionTypeIdReader();
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'KeywordsInUnionTypeId{value: $value}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _KeywordsInUnionTypeIdReader extends fb.Reader<KeywordsInUnionTypeId> {
|
class _KeywordsInUnionTypeIdReader extends fb.Reader<KeywordsInUnionTypeId> {
|
||||||
@@ -277,7 +306,7 @@ class Table2 {
|
|||||||
|
|
||||||
Table2T unpack() => Table2T(
|
Table2T unpack() => Table2T(
|
||||||
typeType: typeType,
|
typeType: typeType,
|
||||||
type: type?.unpack());
|
type: type);
|
||||||
|
|
||||||
static int pack(fb.Builder fbBuilder, Table2T? object) {
|
static int pack(fb.Builder fbBuilder, Table2T? object) {
|
||||||
if (object == null) return 0;
|
if (object == null) return 0;
|
||||||
|
|||||||
@@ -1,37 +1,43 @@
|
|||||||
// automatically generated by the FlatBuffers compiler, do not modify
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names
|
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable
|
||||||
|
|
||||||
import 'dart:typed_data' show Uint8List;
|
import 'dart:typed_data' show Uint8List;
|
||||||
|
|
||||||
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
||||||
|
|
||||||
enum OptionsEnum {
|
|
||||||
A(1),
|
|
||||||
B(2),
|
|
||||||
C(3);
|
|
||||||
|
|
||||||
|
class OptionsEnum {
|
||||||
final int value;
|
final int value;
|
||||||
const OptionsEnum(this.value);
|
const OptionsEnum._(this.value);
|
||||||
|
|
||||||
factory OptionsEnum.fromValue(int value) {
|
factory OptionsEnum.fromValue(int value) {
|
||||||
switch (value) {
|
final result = values[value];
|
||||||
case 1:
|
if (result == null) {
|
||||||
return OptionsEnum.A;
|
throw StateError('Invalid value $value for bit flag enum OptionsEnum');
|
||||||
case 2:
|
|
||||||
return OptionsEnum.B;
|
|
||||||
case 3:
|
|
||||||
return OptionsEnum.C;
|
|
||||||
default:
|
|
||||||
throw StateError('Invalid value $value for bit flag enum');
|
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static OptionsEnum? _createOrNull(int? value) =>
|
static OptionsEnum? _createOrNull(int? value) =>
|
||||||
value == null ? null : OptionsEnum.fromValue(value);
|
value == null ? null : OptionsEnum.fromValue(value);
|
||||||
|
|
||||||
static const int minValue = 1;
|
static const int minValue = 1;
|
||||||
static const int maxValue = 3;
|
static const int maxValue = 3;
|
||||||
|
static bool containsValue(int value) => values.containsKey(value);
|
||||||
|
|
||||||
|
static const OptionsEnum A = OptionsEnum._(1);
|
||||||
|
static const OptionsEnum B = OptionsEnum._(2);
|
||||||
|
static const OptionsEnum C = OptionsEnum._(3);
|
||||||
|
static const Map<int, OptionsEnum> values = {
|
||||||
|
1: A,
|
||||||
|
2: B,
|
||||||
|
3: C};
|
||||||
|
|
||||||
static const fb.Reader<OptionsEnum> reader = _OptionsEnumReader();
|
static const fb.Reader<OptionsEnum> reader = _OptionsEnumReader();
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'OptionsEnum{value: $value}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _OptionsEnumReader extends fb.Reader<OptionsEnum> {
|
class _OptionsEnumReader extends fb.Reader<OptionsEnum> {
|
||||||
@@ -57,9 +63,7 @@ class MyTable {
|
|||||||
final fb.BufferContext _bc;
|
final fb.BufferContext _bc;
|
||||||
final int _bcOffset;
|
final int _bcOffset;
|
||||||
|
|
||||||
List<OptionsEnum>? get options => const fb.ListReader<OptionsEnum>(
|
List<OptionsEnum>? get options => const fb.ListReader<OptionsEnum>(OptionsEnum.reader).vTableGetNullable(_bc, _bcOffset, 4);
|
||||||
OptionsEnum.reader,
|
|
||||||
).vTableGetNullable(_bc, _bcOffset, 4);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
@@ -67,11 +71,7 @@ class MyTable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MyTableT unpack() => MyTableT(
|
MyTableT unpack() => MyTableT(
|
||||||
options: const fb.ListReader<OptionsEnum>(
|
options: const fb.ListReader<OptionsEnum>(OptionsEnum.reader, lazy: false).vTableGetNullable(_bc, _bcOffset, 4));
|
||||||
OptionsEnum.reader,
|
|
||||||
lazy: false,
|
|
||||||
).vTableGetNullable(_bc, _bcOffset, 4),
|
|
||||||
);
|
|
||||||
|
|
||||||
static int pack(fb.Builder fbBuilder, MyTableT? object) {
|
static int pack(fb.Builder fbBuilder, MyTableT? object) {
|
||||||
if (object == null) return 0;
|
if (object == null) return 0;
|
||||||
@@ -82,12 +82,12 @@ class MyTable {
|
|||||||
class MyTableT implements fb.Packable {
|
class MyTableT implements fb.Packable {
|
||||||
List<OptionsEnum>? options;
|
List<OptionsEnum>? options;
|
||||||
|
|
||||||
MyTableT({this.options});
|
MyTableT({
|
||||||
|
this.options});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int pack(fb.Builder fbBuilder) {
|
int pack(fb.Builder fbBuilder) {
|
||||||
final int? optionsOffset = options == null
|
final int? optionsOffset = options == null ? null
|
||||||
? null
|
|
||||||
: fbBuilder.writeListUint32(options!.map((f) => f.value).toList());
|
: fbBuilder.writeListUint32(options!.map((f) => f.value).toList());
|
||||||
fbBuilder.startTable(1);
|
fbBuilder.startTable(1);
|
||||||
fbBuilder.addOffset(0, optionsOffset);
|
fbBuilder.addOffset(0, optionsOffset);
|
||||||
@@ -104,8 +104,8 @@ class _MyTableReader extends fb.TableReader<MyTable> {
|
|||||||
const _MyTableReader();
|
const _MyTableReader();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
MyTable createObject(fb.BufferContext bc, int offset) =>
|
MyTable createObject(fb.BufferContext bc, int offset) =>
|
||||||
MyTable._(bc, offset);
|
MyTable._(bc, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyTableBuilder {
|
class MyTableBuilder {
|
||||||
@@ -130,13 +130,15 @@ class MyTableBuilder {
|
|||||||
class MyTableObjectBuilder extends fb.ObjectBuilder {
|
class MyTableObjectBuilder extends fb.ObjectBuilder {
|
||||||
final List<OptionsEnum>? _options;
|
final List<OptionsEnum>? _options;
|
||||||
|
|
||||||
MyTableObjectBuilder({List<OptionsEnum>? options}) : _options = options;
|
MyTableObjectBuilder({
|
||||||
|
List<OptionsEnum>? options,
|
||||||
|
})
|
||||||
|
: _options = options;
|
||||||
|
|
||||||
/// Finish building, and store into the [fbBuilder].
|
/// Finish building, and store into the [fbBuilder].
|
||||||
@override
|
@override
|
||||||
int finish(fb.Builder fbBuilder) {
|
int finish(fb.Builder fbBuilder) {
|
||||||
final int? optionsOffset = _options == null
|
final int? optionsOffset = _options == null ? null
|
||||||
? null
|
|
||||||
: fbBuilder.writeListUint32(_options!.map((f) => f.value).toList());
|
: fbBuilder.writeListUint32(_options!.map((f) => f.value).toList());
|
||||||
fbBuilder.startTable(1);
|
fbBuilder.startTable(1);
|
||||||
fbBuilder.addOffset(0, optionsOffset);
|
fbBuilder.addOffset(0, optionsOffset);
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
// automatically generated by the FlatBuffers compiler, do not modify
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names
|
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable
|
||||||
|
|
||||||
library my_game.example2;
|
library my_game.example2;
|
||||||
|
|
||||||
import 'dart:typed_data' show Uint8List;
|
import 'dart:typed_data' show Uint8List;
|
||||||
|
|
||||||
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
||||||
|
|
||||||
import './include_test1_generated.dart';
|
|
||||||
import './monster_test_my_game.example_generated.dart' as my_game_example;
|
|
||||||
import './monster_test_my_game_generated.dart' as my_game;
|
import './monster_test_my_game_generated.dart' as my_game;
|
||||||
|
import './monster_test_my_game.example_generated.dart' as my_game_example;
|
||||||
|
|
||||||
|
import './include_test1_generated.dart';
|
||||||
|
|
||||||
class Monster {
|
class Monster {
|
||||||
Monster._(this._bc, this._bcOffset);
|
Monster._(this._bc, this._bcOffset);
|
||||||
@@ -23,6 +23,7 @@ class Monster {
|
|||||||
final fb.BufferContext _bc;
|
final fb.BufferContext _bc;
|
||||||
final int _bcOffset;
|
final int _bcOffset;
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'Monster{}';
|
return 'Monster{}';
|
||||||
@@ -53,11 +54,12 @@ class _MonsterReader extends fb.TableReader<Monster> {
|
|||||||
const _MonsterReader();
|
const _MonsterReader();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Monster createObject(fb.BufferContext bc, int offset) =>
|
Monster createObject(fb.BufferContext bc, int offset) =>
|
||||||
Monster._(bc, offset);
|
Monster._(bc, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
class MonsterObjectBuilder extends fb.ObjectBuilder {
|
class MonsterObjectBuilder extends fb.ObjectBuilder {
|
||||||
|
|
||||||
MonsterObjectBuilder();
|
MonsterObjectBuilder();
|
||||||
|
|
||||||
/// Finish building, and store into the [fbBuilder].
|
/// Finish building, and store into the [fbBuilder].
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,15 +1,15 @@
|
|||||||
// automatically generated by the FlatBuffers compiler, do not modify
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable, constant_identifier_names
|
// ignore_for_file: unused_import, unused_field, unused_element, unused_local_variable
|
||||||
|
|
||||||
library my_game;
|
library my_game;
|
||||||
|
|
||||||
import 'dart:typed_data' show Uint8List;
|
import 'dart:typed_data' show Uint8List;
|
||||||
|
|
||||||
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
import 'package:flat_buffers/flat_buffers.dart' as fb;
|
||||||
|
|
||||||
import './include_test1_generated.dart';
|
|
||||||
import './monster_test_my_game.example2_generated.dart' as my_game_example2;
|
|
||||||
import './monster_test_my_game.example_generated.dart' as my_game_example;
|
import './monster_test_my_game.example_generated.dart' as my_game_example;
|
||||||
|
import './monster_test_my_game.example2_generated.dart' as my_game_example2;
|
||||||
|
|
||||||
|
import './include_test1_generated.dart';
|
||||||
|
|
||||||
class InParentNamespace {
|
class InParentNamespace {
|
||||||
InParentNamespace._(this._bc, this._bcOffset);
|
InParentNamespace._(this._bc, this._bcOffset);
|
||||||
@@ -23,6 +23,7 @@ class InParentNamespace {
|
|||||||
final fb.BufferContext _bc;
|
final fb.BufferContext _bc;
|
||||||
final int _bcOffset;
|
final int _bcOffset;
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'InParentNamespace{}';
|
return 'InParentNamespace{}';
|
||||||
@@ -53,11 +54,12 @@ class _InParentNamespaceReader extends fb.TableReader<InParentNamespace> {
|
|||||||
const _InParentNamespaceReader();
|
const _InParentNamespaceReader();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
InParentNamespace createObject(fb.BufferContext bc, int offset) =>
|
InParentNamespace createObject(fb.BufferContext bc, int offset) =>
|
||||||
InParentNamespace._(bc, offset);
|
InParentNamespace._(bc, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
class InParentNamespaceObjectBuilder extends fb.ObjectBuilder {
|
class InParentNamespaceObjectBuilder extends fb.ObjectBuilder {
|
||||||
|
|
||||||
InParentNamespaceObjectBuilder();
|
InParentNamespaceObjectBuilder();
|
||||||
|
|
||||||
/// Finish building, and store into the [fbBuilder].
|
/// Finish building, and store into the [fbBuilder].
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
# Documentation
|
|
||||||
|
|
||||||
This is the source of the FlatBuffers documentation, that is served at
|
|
||||||
https://flatbuffers.dev.
|
|
||||||
|
|
||||||
|
|
||||||
## Local Building
|
|
||||||
|
|
||||||
The documentation can be built and served locally during development, see <https://flatbuffers.dev/contributing/#local-development> for full details.
|
|
||||||
|
|
||||||
__tl;dr__
|
|
||||||
|
|
||||||
Install:
|
|
||||||
|
|
||||||
```
|
|
||||||
pip install mkdocs-material
|
|
||||||
pip install mkdocs-redirects
|
|
||||||
```
|
|
||||||
|
|
||||||
Build and Serve:
|
|
||||||
|
|
||||||
```
|
|
||||||
mkdocs serve -f docs/mkdocs.yml
|
|
||||||
```
|
|
||||||
14
docs/footer.html
Normal file
14
docs/footer.html
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<!-- Google Analytics -->
|
||||||
|
<script>
|
||||||
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
|
|
||||||
|
ga('create', 'UA-49880327-7', 'auto');
|
||||||
|
ga('send', 'pageview');
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
62
docs/header.html
Normal file
62
docs/header.html
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<!-- HTML header for doxygen 1.8.6-->
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
|
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||||
|
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
|
||||||
|
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="$relpath^jquery.js"></script>
|
||||||
|
<script type="text/javascript" src="$relpath^dynsections.js"></script>
|
||||||
|
$treeview
|
||||||
|
$search
|
||||||
|
$mathjax
|
||||||
|
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,400italic,500,500italic,700,700italic|Roboto+Mono:400,700" rel="stylesheet">
|
||||||
|
$extrastylesheet
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||||
|
|
||||||
|
<!--BEGIN TITLEAREA-->
|
||||||
|
<div id="titlearea" style="height: 110px;">
|
||||||
|
<table cellspacing="0" cellpadding="0">
|
||||||
|
<tbody>
|
||||||
|
<tr style="height: 56px;">
|
||||||
|
<!--BEGIN PROJECT_LOGO-->
|
||||||
|
<td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
|
||||||
|
<!--END PROJECT_LOGO-->
|
||||||
|
<td id="commonprojectlogo">
|
||||||
|
<img alt="Logo" src="$relpath^fpl_logo_small.png"/>
|
||||||
|
</td>
|
||||||
|
<!--BEGIN PROJECT_NAME-->
|
||||||
|
<td style="padding-left: 0.5em;">
|
||||||
|
<div id="projectname">$projectname
|
||||||
|
<!--BEGIN PROJECT_NUMBER--> <span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER-->
|
||||||
|
</div>
|
||||||
|
<div style="font-size:12px;">
|
||||||
|
An open source project by <a href="https://developers.google.com/games/#Tools">FPL</a>.
|
||||||
|
</div>
|
||||||
|
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME-->
|
||||||
|
<!--BEGIN PROJECT_BRIEF-->
|
||||||
|
<td style="padding-left: 0.5em;">
|
||||||
|
<div id="projectbrief">$projectbrief</div>
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_BRIEF-->
|
||||||
|
<!--END !PROJECT_NAME-->
|
||||||
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
|
<!--BEGIN SEARCHENGINE-->
|
||||||
|
<td>$searchbox</td>
|
||||||
|
<!--END SEARCHENGINE-->
|
||||||
|
<!--END DISABLE_INDEX-->
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--END TITLEAREA-->
|
||||||
|
<!-- end header part -->
|
||||||
BIN
docs/images/fpl_logo_small.png
Normal file
BIN
docs/images/fpl_logo_small.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.0 KiB |
BIN
docs/images/ftv2mnode.png
Normal file
BIN
docs/images/ftv2mnode.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.0 KiB |
BIN
docs/images/ftv2pnode.png
Normal file
BIN
docs/images/ftv2pnode.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.0 KiB |
159
docs/mkdocs.yml
159
docs/mkdocs.yml
@@ -1,159 +0,0 @@
|
|||||||
site_name: FlatBuffers Docs
|
|
||||||
docs_dir: source
|
|
||||||
site_url: https://flatbuffers.dev
|
|
||||||
repo_name: google/FlatBuffers
|
|
||||||
repo_url: https://github.com/google/flatbuffers
|
|
||||||
edit_uri: edit/master/docs/source/
|
|
||||||
copyright: Copyright © 2025 Google
|
|
||||||
theme:
|
|
||||||
name: material
|
|
||||||
logo: assets/flatbuffers_logo.svg
|
|
||||||
icon:
|
|
||||||
repo: fontawesome/brands/github
|
|
||||||
custom_dir: overrides
|
|
||||||
palette:
|
|
||||||
# Palette toggle for light mode
|
|
||||||
- scheme: default
|
|
||||||
toggle:
|
|
||||||
icon: material/brightness-7
|
|
||||||
name: Switch to dark mode
|
|
||||||
|
|
||||||
# Palette toggle for dark mode
|
|
||||||
- scheme: slate
|
|
||||||
toggle:
|
|
||||||
icon: material/brightness-4
|
|
||||||
name: Switch to light mode
|
|
||||||
|
|
||||||
features:
|
|
||||||
# Allows code block annotations
|
|
||||||
- content.code.annotate
|
|
||||||
|
|
||||||
# Allows content tabs to link together
|
|
||||||
- content.tabs.link
|
|
||||||
|
|
||||||
# Expand nav folders by default
|
|
||||||
- navigation.expand
|
|
||||||
|
|
||||||
# Enable the footer
|
|
||||||
- navigation.footer
|
|
||||||
|
|
||||||
# Auto hide the header after scrolling
|
|
||||||
- header.autohide
|
|
||||||
|
|
||||||
- content.action.edit
|
|
||||||
|
|
||||||
extra:
|
|
||||||
social:
|
|
||||||
- icon: fontawesome/brands/github
|
|
||||||
link: https://github.com/google/flatbuffers
|
|
||||||
|
|
||||||
- icon: fontawesome/brands/discord
|
|
||||||
link: https:///discord.gg/6qgKs3R
|
|
||||||
|
|
||||||
- icon: fontawesome/brands/x-twitter
|
|
||||||
link: https://twitter.com/dbaileychess
|
|
||||||
|
|
||||||
plugins:
|
|
||||||
# Use redirects to update links from the original docs to the new ones.
|
|
||||||
#
|
|
||||||
# https://github.com/mkdocs/mkdocs-redirects
|
|
||||||
- redirects:
|
|
||||||
# Note the .html are suffixed with .md to avoid warnings. Got from
|
|
||||||
# https://github.com/mkdocs/mkdocs-redirects/issues/51#issuecomment-2408548029
|
|
||||||
redirect_maps:
|
|
||||||
'flatbuffers_guide_building.html.md': 'building.md'
|
|
||||||
'flatbuffers_guide_tutorial.html.md': 'tutorial.md'
|
|
||||||
'flatbuffers_guide_using_schema_compiler.html.md': 'flatc.md'
|
|
||||||
'flatbuffers_guide_writing_schema.html.md': 'schema.md'
|
|
||||||
'md__schemas.html.md': 'schema.md' # issue #8485
|
|
||||||
'flatbuffers_guide_use_c.html.md': 'languages/c.md'
|
|
||||||
'flatbuffers_guide_use_cpp.html.md': 'languages/cpp.md'
|
|
||||||
'flatbuffers_guide_use_c-sharp.html.md': 'languages/c_sharp.md'
|
|
||||||
'flatbuffers_guide_use_dart.html.md': 'languages/dart.md'
|
|
||||||
'flatbuffers_guide_use_go.html.md': 'languages/go.md'
|
|
||||||
'flatbuffers_guide_use_java.html.md': 'languages/java.md'
|
|
||||||
'flatbuffers_guide_use_javascript.html.md': 'languages/javascript.md'
|
|
||||||
'flatbuffers_guide_use_lobster.html.md': 'languages/lobster.md'
|
|
||||||
'flatbuffers_guide_use_lua.html.md': 'languages/lua.md'
|
|
||||||
'flatbuffers_guide_use_php.html.md': 'languages/php.md'
|
|
||||||
'flatbuffers_guide_use_python.html.md': 'languages/python.md'
|
|
||||||
'flatbuffers_guide_use_rust.html.md': 'languages/rust.md'
|
|
||||||
'flatbuffers_guide_use_swift.html.md': 'languages/swift.md'
|
|
||||||
'flatbuffers_guide_use_typescript.html.md': 'languages/typescript.md'
|
|
||||||
'flatbuffers_grpc_guide_use_cpp.html.md' : "languages/cpp.md#grpc"
|
|
||||||
'flatbuffers_support.html.md': 'support.md'
|
|
||||||
'flatbuffers_white_paper.html.md': 'white_paper.md'
|
|
||||||
'flatbuffers_grammar.html.md': 'grammar.md'
|
|
||||||
'flatbuffers_internals.html.md': 'internals.md'
|
|
||||||
'intermediate_representation.html.md': 'intermediate_representation.md'
|
|
||||||
'flatbuffers_benchmarks.html.md': 'benchmarks.md'
|
|
||||||
'flexbuffers.html.md': 'flexbuffers.md'
|
|
||||||
'contributing.html.md': 'contributing.md'
|
|
||||||
|
|
||||||
|
|
||||||
markdown_extensions:
|
|
||||||
- admonition
|
|
||||||
- attr_list
|
|
||||||
- md_in_html
|
|
||||||
- pymdownx.critic
|
|
||||||
- pymdownx.details
|
|
||||||
- pymdownx.emoji:
|
|
||||||
emoji_index: !!python/name:material.extensions.emoji.twemoji
|
|
||||||
emoji_generator: !!python/name:material.extensions.emoji.to_svg
|
|
||||||
- pymdownx.snippets:
|
|
||||||
# Allows direct embedded of remote files
|
|
||||||
url_download: true
|
|
||||||
- pymdownx.superfences
|
|
||||||
- pymdownx.tabbed:
|
|
||||||
alternate_style: true
|
|
||||||
slugify: !!python/object/apply:pymdownx.slugs.slugify
|
|
||||||
kwds:
|
|
||||||
case: lower
|
|
||||||
- pymdownx.highlight:
|
|
||||||
extend_pygments_lang:
|
|
||||||
# PHP wasn't highlighting correctly. This is a work around found
|
|
||||||
# https://github.com/squidfunk/mkdocs-material/issues/138#issuecomment-2294025627
|
|
||||||
- name: php
|
|
||||||
lang: php
|
|
||||||
options:
|
|
||||||
startinline: true
|
|
||||||
- tables
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
nav:
|
|
||||||
- Overview: "index.md"
|
|
||||||
- Quick Start: "quick_start.md"
|
|
||||||
- Tutorial: "tutorial.md"
|
|
||||||
- Compiler (flatc):
|
|
||||||
- Building: "building.md"
|
|
||||||
- Using: "flatc.md"
|
|
||||||
- Schema (.fbs):
|
|
||||||
- Overview: "schema.md"
|
|
||||||
- Evolution: "evolution.md"
|
|
||||||
- Grammar: "grammar.md"
|
|
||||||
- Language Guides:
|
|
||||||
- C: "languages/c.md"
|
|
||||||
- C++: "languages/cpp.md"
|
|
||||||
- C#: "languages/c_sharp.md"
|
|
||||||
- Dart: "languages/dart.md"
|
|
||||||
- Go: "languages/go.md"
|
|
||||||
- Java: "languages/java.md"
|
|
||||||
- JavaScript: "languages/javascript.md"
|
|
||||||
- Kotlin: "languages/kotlin.md"
|
|
||||||
- Lobster: "languages/lobster.md"
|
|
||||||
- Lua: "languages/lua.md"
|
|
||||||
- PHP: "languages/php.md"
|
|
||||||
- Python: "languages/python.md"
|
|
||||||
- Rust: "languages/rust.md"
|
|
||||||
- Swift: "languages/swift.md"
|
|
||||||
- TypeScript: "languages/typescript.md"
|
|
||||||
- Supported Configurations: "support.md"
|
|
||||||
- White Paper: "white_paper.md"
|
|
||||||
- Advanced:
|
|
||||||
- FlatBuffers Internals: "internals.md"
|
|
||||||
- Intermediate Representation: "intermediate_representation.md"
|
|
||||||
- Annotating Buffers (.afb): "annotation.md"
|
|
||||||
- Benchmarks: "benchmarks.md"
|
|
||||||
- FlexBuffers (Schema-less version): "flexbuffers.md"
|
|
||||||
- Contributing: "contributing.md"
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{% extends "main.html" %}
|
|
||||||
|
|
||||||
<!-- Content -->
|
|
||||||
{% block content %}
|
|
||||||
<h1>404 - Not found</h1>
|
|
||||||
<br>
|
|
||||||
FlatBuffers has migrated their documentation system recently.
|
|
||||||
|
|
||||||
Please <a href="https://github.com/google/flatbuffers/issues/new?template=404-doc.md">file an issue</a> indicating the broken link.
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{% extends "base.html" %}
|
|
||||||
@@ -1,104 +1,52 @@
|
|||||||
# Building
|
Building {#flatbuffers_guide_building}
|
||||||
|
========
|
||||||
|
|
||||||
## Building with CMake
|
## Building with CMake
|
||||||
|
|
||||||
The distribution main build system is configured by
|
The distribution comes with a `cmake` file that should allow
|
||||||
[`cmake`](https://www.cmake.org) which allows you to build the project for any
|
you to build project/make files for any platform. For details on `cmake`, see
|
||||||
platform.
|
<https://www.cmake.org>. In brief, depending on your platform, use one of
|
||||||
|
e.g.:
|
||||||
|
|
||||||
### Configuration
|
|
||||||
|
|
||||||
Use `cmake` to configure a project based on your environment and platform.
|
|
||||||
|
|
||||||
=== "Unix"
|
|
||||||
|
|
||||||
```sh
|
|
||||||
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
|
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
|
||||||
```
|
cmake -G "Visual Studio 10" -DCMAKE_BUILD_TYPE=Release
|
||||||
|
|
||||||
To use `clang` instead of `gcc` you may need to set prepend some environment
|
|
||||||
variables e.g. `CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake -G "Unix
|
|
||||||
MakeFiles"`
|
|
||||||
|
|
||||||
=== "Windows"
|
|
||||||
|
|
||||||
```sh
|
|
||||||
cmake -G "Visual Studio 17 2022" -DCMAKE_BUILD_TYPE=Release
|
|
||||||
```
|
|
||||||
|
|
||||||
=== "MacOS"
|
|
||||||
|
|
||||||
```sh
|
|
||||||
cmake -G "Xcode" -DCMAKE_BUILD_TYPE=Release
|
cmake -G "Xcode" -DCMAKE_BUILD_TYPE=Release
|
||||||
```
|
|
||||||
|
|
||||||
#### Strict Mode
|
Then, build as normal for your platform. This should result in a `flatc`
|
||||||
|
executable, essential for the next steps.
|
||||||
|
Note that to use clang instead of gcc, you may need to set up your environment
|
||||||
|
variables, e.g.
|
||||||
|
`CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake -G "Unix Makefiles"`.
|
||||||
|
|
||||||
By default, `cmake` will configure targets to **not** build with strict warnings
|
Optionally, run the `flattests` executable from the root `flatbuffers/`
|
||||||
on (e.g. `-Werror` or `/WX`). This may cause into issues when submitting code
|
directory to ensure everything is working correctly on your system. If this
|
||||||
changes since our CI requires the code to compile in strict mode.
|
fails, please contact us!
|
||||||
|
|
||||||
To enable the extra warnings, turn on strict mode with the
|
Building should also produce two sample executables, `flatsamplebinary` and
|
||||||
`FLATBUFFERS_STRICT_MODE` cmake option.
|
`flatsampletext`, see the corresponding `.cpp` files in the
|
||||||
|
`flatbuffers/samples` directory.
|
||||||
|
|
||||||
```cmake
|
*Note that you MUST be in the root of the FlatBuffers distribution when you
|
||||||
cmake -DFLATBUFFERS_STRICT_MODE=ON
|
run 'flattests' or `flatsampletext`, or it will fail to load its files.*
|
||||||
|
|
||||||
|
### Make all warnings into errors
|
||||||
|
|
||||||
|
By default all Flatbuffers `cmake` targets are **not** built with the `-Werror`
|
||||||
|
(or `/WX` for MSVC) flag that treats any warning as an error. This allows more
|
||||||
|
flexibility for users of Flatbuffers to use newer compilers and toolsets that
|
||||||
|
may add new warnings that would cause a build failure.
|
||||||
|
|
||||||
|
To enable a stricter build that does treat warnings as errors, set the
|
||||||
|
`FLATBUFFERS_STRICT_MODE` `cmake` compliation flag to `ON`.
|
||||||
|
|
||||||
|
```
|
||||||
|
cmake . -DFLATBUFFERS_STRICT_MODE=ON
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Our CI builds run with strict mode on, ensuring the code that is committed to
|
||||||
### Building
|
the project is as portable and warning free as possible. Thus developers
|
||||||
|
contributing to the project should enable strict mode locally before making a
|
||||||
Once the project files are generated, build as normal for your platform.
|
PR.
|
||||||
|
|
||||||
=== "Unix"
|
|
||||||
|
|
||||||
```sh
|
|
||||||
make -j
|
|
||||||
```
|
|
||||||
|
|
||||||
=== "Windows"
|
|
||||||
|
|
||||||
```sh
|
|
||||||
msbuild.exe FlatBuffers.sln
|
|
||||||
```
|
|
||||||
|
|
||||||
=== "MacOS"
|
|
||||||
|
|
||||||
```sh
|
|
||||||
xcodebuild -toolchain clang -configuration Release
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Building with Bazel
|
|
||||||
|
|
||||||
You can use [Bazelisk](https://github.com/bazelbuild/bazelisk) to manage your Bazel environment.
|
|
||||||
For Swift support, you also need Clang and [Swift SDK](https://download.swift.org/).
|
|
||||||
|
|
||||||
```sh
|
|
||||||
curl -sL --fail https://github.com/bazelbuild/bazelisk/releases/download/v1.25.0/bazelisk-linux-amd64 -o bazelisk && chmod +x bazelisk
|
|
||||||
sudo apt install -y clang
|
|
||||||
SWIFT_VERSION="6.0.3"
|
|
||||||
curl -L https://download.swift.org/swift-${SWIFT_VERSION}-release/debian12/swift-${SWIFT_VERSION}-RELEASE/swift-${SWIFT_VERSION}-RELEASE-debian12.tar.gz | tar xz
|
|
||||||
CC=clang PATH=$PATH:$(pwd)/swift-${SWIFT_VERSION}-RELEASE-debian12/usr/bin bazel build //...
|
|
||||||
CC=clang PATH=$PATH:$(pwd)/swift-${SWIFT_VERSION}-RELEASE-debian12/usr/bin bazel test //...
|
|
||||||
```
|
|
||||||
|
|
||||||
If you are unsure which versions to use, check our CI config at `.bazelci/presubmit.yml`.
|
|
||||||
|
|
||||||
## Building with Conan
|
|
||||||
|
|
||||||
You can download and install flatbuffers using the [Conan](https://conan.io/) dependency manager:
|
|
||||||
|
|
||||||
conan install --requires="flatbuffers/[*]" --build=missing
|
|
||||||
|
|
||||||
The flatbuffers package in Conan Center is maintained by
|
|
||||||
[ConanCenterIndex](https://github.com/conan-io/conan-center-index) community.
|
|
||||||
If the version is out of date or the package does not work,
|
|
||||||
please create an issue or pull request on the [Conan Center Index repository](https://github.com/conan-io/conan-center-index).
|
|
||||||
|
|
||||||
## Building with VCPKG
|
## Building with VCPKG
|
||||||
|
|
||||||
@@ -113,7 +61,17 @@ You can download and install flatbuffers using the [vcpkg](https://github.com/Mi
|
|||||||
The flatbuffers port in vcpkg is kept up to date by Microsoft team members and community contributors.
|
The flatbuffers port in vcpkg is kept up to date by Microsoft team members and community contributors.
|
||||||
If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.
|
If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.
|
||||||
|
|
||||||
|
## Downloading binaries
|
||||||
|
You can download the binaries from the
|
||||||
|
[GitHub release page](https://github.com/google/flatbuffers/releases).
|
||||||
|
|
||||||
|
We generate [SLSA3 signatures](slsa.dev) using the OpenSSF's [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator). To verify the binaries:
|
||||||
|
1. Install the verification tool from [slsa-framework/slsa-verifier#installation](https://github.com/slsa-framework/slsa-verifier#installation)
|
||||||
|
1. Download the file named `attestation.intoto.jsonl` from the GitHub release
|
||||||
|
1. Run:
|
||||||
|
```shell
|
||||||
|
$ slsa-verifier -artifact-path <downloaded.zip> -provenance attestation.intoto.jsonl -source github.com/google/flatbuffers -tag <version>
|
||||||
|
PASSED: Verified SLSA provenance
|
||||||
|
|
||||||
## Building for Android
|
## Building for Android
|
||||||
|
|
||||||
@@ -138,7 +96,7 @@ also compile/link `src/idl_parser.cpp` (and `src/idl_gen_text.cpp` if you
|
|||||||
also want to be able convert binary to text).
|
also want to be able convert binary to text).
|
||||||
|
|
||||||
To see how to include FlatBuffers in any of our supported languages, please
|
To see how to include FlatBuffers in any of our supported languages, please
|
||||||
view the [Tutorial](tutorial.md) and select your appropriate
|
view the [Tutorial](@ref flatbuffers_guide_tutorial) and select your appropriate
|
||||||
language using the radio buttons.
|
language using the radio buttons.
|
||||||
|
|
||||||
### Using in CMake-based projects
|
### Using in CMake-based projects
|
||||||
@@ -163,26 +121,13 @@ add_subdirectory(${FLATBUFFERS_SRC_DIR}
|
|||||||
# The flatbuffers target carry header search path automatically if CMake > 2.8.11.
|
# The flatbuffers target carry header search path automatically if CMake > 2.8.11.
|
||||||
target_link_libraries(own_project_target PRIVATE flatbuffers)
|
target_link_libraries(own_project_target PRIVATE flatbuffers)
|
||||||
```
|
```
|
||||||
When build your project the `flatbuffers` library will be compiled and linked
|
When build your project the `flatbuffers` library will be compiled and linked
|
||||||
to a target as part of your project.
|
to a target as part of your project.
|
||||||
|
|
||||||
#### Override default depth limit of nested objects
|
#### Override default depth limit of nested objects
|
||||||
To override [the depth limit of recursion](languages/cpp.md),
|
To override [the depth limit of recursion](@ref flatbuffers_guide_use_cpp),
|
||||||
add this directive:
|
add this directive:
|
||||||
```cmake
|
```cmake
|
||||||
set(FLATBUFFERS_MAX_PARSING_DEPTH 16)
|
set(FLATBUFFERS_MAX_PARSING_DEPTH 16)
|
||||||
```
|
```
|
||||||
to `CMakeLists.txt` file before `add_subdirectory(${FLATBUFFERS_SRC_DIR})` line.
|
to `CMakeLists.txt` file before `add_subdirectory(${FLATBUFFERS_SRC_DIR})` line.
|
||||||
|
|
||||||
## Downloading binaries
|
|
||||||
You can download the binaries from the
|
|
||||||
[GitHub release page](https://github.com/google/flatbuffers/releases).
|
|
||||||
|
|
||||||
We generate [SLSA3 signatures](http://slsa.dev) using the OpenSSF's [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator). To verify the binaries:
|
|
||||||
1. Install the verification tool from [slsa-framework/slsa-verifier#installation](https://github.com/slsa-framework/slsa-verifier#installation)
|
|
||||||
1. Download the file named `attestation.intoto.jsonl` from the GitHub release
|
|
||||||
1. Run:
|
|
||||||
```shell
|
|
||||||
$ slsa-verifier -artifact-path <downloaded.zip> -provenance attestation.intoto.jsonl -source github.com/google/flatbuffers -tag <version>
|
|
||||||
PASSED: Verified SLSA provenance
|
|
||||||
```
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
flatbuffers.dev
|
|
||||||
1
docs/source/CONTRIBUTING.md
Symbolic link
1
docs/source/CONTRIBUTING.md
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../CONTRIBUTING.md
|
||||||
@@ -12,7 +12,7 @@ project.
|
|||||||
|
|
||||||
## General Documention
|
## General Documention
|
||||||
|
|
||||||
- [Tutorial](../tutorial.md) - select C as language
|
- [Tutorial](@ref flatbuffers_guide_tutorial) - select C as language
|
||||||
when scrolling down
|
when scrolling down
|
||||||
- [FlatCC Guide](https://github.com/dvidelabs/flatcc#flatcc-flatbuffers-in-c-for-c)
|
- [FlatCC Guide](https://github.com/dvidelabs/flatcc#flatcc-flatbuffers-in-c-for-c)
|
||||||
- [The C Builder Interface](https://github.com/dvidelabs/flatcc/blob/master/doc/builder.md#the-builder-interface)
|
- [The C Builder Interface](https://github.com/dvidelabs/flatcc/blob/master/doc/builder.md#the-builder-interface)
|
||||||
@@ -1,92 +1,70 @@
|
|||||||
# FlatBuffers Compiler (`flatc`)
|
Using the schema compiler {#flatbuffers_guide_using_schema_compiler}
|
||||||
|
=========================
|
||||||
|
|
||||||
The main compiler for FlatBuffers is called `flatc` and is used to convert
|
Usage:
|
||||||
schema definitions into generated code files for a variety of languages.
|
|
||||||
|
|
||||||
After [building](building.md) `flatc`, it is used as follows:
|
flatc [ GENERATOR OPTIONS ] [ -o PATH ] [ -I PATH ] FILES...
|
||||||
|
[ -- FILES...]
|
||||||
|
|
||||||
```sh
|
The files are read and parsed in order, and can contain either schemas
|
||||||
flatc [ GENERATOR_OPTIONS ] [ -o PATH ] [- I PATH ]
|
or data (see below). Data files are processed according to the definitions of
|
||||||
FILES...
|
the most recent schema specified.
|
||||||
[ -- BINARY_FILES... ]
|
|
||||||
```
|
|
||||||
|
|
||||||
* The `GENERATOR_OPTIONS` specify the language(s) to compile code for as well as
|
`--` indicates that the following files are binary files in
|
||||||
various features to enable/disable.
|
FlatBuffer format conforming to the schema indicated before it.
|
||||||
|
|
||||||
* The `-o PATH` specifies the path where the generated files are placed. It
|
Depending on the flags passed, additional files may
|
||||||
defaults to the current path if not specified.
|
be generated for each file processed:
|
||||||
|
|
||||||
* The `-I PATH` specifies the paths where included schema files are located. It
|
For any schema input files, one or more generators can be specified:
|
||||||
defaults to the current path if not specified.
|
|
||||||
|
|
||||||
## Input Files
|
- `--cpp`, `-c` : Generate a C++ header for all definitions in this file (as
|
||||||
|
`filename_generated.h`).
|
||||||
|
|
||||||
`FILES...` specifies one or more schema or data files to process. They are
|
- `--java`, `-j` : Generate Java code.
|
||||||
processed in the order provided.
|
|
||||||
|
|
||||||
### Schema Files
|
- `--kotlin` , `--kotlin-kmp` : Generate Kotlin code.
|
||||||
|
|
||||||
For schema files, language specifiers indicate what languages to generate code
|
- `--csharp`, `-n` : Generate C# code.
|
||||||
for.
|
|
||||||
|
|
||||||
* `--cpp`: C++
|
- `--go`, `-g` : Generate Go code.
|
||||||
* `--java`: Java
|
|
||||||
* `--kotlin`: Kotlin
|
|
||||||
* `--csharp`: C#
|
|
||||||
* `--go`: Golang
|
|
||||||
* `--python`: Python
|
|
||||||
* `--js`: JavaScript
|
|
||||||
* `--ts`: TypeScript
|
|
||||||
* `--php`: PHP
|
|
||||||
* `--dart`: Dart
|
|
||||||
* `--lua`: Lua
|
|
||||||
* `--lobster`: Lobster
|
|
||||||
* `--rust`: Rust
|
|
||||||
* `--swift`: Swift
|
|
||||||
* `--nim`: Nim
|
|
||||||
|
|
||||||
Additionally, adding:
|
- `--python`, `-p` : Generate Python code.
|
||||||
|
|
||||||
* `--grpc` Will generate RPC stub code for gRPC (not available in all
|
- `--js`, `-s` : Generate JavaScript code.
|
||||||
languages)
|
|
||||||
|
|
||||||
### Data Files
|
- `--ts`, `-T` : Generate TypeScript code.
|
||||||
|
|
||||||
If `FILES...` contain data files, they can be exported to either a binary or
|
- `--php` : Generate PHP code.
|
||||||
JSON representation.
|
|
||||||
|
|
||||||
* `--binary`, `-b`: Generate a binary file containing a serialized flatbuffer.
|
- `--grpc` : Generate RPC stub code for GRPC.
|
||||||
* `--json`, `-j`: Generate JSON file from a serialized flatbuffer.
|
|
||||||
|
|
||||||
Both options require the corresponding schema file to be included first in the
|
- `--dart`, `-d` : Generate Dart code.
|
||||||
list of `FILES...`.
|
|
||||||
|
|
||||||
=== "To Binary"
|
- `--lua`, `-l` : Generate Lua code.
|
||||||
|
|
||||||
To serialize the JSON data in `mydata.json` using the schema `myschema.fbs`:
|
- `--lobster` : Generate Lobster code.
|
||||||
|
|
||||||
```sh
|
- `--rust`, `-r` : Generate Rust code.
|
||||||
flatc --binary myschema.fbs mydata.json
|
|
||||||
```
|
|
||||||
|
|
||||||
This will generate a `mydata_wire.bin` file containing the serialized
|
- `--swift` : Generate Swift code.
|
||||||
flatbuffer data.
|
|
||||||
|
|
||||||
=== "To JSON"
|
- `--nim` : Generate Nim code.
|
||||||
|
|
||||||
To convert the serialized binary flatbuffer `mydata.bin` using the schema
|
|
||||||
`myschema.fbs` to JSON:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
flatc --json myschema.fbs -- mydata.bin
|
|
||||||
```
|
|
||||||
|
|
||||||
This will generate a `mydata.json` file. If there is no
|
For any data input files:
|
||||||
[`file_identifier`](schema.md/#file-identification-and-extension) defined
|
|
||||||
for this schema, you will need to use the `--raw-binary` option.
|
|
||||||
|
|
||||||
### Additional options
|
- `--binary`, `-b` : If data is contained in this file, generate a
|
||||||
|
`filename.bin` containing the binary flatbuffer (or a different extension
|
||||||
|
if one is specified in the schema).
|
||||||
|
|
||||||
|
- `--json`, `-t` : If data is contained in this file, generate a
|
||||||
|
`filename.json` representing the data in the flatbuffer.
|
||||||
|
|
||||||
|
- `--jsonschema` : Generate Json schema
|
||||||
|
|
||||||
|
Additional options:
|
||||||
|
|
||||||
- `-o PATH` : Output all generated files to PATH (either absolute, or
|
- `-o PATH` : Output all generated files to PATH (either absolute, or
|
||||||
relative to the current directory). If omitted, PATH will be the
|
relative to the current directory). If omitted, PATH will be the
|
||||||
@@ -118,10 +96,10 @@ list of `FILES...`.
|
|||||||
|
|
||||||
- `--scoped-enums` : Use C++11 style scoped and strongly typed enums in
|
- `--scoped-enums` : Use C++11 style scoped and strongly typed enums in
|
||||||
generated C++. This also implies `--no-prefix`.
|
generated C++. This also implies `--no-prefix`.
|
||||||
|
|
||||||
- `--no-emit-min-max-enum-values` : Disable generation of MIN and MAX
|
- `--no-emit-min-max-enum-values` : Disable generation of MIN and MAX
|
||||||
enumerated values for scoped enums and prefixed enums.
|
enumerated values for scoped enums and prefixed enums.
|
||||||
|
|
||||||
- `--gen-includes` : (deprecated), this is the default behavior.
|
- `--gen-includes` : (deprecated), this is the default behavior.
|
||||||
If the original behavior is required (no include
|
If the original behavior is required (no include
|
||||||
statements) use `--no-includes.`
|
statements) use `--no-includes.`
|
||||||
@@ -132,7 +110,7 @@ list of `FILES...`.
|
|||||||
- `--gen-mutable` : Generate additional non-const accessors for mutating
|
- `--gen-mutable` : Generate additional non-const accessors for mutating
|
||||||
FlatBuffers in-place.
|
FlatBuffers in-place.
|
||||||
|
|
||||||
- `--gen-onefile` : Generate a single output file for C#, Go, Java, Kotlin and Python.
|
- `--gen-onefile` : Generate single output file for C#, Go, and Python.
|
||||||
|
|
||||||
- `--gen-name-strings` : Generate type name functions for C++.
|
- `--gen-name-strings` : Generate type name functions for C++.
|
||||||
|
|
||||||
@@ -260,50 +238,5 @@ list of `FILES...`.
|
|||||||
|
|
||||||
- `--python-typing` : Generate Python type annotations
|
- `--python-typing` : Generate Python type annotations
|
||||||
|
|
||||||
- `--python-decode-obj-api-strings` : Decode bytes automaticaly with utf-8
|
|
||||||
|
|
||||||
- `--file-names-only` : Prints out files which would be generated by this command, one per
|
|
||||||
line, to `stdout`. No actual files are generated. This is useful for various CI checks.
|
|
||||||
|
|
||||||
Additional gRPC options:
|
|
||||||
|
|
||||||
- `--grpc-filename-suffix`: `[C++]` An optional suffix for the generated
|
|
||||||
files' names. For example, compiling gRPC for C++ with
|
|
||||||
`--grpc-filename-suffix=.fbs` will generate `{name}.fbs.h` and
|
|
||||||
`{name}.fbs.cc` files.
|
|
||||||
|
|
||||||
- `--grpc-additional-header`: `[C++]` Additional headers to include in the
|
|
||||||
generated files.
|
|
||||||
|
|
||||||
- `--grpc-search-path`: `[C++]` An optional prefix for the gRPC runtime path.
|
|
||||||
For example, compiling gRPC for C++ with `--grpc-search-path=some/path` will
|
|
||||||
generate the following includes:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "some/path/grpcpp/impl/codegen/async_stream.h"
|
|
||||||
#include "some/path/grpcpp/impl/codegen/async_unary_call.h"
|
|
||||||
#include "some/path/grpcpp/impl/codegen/method_handler.h"
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
- `--grpc-use-system-headers`: `[C++]` Whether to generate `#include <header>`
|
|
||||||
instead of `#include "header.h"` for all headers when compiling gRPC for
|
|
||||||
C++. For example, compiling gRPC for C++ with `--grpc-use-system-headers`
|
|
||||||
will generate the following includes:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include <some/path/grpcpp/impl/codegen/async_stream.h>
|
|
||||||
#include <some/path/grpcpp/impl/codegen/async_unary_call.h>
|
|
||||||
#include <some/path/grpcpp/impl/codegen/method_handler.h>
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
NOTE: This option can be negated with `--no-grpc-use-system-headers`.
|
|
||||||
|
|
||||||
- `--grpc-python-typed-handlers`: `[Python]` Whether to generate the typed
|
|
||||||
handlers that use the generated Python classes instead of raw bytes for
|
|
||||||
requests/responses.
|
|
||||||
|
|
||||||
NOTE: short-form options for generators are deprecated, use the long form
|
NOTE: short-form options for generators are deprecated, use the long form
|
||||||
whenever possible.
|
whenever possible.
|
||||||
|
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
# Language Guide: C++
|
Use in C++ {#flatbuffers_guide_use_cpp}
|
||||||
|
==========
|
||||||
|
|
||||||
## Before you get started
|
## Before you get started
|
||||||
|
|
||||||
Before diving into the FlatBuffers usage in C++, it should be noted that
|
Before diving into the FlatBuffers usage in C++, it should be noted that
|
||||||
the [Tutorial](../tutorial.md) page has a complete guide
|
the [Tutorial](@ref flatbuffers_guide_tutorial) page has a complete guide
|
||||||
to general FlatBuffers usage in all of the supported languages (including C++).
|
to general FlatBuffers usage in all of the supported languages (including C++).
|
||||||
This page is designed to cover the nuances of FlatBuffers usage, specific to
|
This page is designed to cover the nuances of FlatBuffers usage, specific to
|
||||||
C++.
|
C++.
|
||||||
@@ -12,8 +13,8 @@ C++.
|
|||||||
|
|
||||||
This page assumes you have written a FlatBuffers schema and compiled it
|
This page assumes you have written a FlatBuffers schema and compiled it
|
||||||
with the Schema Compiler. If you have not, please see
|
with the Schema Compiler. If you have not, please see
|
||||||
[Using the schema compiler](../flatc.md)
|
[Using the schema compiler](@ref flatbuffers_guide_using_schema_compiler)
|
||||||
and [Writing a schema](../schema.md).
|
and [Writing a schema](@ref flatbuffers_guide_writing_schema).
|
||||||
|
|
||||||
Assuming you wrote a schema, say `mygame.fbs` (though the extension doesn't
|
Assuming you wrote a schema, say `mygame.fbs` (though the extension doesn't
|
||||||
matter), you've generated a C++ header called `mygame_generated.h` using the
|
matter), you've generated a C++ header called `mygame_generated.h` using the
|
||||||
@@ -34,7 +35,7 @@ The test code itself is located in
|
|||||||
[test.cpp](https://github.com/google/flatbuffers/blob/master/tests/test.cpp).
|
[test.cpp](https://github.com/google/flatbuffers/blob/master/tests/test.cpp).
|
||||||
|
|
||||||
This test file is built alongside `flatc`. To review how to build the project,
|
This test file is built alongside `flatc`. To review how to build the project,
|
||||||
please read the [Building](../building.md) documentation.
|
please read the [Building](@ref flatbuffers_guide_building) documentation.
|
||||||
|
|
||||||
To run the tests, execute `flattests` from the root `flatbuffers/` directory.
|
To run the tests, execute `flattests` from the root `flatbuffers/` directory.
|
||||||
For example, on [Linux](https://en.wikipedia.org/wiki/Linux), you would simply
|
For example, on [Linux](https://en.wikipedia.org/wiki/Linux), you would simply
|
||||||
@@ -42,7 +43,7 @@ run: `./flattests`.
|
|||||||
|
|
||||||
## Using the FlatBuffers C++ library
|
## Using the FlatBuffers C++ library
|
||||||
|
|
||||||
*Note: See [Tutorial](../tutorial.md) for a more in-depth
|
*Note: See [Tutorial](@ref flatbuffers_guide_tutorial) for a more in-depth
|
||||||
example of how to use FlatBuffers in C++.*
|
example of how to use FlatBuffers in C++.*
|
||||||
|
|
||||||
FlatBuffers supports both reading and writing FlatBuffers in C++.
|
FlatBuffers supports both reading and writing FlatBuffers in C++.
|
||||||
@@ -57,7 +58,7 @@ a `char *` array, which you pass to `GetMonster()`.
|
|||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
#include "flatbuffers/flatbuffers.h"
|
#include "flatbuffers/flatbuffers.h"
|
||||||
#include "monster_test_generated.h"
|
#include "monster_test_generate.h"
|
||||||
#include <iostream> // C++ header file for printing
|
#include <iostream> // C++ header file for printing
|
||||||
#include <fstream> // C++ header file for file access
|
#include <fstream> // C++ header file for file access
|
||||||
|
|
||||||
@@ -95,7 +96,7 @@ The following attributes are supported:
|
|||||||
Specifically, `CreateXxxDirect` functions and `Pack` functions for object
|
Specifically, `CreateXxxDirect` functions and `Pack` functions for object
|
||||||
based API (see below) will use `CreateSharedString` to create strings.
|
based API (see below) will use `CreateSharedString` to create strings.
|
||||||
|
|
||||||
## Object based API
|
## Object based API {#flatbuffers_cpp_object_based_api}
|
||||||
|
|
||||||
FlatBuffers is all about memory efficiency, which is why its base API is written
|
FlatBuffers is all about memory efficiency, which is why its base API is written
|
||||||
around using as little as possible of it. This does make the API clumsier
|
around using as little as possible of it. This does make the API clumsier
|
||||||
@@ -242,41 +243,6 @@ provide the following functions to aide in the serialization process:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- `native_type("type")` (on a table): Tables can also be represented with
|
|
||||||
native types. For example, the following schema:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
table Matrix (native_type: "NativeMatrix") {
|
|
||||||
rows: int32;
|
|
||||||
columns: int32;
|
|
||||||
values: [float];
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Would be represented by a user-defined C++ class:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
class NativeMatrix { ... }
|
|
||||||
```
|
|
||||||
|
|
||||||
In this case, the following function declarations are generated by the compiler.
|
|
||||||
The user must provide and link the matching function definitions:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
struct Matrix FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
|
|
||||||
// ...
|
|
||||||
|
|
||||||
static ::flatbuffers::Offset<Matrix> Pack(
|
|
||||||
::flatbuffers::FlatBufferBuilder& _fbb,
|
|
||||||
const NativeMatrix* _o,
|
|
||||||
const ::flatbuffers::rehasher_function_t* _rehasher = nullptr);
|
|
||||||
|
|
||||||
void UnPackTo(
|
|
||||||
NativeMatrix* _o,
|
|
||||||
const ::flatbuffers::resolver_function_t* _resolver = nullptr) const;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Finally, the following top-level attributes:
|
Finally, the following top-level attributes:
|
||||||
|
|
||||||
- `native_include("path")` (at file level): Because the `native_type` attribute
|
- `native_include("path")` (at file level): Because the `native_type` attribute
|
||||||
@@ -288,7 +254,7 @@ Finally, the following top-level attributes:
|
|||||||
- `force_align`: this attribute may not be respected in the object API,
|
- `force_align`: this attribute may not be respected in the object API,
|
||||||
depending on the aligned of the allocator used with `new`.
|
depending on the aligned of the allocator used with `new`.
|
||||||
|
|
||||||
## External references
|
# External references
|
||||||
|
|
||||||
An additional feature of the object API is the ability to allow you to load
|
An additional feature of the object API is the ability to allow you to load
|
||||||
multiple independent FlatBuffers, and have them refer to eachothers objects
|
multiple independent FlatBuffers, and have them refer to eachothers objects
|
||||||
@@ -296,7 +262,7 @@ using hashes which are then represented as typed pointers in the object API.
|
|||||||
|
|
||||||
To make this work have a field in the objects you want to referred to which is
|
To make this work have a field in the objects you want to referred to which is
|
||||||
using the string hashing feature (see `hash` attribute in the
|
using the string hashing feature (see `hash` attribute in the
|
||||||
[schema](../schema.md) documentation). Then you have
|
[schema](@ref flatbuffers_guide_writing_schema) documentation). Then you have
|
||||||
a similar hash in the field referring to it, along with a `cpp_type`
|
a similar hash in the field referring to it, along with a `cpp_type`
|
||||||
attribute specifying the C++ type this will refer to (this can be any C++
|
attribute specifying the C++ type this will refer to (this can be any C++
|
||||||
type, and will get a `*` added).
|
type, and will get a `*` added).
|
||||||
@@ -307,7 +273,7 @@ same string (or hash).
|
|||||||
When you call `UnPack` (or `Create`), you'll need a function that maps from
|
When you call `UnPack` (or `Create`), you'll need a function that maps from
|
||||||
hash to the object (see `resolver_function_t` for details).
|
hash to the object (see `resolver_function_t` for details).
|
||||||
|
|
||||||
## Using different pointer types
|
# Using different pointer types
|
||||||
|
|
||||||
By default the object tree is built out of `std::unique_ptr`, but you can
|
By default the object tree is built out of `std::unique_ptr`, but you can
|
||||||
influence this either globally (using the `--cpp-ptr-type` argument to
|
influence this either globally (using the `--cpp-ptr-type` argument to
|
||||||
@@ -318,7 +284,7 @@ you, so you'll have to manage their lifecycles manually. To reference the
|
|||||||
pointer type specified by the `--cpp-ptr-type` argument to `flatc` from a
|
pointer type specified by the `--cpp-ptr-type` argument to `flatc` from a
|
||||||
flatbuffer field set the `cpp_ptr_type` attribute to `default_ptr_type`.
|
flatbuffer field set the `cpp_ptr_type` attribute to `default_ptr_type`.
|
||||||
|
|
||||||
## Using different string type
|
# Using different string type
|
||||||
|
|
||||||
By default the object tree is built out of `std::string`, but you can
|
By default the object tree is built out of `std::string`, but you can
|
||||||
influence this either globally (using the `--cpp-str-type` argument to
|
influence this either globally (using the `--cpp-str-type` argument to
|
||||||
@@ -454,8 +420,7 @@ Each root type will have a verification function generated for it,
|
|||||||
e.g. for `Monster`, you can call:
|
e.g. for `Monster`, you can call:
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
Verifier verifier(buf, len);
|
bool ok = VerifyMonsterBuffer(Verifier(buf, len));
|
||||||
bool ok = VerifyMonsterBuffer(verifier);
|
|
||||||
```
|
```
|
||||||
|
|
||||||
if `ok` is true, the buffer is safe to read.
|
if `ok` is true, the buffer is safe to read.
|
||||||
@@ -591,11 +556,11 @@ recursion depth. Number of nested declarations in a schema or number of
|
|||||||
nested json-objects is limited. By default, this depth limit set to `64`.
|
nested json-objects is limited. By default, this depth limit set to `64`.
|
||||||
It is possible to override this limit with `FLATBUFFERS_MAX_PARSING_DEPTH`
|
It is possible to override this limit with `FLATBUFFERS_MAX_PARSING_DEPTH`
|
||||||
definition. This definition can be helpful for testing purposes or embedded
|
definition. This definition can be helpful for testing purposes or embedded
|
||||||
applications. For details see [build](../building.md) of
|
applications. For details see [build](@ref flatbuffers_guide_building) of
|
||||||
CMake-based projects.
|
CMake-based projects.
|
||||||
|
|
||||||
## Dependence from C-locale {#flatbuffers_locale_cpp}
|
## Dependence from C-locale {#flatbuffers_locale_cpp}
|
||||||
The Flatbuffers [grammar](../grammar.md) uses ASCII
|
The Flatbuffers [grammar](@ref flatbuffers grammar) uses ASCII
|
||||||
character set for identifiers, alphanumeric literals, reserved words.
|
character set for identifiers, alphanumeric literals, reserved words.
|
||||||
|
|
||||||
Internal implementation of the Flatbuffers depends from functions which
|
Internal implementation of the Flatbuffers depends from functions which
|
||||||
@@ -638,7 +603,7 @@ compatible with the `IEEE-754` floating-point standard.
|
|||||||
The schema and json parser may fail if `fast-math` or `/fp:fast` mode is active.
|
The schema and json parser may fail if `fast-math` or `/fp:fast` mode is active.
|
||||||
|
|
||||||
### Support of hexadecimal and special floating-point numbers
|
### Support of hexadecimal and special floating-point numbers
|
||||||
According to the [grammar](../grammar.md) `fbs` and `json` files
|
According to the [grammar](@ref flatbuffers_grammar) `fbs` and `json` files
|
||||||
may use hexadecimal and special (`NaN`, `Inf`) floating-point literals.
|
may use hexadecimal and special (`NaN`, `Inf`) floating-point literals.
|
||||||
The Flatbuffers uses `strtof` and `strtod` functions to parse floating-point
|
The Flatbuffers uses `strtof` and `strtod` functions to parse floating-point
|
||||||
literals. The Flatbuffers library has a code to detect a compiler compatibility
|
literals. The Flatbuffers library has a code to detect a compiler compatibility
|
||||||
@@ -661,7 +626,7 @@ According to the `IEEE-754`, a comparison with `NaN` always returns
|
|||||||
an unordered result even when compared with itself. As a result, a whole
|
an unordered result even when compared with itself. As a result, a whole
|
||||||
Flatbuffers object will be not equal to itself if has one or more `NaN`.
|
Flatbuffers object will be not equal to itself if has one or more `NaN`.
|
||||||
Flatbuffers scalar fields that have the default value are not actually stored
|
Flatbuffers scalar fields that have the default value are not actually stored
|
||||||
in the serialized data but are generated in code (see [Writing a schema](../schema.md)).
|
in the serialized data but are generated in code (see [Writing a schema](@ref flatbuffers_guide_writing_schema)).
|
||||||
Scalar fields with `NaN` defaults break this behavior.
|
Scalar fields with `NaN` defaults break this behavior.
|
||||||
If a schema has a lot of `NaN` defaults the Flatbuffers can override
|
If a schema has a lot of `NaN` defaults the Flatbuffers can override
|
||||||
the unordered comparison by the ordered: `(NaN==NaN)->true`.
|
the unordered comparison by the ordered: `(NaN==NaN)->true`.
|
||||||
@@ -671,38 +636,4 @@ Additional computations added by `FLATBUFFERS_NAN_DEFAULTS` are very cheap
|
|||||||
if GCC or Clang used. These compilers have a compile-time implementation
|
if GCC or Clang used. These compilers have a compile-time implementation
|
||||||
of `isnan` checking which MSVC does not.
|
of `isnan` checking which MSVC does not.
|
||||||
|
|
||||||
## gRPC
|
<br>
|
||||||
|
|
||||||
### Before you get started
|
|
||||||
|
|
||||||
Before diving into the FlatBuffers gRPC usage in C++, you should already be
|
|
||||||
familiar with the following:
|
|
||||||
|
|
||||||
- FlatBuffers as a serialization format
|
|
||||||
- [gRPC](http://www.grpc.io/docs/) usage
|
|
||||||
|
|
||||||
### Using the FlatBuffers gRPC C++ library
|
|
||||||
|
|
||||||
NOTE: The examples below are also in the `grpc/samples/greeter` directory.
|
|
||||||
|
|
||||||
We will illustrate usage with the following schema:
|
|
||||||
|
|
||||||
```c++ title="grpc/samples/greeter/greeter.fbs"
|
|
||||||
--8<-- "https://raw.githubusercontent.com/google/flatbuffers/refs/heads/master/grpc/samples/greeter/greeter.fbs"
|
|
||||||
```
|
|
||||||
|
|
||||||
When we run `flatc`, we pass in the `--grpc` option and generage an additional
|
|
||||||
`greeter.grpc.fb.h` and `greeter.grpc.fb.cc`.
|
|
||||||
|
|
||||||
Example server code looks like this:
|
|
||||||
|
|
||||||
```c++ title="grpc/samples/greeter/server.cpp"
|
|
||||||
--8<-- "https://raw.githubusercontent.com/google/flatbuffers/refs/heads/master/grpc/samples/greeter/server.cpp"
|
|
||||||
```
|
|
||||||
|
|
||||||
Example client code looks like this:
|
|
||||||
|
|
||||||
```c++ title="grpc/samples/greeter/client.cpp"
|
|
||||||
--8<-- "https://raw.githubusercontent.com/google/flatbuffers/refs/heads/master/grpc/samples/greeter/client.cpp"
|
|
||||||
```
|
|
||||||
|
|
||||||
@@ -1,18 +1,18 @@
|
|||||||
Use in C\# {#flatbuffers_guide_use_c-sharp}
|
Use in C# {#flatbuffers_guide_use_c-sharp}
|
||||||
==============
|
==============
|
||||||
|
|
||||||
## Before you get started
|
## Before you get started
|
||||||
|
|
||||||
Before diving into the FlatBuffers usage in C#, it should be noted that
|
Before diving into the FlatBuffers usage in C#, it should be noted that
|
||||||
the [Tutorial](../tutorial.md) page has a complete guide to
|
the [Tutorial](@ref flatbuffers_guide_tutorial) page has a complete guide to
|
||||||
general FlatBuffers usage in all of the supported languages (including C#).
|
general FlatBuffers usage in all of the supported languages (including C#).
|
||||||
This page is designed to cover the nuances of FlatBuffers usage,
|
This page is designed to cover the nuances of FlatBuffers usage,
|
||||||
specific to C#.
|
specific to C#.
|
||||||
|
|
||||||
You should also have read the [Building](../building.md)
|
You should also have read the [Building](@ref flatbuffers_guide_building)
|
||||||
documentation to build `flatc` and should be familiar with
|
documentation to build `flatc` and should be familiar with
|
||||||
[Using the schema compiler](../flatc.md) and
|
[Using the schema compiler](@ref flatbuffers_guide_using_schema_compiler) and
|
||||||
[Writing a schema](../schema.md).
|
[Writing a schema](@ref flatbuffers_guide_writing_schema).
|
||||||
|
|
||||||
## FlatBuffers C# code location
|
## FlatBuffers C# code location
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ FlatBuffers).
|
|||||||
|
|
||||||
## Building the FlatBuffers C# library
|
## Building the FlatBuffers C# library
|
||||||
|
|
||||||
The `FlatBuffers.csproj` project contains multitargeting for .NET Standard 2.0, 2.1,
|
The `FlatBuffers.csproj` project contains multitargeting for .NET Standard 2.1,
|
||||||
.NET 6 and .NET 8.
|
.NET 6 and .NET 8.
|
||||||
|
|
||||||
You can build for a specific framework target when using the cross-platform
|
You can build for a specific framework target when using the cross-platform
|
||||||
@@ -62,7 +62,7 @@ by running the following commands from inside the `FlatBuffers.Test` folder:
|
|||||||
|
|
||||||
## Using the FlatBuffers C# library
|
## Using the FlatBuffers C# library
|
||||||
|
|
||||||
*Note: See [Tutorial](../tutorial.md) for a more in-depth
|
*Note: See [Tutorial](@ref flatbuffers_guide_tutorial) for a more in-depth
|
||||||
example of how to use FlatBuffers in C#.*
|
example of how to use FlatBuffers in C#.*
|
||||||
|
|
||||||
FlatBuffers supports reading and writing binary FlatBuffers in C#.
|
FlatBuffers supports reading and writing binary FlatBuffers in C#.
|
||||||
@@ -141,7 +141,7 @@ To use it:
|
|||||||
|
|
||||||
## Buffer verification
|
## Buffer verification
|
||||||
|
|
||||||
As mentioned in [C++ Usage](cpp.md) buffer
|
As mentioned in [C++ Usage](@ref flatbuffers_guide_use_cpp) buffer
|
||||||
accessor functions do not verify buffer offsets at run-time.
|
accessor functions do not verify buffer offsets at run-time.
|
||||||
If it is necessary, you can optionally use a buffer verifier before you
|
If it is necessary, you can optionally use a buffer verifier before you
|
||||||
access the data. This verifier will check all offsets, all sizes of
|
access the data. This verifier will check all offsets, all sizes of
|
||||||
@@ -4,15 +4,15 @@ Use in Dart {#flatbuffers_guide_use_dart}
|
|||||||
## Before you get started
|
## Before you get started
|
||||||
|
|
||||||
Before diving into the FlatBuffers usage in Dart, it should be noted that
|
Before diving into the FlatBuffers usage in Dart, it should be noted that
|
||||||
the [Tutorial](../tutorial.md) page has a complete guide
|
the [Tutorial](@ref flatbuffers_guide_tutorial) page has a complete guide
|
||||||
to general FlatBuffers usage in all of the supported languages (including Dart).
|
to general FlatBuffers usage in all of the supported languages (including Dart).
|
||||||
This page is designed to cover the nuances of FlatBuffers usage, specific to
|
This page is designed to cover the nuances of FlatBuffers usage, specific to
|
||||||
Dart.
|
Dart.
|
||||||
|
|
||||||
You should also have read the [Building](../building.md)
|
You should also have read the [Building](@ref flatbuffers_guide_building)
|
||||||
documentation to build `flatc` and should be familiar with
|
documentation to build `flatc` and should be familiar with
|
||||||
[Using the schema compiler](../flatc.md) and
|
[Using the schema compiler](@ref flatbuffers_guide_using_schema_compiler) and
|
||||||
[Writing a schema](../schema.md).
|
[Writing a schema](@ref flatbuffers_guide_writing_schema).
|
||||||
|
|
||||||
## FlatBuffers Dart library code location
|
## FlatBuffers Dart library code location
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ to be installed.*
|
|||||||
|
|
||||||
## Using the FlatBuffers Dart library
|
## Using the FlatBuffers Dart library
|
||||||
|
|
||||||
*Note: See [Tutorial](../tutorial.md) for a more in-depth
|
*Note: See [Tutorial](@ref flatbuffers_guide_tutorial) for a more in-depth
|
||||||
example of how to use FlatBuffers in Dart.*
|
example of how to use FlatBuffers in Dart.*
|
||||||
|
|
||||||
FlatBuffers supports reading and writing binary FlatBuffers in Dart.
|
FlatBuffers supports reading and writing binary FlatBuffers in Dart.
|
||||||
@@ -93,7 +93,7 @@ significant changes have been made.
|
|||||||
goal of this implementation. Support for 16 bit integers was also added.
|
goal of this implementation. Support for 16 bit integers was also added.
|
||||||
5. The code generation in this offers an "ObjectBuilder", which generates code
|
5. The code generation in this offers an "ObjectBuilder", which generates code
|
||||||
very similar to the SDK classes that consume FlatBuffers, as well as Builder
|
very similar to the SDK classes that consume FlatBuffers, as well as Builder
|
||||||
classes, which produces code which more closely resembles the builders in
|
classes, which produces code which more closely resembles the builders in
|
||||||
other languages. The ObjectBuilder classes are easier to use, at the cost of
|
other languages. The ObjectBuilder classes are easier to use, at the cost of
|
||||||
additional references allocated.
|
additional references allocated.
|
||||||
|
|
||||||
188
docs/source/FlatBuffers.md
Normal file
188
docs/source/FlatBuffers.md
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
FlatBuffers {#flatbuffers_index}
|
||||||
|
===========
|
||||||
|
|
||||||
|
# Overview {#flatbuffers_overview}
|
||||||
|
|
||||||
|
[FlatBuffers](@ref flatbuffers_overview) is an efficient cross platform
|
||||||
|
serialization library for C++, C#, C, Go, Java, Kotlin, JavaScript, Lobster, Lua, TypeScript, PHP, Python, Rust and Swift.
|
||||||
|
It was originally created at Google for game development and other
|
||||||
|
performance-critical applications.
|
||||||
|
|
||||||
|
It is available as Open Source on [GitHub](http://github.com/google/flatbuffers)
|
||||||
|
under the Apache license, v2 (see LICENSE).
|
||||||
|
|
||||||
|
## Why use FlatBuffers?
|
||||||
|
|
||||||
|
- **Access to serialized data without parsing/unpacking** - What sets
|
||||||
|
FlatBuffers apart is that it represents hierarchical data in a flat
|
||||||
|
binary buffer in such a way that it can still be accessed directly
|
||||||
|
without parsing/unpacking, while also still supporting data
|
||||||
|
structure evolution (forwards/backwards compatibility).
|
||||||
|
|
||||||
|
- **Memory efficiency and speed** - The only memory needed to access
|
||||||
|
your data is that of the buffer. It requires 0 additional allocations
|
||||||
|
(in C++, other languages may vary). FlatBuffers is also very
|
||||||
|
suitable for use with mmap (or streaming), requiring only part of the
|
||||||
|
buffer to be in memory. Access is close to the speed of raw
|
||||||
|
struct access with only one extra indirection (a kind of vtable) to
|
||||||
|
allow for format evolution and optional fields. It is aimed at
|
||||||
|
projects where spending time and space (many memory allocations) to
|
||||||
|
be able to access or construct serialized data is undesirable, such
|
||||||
|
as in games or any other performance sensitive applications. See the
|
||||||
|
[benchmarks](@ref flatbuffers_benchmarks) for details.
|
||||||
|
|
||||||
|
- **Flexible** - Optional fields means not only do you get great
|
||||||
|
forwards and backwards compatibility (increasingly important for
|
||||||
|
long-lived games: don't have to update all data with each new
|
||||||
|
version!). It also means you have a lot of choice in what data you
|
||||||
|
write and what data you don't, and how you design data structures.
|
||||||
|
|
||||||
|
- **Tiny code footprint** - Small amounts of generated code, and just
|
||||||
|
a single small header as the minimum dependency, which is very easy
|
||||||
|
to integrate. Again, see the benchmark section for details.
|
||||||
|
|
||||||
|
- **Strongly typed** - Errors happen at compile time rather than
|
||||||
|
manually having to write repetitive and error prone run-time checks.
|
||||||
|
Useful code can be generated for you.
|
||||||
|
|
||||||
|
- **Convenient to use** - Generated C++ code allows for terse access
|
||||||
|
& construction code. Then there's optional functionality for parsing
|
||||||
|
schemas and JSON-like text representations at runtime efficiently if
|
||||||
|
needed (faster and more memory efficient than other JSON
|
||||||
|
parsers).
|
||||||
|
|
||||||
|
Java, Kotlin and Go code supports object-reuse. C# has efficient struct based
|
||||||
|
accessors.
|
||||||
|
|
||||||
|
- **Cross platform code with no dependencies** - C++ code will work
|
||||||
|
with any recent gcc/clang and VS2010. Comes with build files for the tests &
|
||||||
|
samples (Android .mk files, and cmake for all other platforms).
|
||||||
|
|
||||||
|
### Why not use Protocol Buffers, or .. ?
|
||||||
|
|
||||||
|
Protocol Buffers is indeed relatively similar to FlatBuffers,
|
||||||
|
with the primary difference being that FlatBuffers does not need a parsing/
|
||||||
|
unpacking step to a secondary representation before you can
|
||||||
|
access data, often coupled with per-object memory allocation. The code
|
||||||
|
is an order of magnitude bigger, too. Protocol Buffers has no optional
|
||||||
|
text import/export.
|
||||||
|
|
||||||
|
### But all the cool kids use JSON!
|
||||||
|
|
||||||
|
JSON is very readable (which is why we use it as our optional text
|
||||||
|
format) and very convenient when used together with dynamically typed
|
||||||
|
languages (such as JavaScript). When serializing data from statically
|
||||||
|
typed languages, however, JSON not only has the obvious drawback of runtime
|
||||||
|
inefficiency, but also forces you to write *more* code to access data
|
||||||
|
(counterintuitively) due to its dynamic-typing serialization system.
|
||||||
|
In this context, it is only a better choice for systems that have very
|
||||||
|
little to no information ahead of time about what data needs to be stored.
|
||||||
|
|
||||||
|
If you do need to store data that doesn't fit a schema, FlatBuffers also
|
||||||
|
offers a schema-less (self-describing) version!
|
||||||
|
|
||||||
|
Read more about the "why" of FlatBuffers in the
|
||||||
|
[white paper](@ref flatbuffers_white_paper).
|
||||||
|
|
||||||
|
### Who uses FlatBuffers?
|
||||||
|
- [Cocos2d-x](http://www.cocos2d-x.org/), the #1 open source mobile game
|
||||||
|
engine, uses it to serialize all their
|
||||||
|
[game data](http://www.cocos2d-x.org/reference/native-cpp/V3.5/d7/d2d/namespaceflatbuffers.html).
|
||||||
|
- [Facebook](http://facebook.com/) uses it for client-server communication in
|
||||||
|
their Android app. They have a nice
|
||||||
|
[article](https://code.facebook.com/posts/872547912839369/improving-facebook-s-performance-on-android-with-flatbuffers/)
|
||||||
|
explaining how it speeds up loading their posts.
|
||||||
|
- [Fun Propulsion Labs](https://developers.google.com/games/#Tools)
|
||||||
|
at Google uses it extensively in all their libraries and games.
|
||||||
|
|
||||||
|
## Usage in brief
|
||||||
|
|
||||||
|
This section is a quick rundown of how to use this system. Subsequent
|
||||||
|
sections provide a more in-depth usage guide.
|
||||||
|
|
||||||
|
- Write a schema file that allows you to define the data structures
|
||||||
|
you may want to serialize. Fields can have a scalar type
|
||||||
|
(ints/floats of all sizes), or they can be a: string; array of any type;
|
||||||
|
reference to yet another object; or, a set of possible objects (unions).
|
||||||
|
Fields are optional and have defaults, so they don't need to be
|
||||||
|
present for every object instance.
|
||||||
|
|
||||||
|
- Use `flatc` (the FlatBuffer compiler) to generate a C++ header (or
|
||||||
|
Java/Kotlin/C#/Go/Python.. classes) with helper classes to access and construct
|
||||||
|
serialized data. This header (say `mydata_generated.h`) only depends on
|
||||||
|
`flatbuffers.h`, which defines the core functionality.
|
||||||
|
|
||||||
|
- Use the `FlatBufferBuilder` class to construct a flat binary buffer.
|
||||||
|
The generated functions allow you to add objects to this
|
||||||
|
buffer recursively, often as simply as making a single function call.
|
||||||
|
|
||||||
|
- Store or send your buffer somewhere!
|
||||||
|
|
||||||
|
- When reading it back, you can obtain the pointer to the root object
|
||||||
|
from the binary buffer, and from there traverse it conveniently
|
||||||
|
in-place with `object->field()`.
|
||||||
|
|
||||||
|
## In-depth documentation
|
||||||
|
|
||||||
|
- How to [build the compiler](@ref flatbuffers_guide_building) and samples on
|
||||||
|
various platforms.
|
||||||
|
- How to [use the compiler](@ref flatbuffers_guide_using_schema_compiler).
|
||||||
|
- How to [write a schema](@ref flatbuffers_guide_writing_schema).
|
||||||
|
- How to [use the generated C++ code](@ref flatbuffers_guide_use_cpp) in your
|
||||||
|
own programs.
|
||||||
|
- How to [use the generated Java code](@ref flatbuffers_guide_use_java)
|
||||||
|
in your own programs.
|
||||||
|
- How to [use the generated C# code](@ref flatbuffers_guide_use_c-sharp)
|
||||||
|
in your own programs.
|
||||||
|
- How to [use the generated Kotlin code](@ref flatbuffers_guide_use_kotlin)
|
||||||
|
in your own programs.
|
||||||
|
- How to [use the generated Go code](@ref flatbuffers_guide_use_go) in your
|
||||||
|
own programs.
|
||||||
|
- How to [use the generated Lua code](@ref flatbuffers_guide_use_lua) in your
|
||||||
|
own programs.
|
||||||
|
- How to [use the generated JavaScript code](@ref flatbuffers_guide_use_javascript) in your
|
||||||
|
own programs.
|
||||||
|
- How to [use the generated TypeScript code](@ref flatbuffers_guide_use_typescript) in your
|
||||||
|
own programs.
|
||||||
|
- How to [use FlatBuffers in C with `flatcc`](@ref flatbuffers_guide_use_c) in your
|
||||||
|
own programs.
|
||||||
|
- How to [use the generated Lobster code](@ref flatbuffers_guide_use_lobster) in your
|
||||||
|
own programs.
|
||||||
|
- How to [use the generated Rust code](@ref flatbuffers_guide_use_rust) in your
|
||||||
|
own programs.
|
||||||
|
- How to [use the generated Swift code](@ref flatbuffers_guide_use_swift) in your
|
||||||
|
own programs.
|
||||||
|
- [Support matrix](@ref flatbuffers_support) for platforms/languages/features.
|
||||||
|
- Some [benchmarks](@ref flatbuffers_benchmarks) showing the advantage of
|
||||||
|
using FlatBuffers.
|
||||||
|
- A [white paper](@ref flatbuffers_white_paper) explaining the "why" of
|
||||||
|
FlatBuffers.
|
||||||
|
- How to use the [schema-less](@ref flexbuffers) version of
|
||||||
|
FlatBuffers.
|
||||||
|
- A description of the [internals](@ref flatbuffers_internals) of FlatBuffers.
|
||||||
|
- A formal [grammar](@ref flatbuffers_grammar) of the schema language.
|
||||||
|
|
||||||
|
## Online resources
|
||||||
|
|
||||||
|
- [GitHub repository](http://github.com/google/flatbuffers)
|
||||||
|
- [Landing page](http://google.github.io/flatbuffers)
|
||||||
|
- [FlatBuffers Google Group](https://groups.google.com/forum/#!forum/flatbuffers)
|
||||||
|
- [Discord](https://discord.gg/6qgKs3R) and [Gitter](https://gitter.im/lobster_programming_language/community) chat.
|
||||||
|
- [FlatBuffers Issues Tracker](http://github.com/google/flatbuffers/issues)
|
||||||
|
- Independent implementations & tools:
|
||||||
|
- [FlatCC](https://github.com/dvidelabs/flatcc) Alternative FlatBuffers
|
||||||
|
parser, code generator and runtime all in C.
|
||||||
|
- Videos:
|
||||||
|
- Colt's [DevByte](https://www.youtube.com/watch?v=iQTxMkSJ1dQ).
|
||||||
|
- GDC 2015 [Lightning Talk](https://www.youtube.com/watch?v=olmL1fUnQAQ).
|
||||||
|
- FlatBuffers for [Go](https://www.youtube.com/watch?v=-BPVId_lA5w).
|
||||||
|
- Evolution of FlatBuffers
|
||||||
|
[visualization](https://www.youtube.com/watch?v=a0QE0xS8rKM).
|
||||||
|
- Useful documentation created by others:
|
||||||
|
- [FlatBuffers in Go](https://rwinslow.com/tags/flatbuffers/)
|
||||||
|
- [FlatBuffers in Android](http://frogermcs.github.io/flatbuffers-in-android-introdution/)
|
||||||
|
- [Parsing JSON to FlatBuffers in Java](http://frogermcs.github.io/json-parsing-with-flatbuffers-in-android/)
|
||||||
|
- [FlatBuffers in Unity](http://exiin.com/blog/flatbuffers-for-unity-sample-code/)
|
||||||
|
- [FlexBuffers C#](https://github.com/mzaks/FlexBuffers-CSharp) and
|
||||||
|
[article](https://medium.com/@icex33/flexbuffers-for-unity3d-4d1ab5c53fbe?)
|
||||||
|
on its use.
|
||||||
@@ -163,7 +163,7 @@ map.get("unknown").isNull(); // true
|
|||||||
# Binary encoding
|
# Binary encoding
|
||||||
|
|
||||||
A description of how FlexBuffers are encoded is in the
|
A description of how FlexBuffers are encoded is in the
|
||||||
[internals](internals.md) document.
|
[internals](@ref flatbuffers_internals) document.
|
||||||
|
|
||||||
|
|
||||||
# Nesting inside a FlatBuffer
|
# Nesting inside a FlatBuffer
|
||||||
26
docs/source/GoApi.md
Normal file
26
docs/source/GoApi.md
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
Go API
|
||||||
|
======
|
||||||
|
|
||||||
|
\addtogroup flatbuffers_go_api
|
||||||
|
|
||||||
|
<!-- Note: The `GoApi_generate.txt` code snippet was generated using `godoc` and
|
||||||
|
customized for use with this markdown file. To regenerate the file, use the
|
||||||
|
`godoc` tool (http://godoc.org) with the files in the `flatbuffers/go`
|
||||||
|
folder.
|
||||||
|
|
||||||
|
You may need to ensure that copies of the files exist in the `src/`
|
||||||
|
subfolder at the path set by the `$GOROOT` environment variable. You can
|
||||||
|
either move the files to `$GOROOT/src/flatbuffers` manually, if `$GOROOT`
|
||||||
|
is already set, otherwise you will need to manually set the `$GOROOT`
|
||||||
|
variable to a path and create `src/flatbuffers` subfolders at that path.
|
||||||
|
Then copy the flatbuffers files into `$GOROOT/src/flatbuffers`. (Some
|
||||||
|
versions of `godoc` include a `-path` flag. This could be used instead, if
|
||||||
|
available).
|
||||||
|
|
||||||
|
Once the files exist at the `$GOROOT/src/flatbuffers` location, you can
|
||||||
|
regenerate this doc using the following command:
|
||||||
|
`godoc flatbuffers > GoApi_generated.txt`.
|
||||||
|
|
||||||
|
After the documentation is generated, you will have to manually remove any
|
||||||
|
non-user facing documentation from this file. -->
|
||||||
|
\snippet GoApi_generated.txt Go API
|
||||||
125
docs/source/GoApi_generated.txt
Normal file
125
docs/source/GoApi_generated.txt
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
// This file was generated using `godoc` and customized for use with the
|
||||||
|
// API Reference documentation. To recreate this file, use the `godoc` tool
|
||||||
|
// (http://godoc.org) with the files in the `flatbuffers/go` folder.
|
||||||
|
//
|
||||||
|
// Note: You may need to ensure that copies of the files exist in the
|
||||||
|
// `src/` subfolder at the path set by the `$GOROOT` environment variable.
|
||||||
|
// You can either move the files to `$GOROOT/src/flatbuffers` manually, if
|
||||||
|
// `$GOROOT` is already set, otherwise you will need to manually set the
|
||||||
|
// `$GOROOT` variable to a path and create `src/flatbuffers` subfolders at that
|
||||||
|
// path. Then copy these files into `$GOROOT/src/flatbuffers`. (Some versions of
|
||||||
|
// `godoc` include a `-path` flag. This could be used instead, if available).
|
||||||
|
//
|
||||||
|
// Once the files exist at the `$GOROOT/src/flatbuffers` location, you can
|
||||||
|
// regenerate this doc using the following command:
|
||||||
|
// `godoc flatbuffers > GoApi_generated.txt`.
|
||||||
|
//
|
||||||
|
// After the documentation is generated, you will have to manually remove any
|
||||||
|
// non-user facing documentation from this file.
|
||||||
|
|
||||||
|
/// [Go API]
|
||||||
|
PACKAGE DOCUMENTATION
|
||||||
|
|
||||||
|
package flatbuffers
|
||||||
|
Package flatbuffers provides facilities to read and write flatbuffers
|
||||||
|
objects.
|
||||||
|
|
||||||
|
TYPES
|
||||||
|
|
||||||
|
type Builder struct {
|
||||||
|
// `Bytes` gives raw access to the buffer. Most users will want to use
|
||||||
|
// FinishedBytes() instead.
|
||||||
|
Bytes []byte
|
||||||
|
}
|
||||||
|
Builder is a state machine for creating FlatBuffer objects. Use a
|
||||||
|
Builder to construct object(s) starting from leaf nodes.
|
||||||
|
|
||||||
|
A Builder constructs byte buffers in a last-first manner for simplicity
|
||||||
|
and performance.
|
||||||
|
|
||||||
|
FUNCTIONS
|
||||||
|
|
||||||
|
func NewBuilder(initialSize int) *Builder
|
||||||
|
NewBuilder initializes a Builder of size `initial_size`. The internal
|
||||||
|
buffer is grown as needed.
|
||||||
|
|
||||||
|
func (b *Builder) CreateByteString(s []byte) UOffsetT
|
||||||
|
CreateByteString writes a byte slice as a string (null-terminated).
|
||||||
|
|
||||||
|
func (b *Builder) CreateByteVector(v []byte) UOffsetT
|
||||||
|
CreateByteVector writes a ubyte vector
|
||||||
|
|
||||||
|
func (b *Builder) CreateString(s string) UOffsetT
|
||||||
|
CreateString writes a null-terminated string as a vector.
|
||||||
|
|
||||||
|
func (b *Builder) EndVector(vectorNumElems int) UOffsetT
|
||||||
|
EndVector writes data necessary to finish vector construction.
|
||||||
|
|
||||||
|
func (b *Builder) Finish(rootTable UOffsetT)
|
||||||
|
Finish finalizes a buffer, pointing to the given `rootTable`.
|
||||||
|
|
||||||
|
func (b *Builder) FinishedBytes() []byte
|
||||||
|
FinishedBytes returns a pointer to the written data in the byte buffer.
|
||||||
|
Panics if the builder is not in a finished state (which is caused by
|
||||||
|
calling `Finish()`).
|
||||||
|
|
||||||
|
func (b *Builder) Head() UOffsetT
|
||||||
|
Head gives the start of useful data in the underlying byte buffer. Note:
|
||||||
|
unlike other functions, this value is interpreted as from the left.
|
||||||
|
|
||||||
|
func (b *Builder) PrependBool(x bool)
|
||||||
|
PrependBool prepends a bool to the Builder buffer. Aligns and checks for
|
||||||
|
space.
|
||||||
|
|
||||||
|
func (b *Builder) PrependByte(x byte)
|
||||||
|
PrependByte prepends a byte to the Builder buffer. Aligns and checks for
|
||||||
|
space.
|
||||||
|
|
||||||
|
func (b *Builder) PrependFloat32(x float32)
|
||||||
|
PrependFloat32 prepends a float32 to the Builder buffer. Aligns and
|
||||||
|
checks for space.
|
||||||
|
|
||||||
|
func (b *Builder) PrependFloat64(x float64)
|
||||||
|
PrependFloat64 prepends a float64 to the Builder buffer. Aligns and
|
||||||
|
checks for space.
|
||||||
|
|
||||||
|
func (b *Builder) PrependInt16(x int16)
|
||||||
|
PrependInt16 prepends a int16 to the Builder buffer. Aligns and checks
|
||||||
|
for space.
|
||||||
|
|
||||||
|
func (b *Builder) PrependInt32(x int32)
|
||||||
|
PrependInt32 prepends a int32 to the Builder buffer. Aligns and checks
|
||||||
|
for space.
|
||||||
|
|
||||||
|
func (b *Builder) PrependInt64(x int64)
|
||||||
|
PrependInt64 prepends a int64 to the Builder buffer. Aligns and checks
|
||||||
|
for space.
|
||||||
|
|
||||||
|
func (b *Builder) PrependInt8(x int8)
|
||||||
|
PrependInt8 prepends a int8 to the Builder buffer. Aligns and checks for
|
||||||
|
space.
|
||||||
|
|
||||||
|
func (b *Builder) PrependUOffsetT(off UOffsetT)
|
||||||
|
PrependUOffsetT prepends an UOffsetT, relative to where it will be
|
||||||
|
written.
|
||||||
|
|
||||||
|
func (b *Builder) PrependUint16(x uint16)
|
||||||
|
PrependUint16 prepends a uint16 to the Builder buffer. Aligns and checks
|
||||||
|
for space.
|
||||||
|
|
||||||
|
func (b *Builder) PrependUint32(x uint32)
|
||||||
|
PrependUint32 prepends a uint32 to the Builder buffer. Aligns and checks
|
||||||
|
for space.
|
||||||
|
|
||||||
|
func (b *Builder) PrependUint64(x uint64)
|
||||||
|
PrependUint64 prepends a uint64 to the Builder buffer. Aligns and checks
|
||||||
|
for space.
|
||||||
|
|
||||||
|
func (b *Builder) PrependUint8(x uint8)
|
||||||
|
PrependUint8 prepends a uint8 to the Builder buffer. Aligns and checks
|
||||||
|
for space.
|
||||||
|
|
||||||
|
func (b *Builder) Reset()
|
||||||
|
Reset truncates the underlying Builder buffer, facilitating alloc-free
|
||||||
|
reuse of a Builder. It also resets bookkeeping data.
|
||||||
|
/// [Go API]
|
||||||
@@ -4,15 +4,15 @@ Use in Go {#flatbuffers_guide_use_go}
|
|||||||
## Before you get started
|
## Before you get started
|
||||||
|
|
||||||
Before diving into the FlatBuffers usage in Go, it should be noted that
|
Before diving into the FlatBuffers usage in Go, it should be noted that
|
||||||
the [Tutorial](../tutorial.md) page has a complete guide
|
the [Tutorial](@ref flatbuffers_guide_tutorial) page has a complete guide
|
||||||
to general FlatBuffers usage in all of the supported languages (including Go).
|
to general FlatBuffers usage in all of the supported languages (including Go).
|
||||||
This page is designed to cover the nuances of FlatBuffers usage, specific to
|
This page is designed to cover the nuances of FlatBuffers usage, specific to
|
||||||
Go.
|
Go.
|
||||||
|
|
||||||
You should also have read the [Building](../building.md)
|
You should also have read the [Building](@ref flatbuffers_guide_building)
|
||||||
documentation to build `flatc` and should be familiar with
|
documentation to build `flatc` and should be familiar with
|
||||||
[Using the schema compiler](../flatc.md) and
|
[Using the schema compiler](@ref flatbuffers_guide_using_schema_compiler) and
|
||||||
[Writing a schema](../schema.md).
|
[Writing a schema](@ref flatbuffers_guide_writing_schema).
|
||||||
|
|
||||||
## FlatBuffers Go library code location
|
## FlatBuffers Go library code location
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ be installed.*
|
|||||||
|
|
||||||
## Using the FlatBuffers Go library
|
## Using the FlatBuffers Go library
|
||||||
|
|
||||||
*Note: See [Tutorial](../tutorial.md) for a more in-depth
|
*Note: See [Tutorial](@ref flatbuffers_guide_tutorial) for a more in-depth
|
||||||
example of how to use FlatBuffers in Go.*
|
example of how to use FlatBuffers in Go.*
|
||||||
|
|
||||||
FlatBuffers supports reading and writing binary FlatBuffers in Go.
|
FlatBuffers supports reading and writing binary FlatBuffers in Go.
|
||||||
74
docs/source/Grammar.md
Normal file
74
docs/source/Grammar.md
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
Grammar of the schema language {#flatbuffers_grammar}
|
||||||
|
==============================
|
||||||
|
|
||||||
|
schema = include*
|
||||||
|
( namespace\_decl | type\_decl | enum\_decl | root\_decl |
|
||||||
|
file_extension_decl | file_identifier_decl |
|
||||||
|
attribute\_decl | rpc\_decl | object )*
|
||||||
|
|
||||||
|
include = `include` string\_constant `;`
|
||||||
|
|
||||||
|
namespace\_decl = `namespace` ident ( `.` ident )* `;`
|
||||||
|
|
||||||
|
attribute\_decl = `attribute` ident | `"` ident `"` `;`
|
||||||
|
|
||||||
|
type\_decl = ( `table` | `struct` ) ident metadata `{` field\_decl+ `}`
|
||||||
|
|
||||||
|
enum\_decl = ( `enum` ident `:` type | `union` ident ) metadata `{`
|
||||||
|
commasep( enumval\_decl ) `}`
|
||||||
|
|
||||||
|
root\_decl = `root_type` ident `;`
|
||||||
|
|
||||||
|
field\_decl = ident `:` type [ `=` scalar ] metadata `;`
|
||||||
|
|
||||||
|
rpc\_decl = `rpc_service` ident `{` rpc\_method+ `}`
|
||||||
|
|
||||||
|
rpc\_method = ident `(` ident `)` `:` ident metadata `;`
|
||||||
|
|
||||||
|
type = `bool` | `byte` | `ubyte` | `short` | `ushort` | `int` | `uint` |
|
||||||
|
`float` | `long` | `ulong` | `double` |
|
||||||
|
`int8` | `uint8` | `int16` | `uint16` | `int32` | `uint32`| `int64` | `uint64` |
|
||||||
|
`float32` | `float64` |
|
||||||
|
`string` | `[` type `]` | ident
|
||||||
|
|
||||||
|
enumval\_decl = ident [ `=` integer\_constant ] metadata
|
||||||
|
|
||||||
|
metadata = [ `(` commasep( ident [ `:` single\_value ] ) `)` ]
|
||||||
|
|
||||||
|
scalar = boolean\_constant | integer\_constant | float\_constant
|
||||||
|
|
||||||
|
object = `{` commasep( ident `:` value ) `}`
|
||||||
|
|
||||||
|
single\_value = scalar | string\_constant
|
||||||
|
|
||||||
|
value = single\_value | object | `[` commasep( value ) `]`
|
||||||
|
|
||||||
|
commasep(x) = [ x ( `,` x )\* ]
|
||||||
|
|
||||||
|
file_extension_decl = `file_extension` string\_constant `;`
|
||||||
|
|
||||||
|
file_identifier_decl = `file_identifier` string\_constant `;`
|
||||||
|
|
||||||
|
string\_constant = `\".*?\"`
|
||||||
|
|
||||||
|
ident = `[a-zA-Z_][a-zA-Z0-9_]*`
|
||||||
|
|
||||||
|
`[:digit:]` = `[0-9]`
|
||||||
|
|
||||||
|
`[:xdigit:]` = `[0-9a-fA-F]`
|
||||||
|
|
||||||
|
dec\_integer\_constant = `[-+]?[:digit:]+`
|
||||||
|
|
||||||
|
hex\_integer\_constant = `[-+]?0[xX][:xdigit:]+`
|
||||||
|
|
||||||
|
integer\_constant = dec\_integer\_constant | hex\_integer\_constant
|
||||||
|
|
||||||
|
dec\_float\_constant = `[-+]?(([.][:digit:]+)|([:digit:]+[.][:digit:]*)|([:digit:]+))([eE][-+]?[:digit:]+)?`
|
||||||
|
|
||||||
|
hex\_float\_constant = `[-+]?0[xX](([.][:xdigit:]+)|([:xdigit:]+[.][:xdigit:]*)|([:xdigit:]+))([pP][-+]?[:digit:]+)`
|
||||||
|
|
||||||
|
special\_float\_constant = `[-+]?(nan|inf|infinity)`
|
||||||
|
|
||||||
|
float\_constant = dec\_float\_constant | hex\_float\_constant | special\_float\_constant
|
||||||
|
|
||||||
|
boolean\_constant = `true` | `false`
|
||||||
@@ -6,7 +6,7 @@ errors and stores the resulting data in this IR, outputting `.bfbs` files.
|
|||||||
Since this IR is a Flatbuffer, you can load and use it at runtime for runtime
|
Since this IR is a Flatbuffer, you can load and use it at runtime for runtime
|
||||||
reflection purposes.
|
reflection purposes.
|
||||||
|
|
||||||
There are some quirks:
|
There are some quirks:
|
||||||
- Tables and Structs are serialized as `Object`s.
|
- Tables and Structs are serialized as `Object`s.
|
||||||
- Unions and Enums are serialized as `Enum`s.
|
- Unions and Enums are serialized as `Enum`s.
|
||||||
- It is the responsibility of the code generator to check the `advanced_features`
|
- It is the responsibility of the code generator to check the `advanced_features`
|
||||||
@@ -18,7 +18,7 @@ There are some quirks:
|
|||||||
inferred to be the directory containing the first provided schema file.
|
inferred to be the directory containing the first provided schema file.
|
||||||
|
|
||||||
|
|
||||||
## Invocation
|
## Invocation
|
||||||
You can invoke it like so
|
You can invoke it like so
|
||||||
```{.sh}
|
```{.sh}
|
||||||
flatc -b --schema ${your_fbs_files}
|
flatc -b --schema ${your_fbs_files}
|
||||||
@@ -316,7 +316,7 @@ that may further help clarify the format.
|
|||||||
|
|
||||||
# FlexBuffers
|
# FlexBuffers
|
||||||
|
|
||||||
The [schema-less](flexbuffers.md) version of FlatBuffers have their
|
The [schema-less](@ref flexbuffers) version of FlatBuffers have their
|
||||||
own encoding, detailed here.
|
own encoding, detailed here.
|
||||||
|
|
||||||
It shares many properties mentioned above, in that all data is accessed
|
It shares many properties mentioned above, in that all data is accessed
|
||||||
@@ -464,3 +464,5 @@ So for example, the integer value `13` as root would be:
|
|||||||
|
|
||||||
uint8_t 13, 4, 1 // Value, type, root byte width.
|
uint8_t 13, 4, 1 // Value, type, root byte width.
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user