mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-02 04:04:19 +00:00
4595 lines
384 KiB
HTML
4595 lines
384 KiB
HTML
|
|
<!doctype html>
|
|
<html lang="en" class="no-js">
|
|
<head>
|
|
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
|
|
|
|
|
|
<link rel="canonical" href="https://flatbuffers.dev/tutorial/">
|
|
|
|
|
|
<link rel="prev" href="../quick_start/">
|
|
|
|
|
|
<link rel="next" href="../building/">
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="icon" href="../assets/images/favicon.png">
|
|
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
|
|
|
|
|
|
|
|
<title>Tutorial - FlatBuffers Docs</title>
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../assets/stylesheets/main.484c7ddc.min.css">
|
|
|
|
|
|
<link rel="stylesheet" href="../assets/stylesheets/palette.ab4e12ef.min.css">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
|
|
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
|
|
|
|
|
|
|
|
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
|
|
|
|
|
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
|
|
|
|
|
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
|
<label class="md-overlay" for="__drawer"></label>
|
|
<div data-md-component="skip">
|
|
|
|
|
|
<a href="#tutorial" class="md-skip">
|
|
Skip to content
|
|
</a>
|
|
|
|
</div>
|
|
<div data-md-component="announce">
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<header class="md-header md-header--shadow" data-md-component="header">
|
|
<nav class="md-header__inner md-grid" aria-label="Header">
|
|
<a href=".." title="FlatBuffers Docs" class="md-header__button md-logo" aria-label="FlatBuffers Docs" data-md-component="logo">
|
|
|
|
<img src="../assets/flatbuffers_logo.svg" alt="logo">
|
|
|
|
</a>
|
|
<label class="md-header__button md-icon" for="__drawer">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
|
|
</label>
|
|
<div class="md-header__title" data-md-component="header-title">
|
|
<div class="md-header__ellipsis">
|
|
<div class="md-header__topic">
|
|
<span class="md-ellipsis">
|
|
FlatBuffers Docs
|
|
</span>
|
|
</div>
|
|
<div class="md-header__topic" data-md-component="header-topic">
|
|
<span class="md-ellipsis">
|
|
|
|
Tutorial
|
|
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<form class="md-header__option" data-md-component="palette">
|
|
|
|
|
|
|
|
|
|
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
|
|
|
|
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
|
</label>
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
|
|
|
|
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
|
</label>
|
|
|
|
|
|
</form>
|
|
|
|
|
|
|
|
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
|
|
|
|
|
|
|
|
|
|
<div class="md-header__source">
|
|
<a href="https://github.com/google/flatbuffers" title="Go to repository" class="md-source" data-md-component="source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
google/FlatBuffers
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
</nav>
|
|
|
|
</header>
|
|
|
|
<div class="md-container" data-md-component="container">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<main class="md-main" data-md-component="main">
|
|
<div class="md-main__inner md-grid">
|
|
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
|
|
|
|
|
|
|
|
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
|
|
<label class="md-nav__title" for="__drawer">
|
|
<a href=".." title="FlatBuffers Docs" class="md-nav__button md-logo" aria-label="FlatBuffers Docs" data-md-component="logo">
|
|
|
|
<img src="../assets/flatbuffers_logo.svg" alt="logo">
|
|
|
|
</a>
|
|
FlatBuffers Docs
|
|
</label>
|
|
|
|
<div class="md-nav__source">
|
|
<a href="https://github.com/google/flatbuffers" title="Go to repository" class="md-source" data-md-component="source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
google/FlatBuffers
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href=".." class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Overview
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../quick_start/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Quick Start
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--active">
|
|
|
|
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__link md-nav__link--active" for="__toc">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Tutorial
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<a href="./" class="md-nav__link md-nav__link--active">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Tutorial
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#flatbuffers-schema-fbs" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
FlatBuffers Schema (.fbs)
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#compiling-schema-to-code-flatc" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Compiling Schema to Code (flatc)
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Compiling Schema to Code (flatc)">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#building-flatc" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Building flatc
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#compiling-schema" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Compiling Schema
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#application-integration" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Application Integration
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#serialization" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Serialization
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Serialization">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#flatbufferbuilder" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
FlatBufferBuilder
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#serializing-data" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Serializing Data
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Serializing Data">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#strings" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Strings
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#tables" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Tables
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#vectors" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Vectors
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#unions" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Unions
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#finishing" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Finishing
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Finishing">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#buffer-access" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Buffer Access
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#deserialization" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Deserialization
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Deserialization">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#root-access" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Root Access
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#table-access" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Table Access
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Table Access">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#nested-object-access" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Nested Object Access
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#vector-access" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Vector Access
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#union-access" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Union Access
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Compiler (flatc)
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_4">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
|
|
|
|
Compiler (flatc)
|
|
|
|
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../building/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Building
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../flatc/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Using
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Schema (.fbs)
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_5">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
|
|
|
|
Schema (.fbs)
|
|
|
|
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../schema/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Overview
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../evolution/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Evolution
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../grammar/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Grammar
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Language Guides
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_6">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
|
|
|
|
Language Guides
|
|
|
|
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/c/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
C
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/cpp/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
C++
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/c_sharp/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
C#
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/dart/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Dart
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/go/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Go
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/java/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Java
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/javascript/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
JavaScript
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/kotlin/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Kotlin
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/lobster/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Lobster
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/lua/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Lua
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/php/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
PHP
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/python/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Python
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/rust/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Rust
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/swift/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Swift
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../languages/typescript/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
TypeScript
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../support/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Supported Configurations
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../white_paper/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
White Paper
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Advanced
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_9">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
|
|
|
|
Advanced
|
|
|
|
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../internals/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
FlatBuffers Internals
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../intermediate_representation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Intermediate Representation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../annotation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Annotating Buffers (.afb)
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../benchmarks/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Benchmarks
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../flexbuffers/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
FlexBuffers (Schema-less version)
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../contributing/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Contributing
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#flatbuffers-schema-fbs" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
FlatBuffers Schema (.fbs)
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#compiling-schema-to-code-flatc" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Compiling Schema to Code (flatc)
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Compiling Schema to Code (flatc)">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#building-flatc" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Building flatc
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#compiling-schema" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Compiling Schema
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#application-integration" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Application Integration
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#serialization" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Serialization
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Serialization">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#flatbufferbuilder" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
FlatBufferBuilder
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#serializing-data" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Serializing Data
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Serializing Data">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#strings" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Strings
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#tables" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Tables
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#vectors" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Vectors
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#unions" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Unions
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#finishing" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Finishing
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Finishing">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#buffer-access" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Buffer Access
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#deserialization" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Deserialization
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Deserialization">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#root-access" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Root Access
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#table-access" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Table Access
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Table Access">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#nested-object-access" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Nested Object Access
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#vector-access" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Vector Access
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#union-access" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Union Access
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-content" data-md-component="content">
|
|
|
|
<article class="md-content__inner md-typeset">
|
|
|
|
|
|
|
|
|
|
|
|
<a href="https://github.com/google/flatbuffers/edit/master/docs/source/tutorial.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
|
|
</a>
|
|
|
|
|
|
|
|
|
|
<h1 id="tutorial">Tutorial</h1>
|
|
<p>This tutorial provides an example of how to work with FlatBuffers in a variety
|
|
of languages. The following topics will cover all the steps of using FlatBuffers
|
|
in your application.</p>
|
|
<ol>
|
|
<li>Writing a FlatBuffers schema file (<code>.fbs</code>).</li>
|
|
<li>Using the <code>flatc</code> compiler to transform the schema into language-specific
|
|
code.</li>
|
|
<li>Importing the generated code and libraries into your application.</li>
|
|
<li>Serializing data into a flatbuffer.</li>
|
|
<li>Deserializing a flatbuffer.</li>
|
|
</ol>
|
|
<p>The tutorial is structured to be language agnostic, with language specifics in
|
|
code blocks providing more context. Additionally, this tries to cover the major
|
|
parts and type system of flatbuffers to give a general overview. It's not
|
|
expected to be an exhaustive list of all features, or provide the best way to do
|
|
things.</p>
|
|
<h2 id="flatbuffers-schema-fbs">FlatBuffers Schema (<code>.fbs</code>)</h2>
|
|
<p>To start working with FlatBuffers, you first need to create a
|
|
<a href="../schema/">schema</a> file which defines the format of the data structures you
|
|
wish to serialize. The schema is processed by the <code>flatc</code> compiler to generate
|
|
language-specific code that you use in your projects.</p>
|
|
<p>The following
|
|
<a href="https://github.com/google/flatbuffers/blob/master/samples/monster.fbs"><code>monster.fbs</code></a>
|
|
schema will be used for this tutorial. This is part of the FlatBuffers
|
|
<a href="https://github.com/google/flatbuffers/tree/master/samples">sample code</a> to give
|
|
complete sample binaries demonstrations.</p>
|
|
<p>FlatBuffers schema is a Interface Definition Language (IDL) that has a couple
|
|
data structures, see the <a href="../schema/">schema</a> documentation for a detail
|
|
description. Use the inline code annotations to get a brief synopsis of each
|
|
part of the schema.</p>
|
|
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">monster.fbs</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
|
|
<span class="normal"> 2</span>
|
|
<span class="normal"> 3</span>
|
|
<span class="normal"> 4</span>
|
|
<span class="normal"> 5</span>
|
|
<span class="normal"> 6</span>
|
|
<span class="normal"> 7</span>
|
|
<span class="normal"> 8</span>
|
|
<span class="normal"> 9</span>
|
|
<span class="normal">10</span>
|
|
<span class="normal">11</span>
|
|
<span class="normal">12</span>
|
|
<span class="normal">13</span>
|
|
<span class="normal">14</span>
|
|
<span class="normal">15</span>
|
|
<span class="normal">16</span>
|
|
<span class="normal">17</span>
|
|
<span class="normal">18</span>
|
|
<span class="normal">19</span>
|
|
<span class="normal">20</span>
|
|
<span class="normal">21</span>
|
|
<span class="normal">22</span>
|
|
<span class="normal">23</span>
|
|
<span class="normal">24</span>
|
|
<span class="normal">25</span>
|
|
<span class="normal">26</span>
|
|
<span class="normal">27</span>
|
|
<span class="normal">28</span>
|
|
<span class="normal">29</span>
|
|
<span class="normal">30</span>
|
|
<span class="normal">31</span>
|
|
<span class="normal">32</span>
|
|
<span class="normal">33</span>
|
|
<span class="normal">34</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="c1">// Example IDL file for our monster's schema.</span>
|
|
|
|
<span class="n">namespace</span><span class="w"> </span><span class="n">MyGame.Sample</span><span class="p">;</span><span class="w"> </span><span class="c1">//(1)!</span>
|
|
|
|
<span class="kd">enum</span><span class="w"> </span><span class="n">Color</span><span class="o">:</span><span class="n">byte</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="na">Red</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">Green</span><span class="p">,</span><span class="w"> </span><span class="na">Blue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">//(2)!</span>
|
|
|
|
<span class="c1">// Optionally add more tables.</span>
|
|
<span class="n">union</span><span class="w"> </span><span class="n">Equipment</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Weapon</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">//(3)!</span>
|
|
|
|
<span class="n">struct</span><span class="w"> </span><span class="n">Vec3</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">//(4)!</span>
|
|
<span class="w"> </span><span class="n">x</span><span class="o">:</span><span class="kt">float</span><span class="p">;</span><span class="w"> </span><span class="c1">//(5)!</span>
|
|
<span class="w"> </span><span class="n">y</span><span class="o">:</span><span class="kt">float</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">z</span><span class="o">:</span><span class="kt">float</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="n">table</span><span class="w"> </span><span class="n">Monster</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">//(6)!</span>
|
|
<span class="w"> </span><span class="n">pos</span><span class="o">:</span><span class="n">Vec3</span><span class="p">;</span><span class="w"> </span><span class="c1">//(7)!</span>
|
|
<span class="w"> </span><span class="n">mana</span><span class="o">:</span><span class="na">short</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">150</span><span class="p">;</span><span class="w"> </span><span class="c1">//(8)!</span>
|
|
<span class="w"> </span><span class="n">hp</span><span class="o">:</span><span class="na">short</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">100</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">name</span><span class="o">:</span><span class="kt">string</span><span class="p">;</span><span class="w"> </span><span class="c1">//(9)!</span>
|
|
<span class="w"> </span><span class="n">friendly</span><span class="o">:</span><span class="kt">bool</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span><span class="w"> </span><span class="p">(</span><span class="n">deprecated</span><span class="p">);</span><span class="w"> </span><span class="c1">//(10)!</span>
|
|
<span class="w"> </span><span class="n">inventory</span><span class="o">:</span><span class="p">[</span><span class="n">ubyte</span><span class="p">];</span><span class="w"> </span><span class="c1">//(11)!</span>
|
|
<span class="w"> </span><span class="n">color</span><span class="o">:</span><span class="na">Color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Blue</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">weapons</span><span class="o">:</span><span class="p">[</span><span class="n">Weapon</span><span class="p">];</span><span class="w"> </span><span class="c1">//(12)!</span>
|
|
<span class="w"> </span><span class="n">equipped</span><span class="o">:</span><span class="n">Equipment</span><span class="p">;</span><span class="w"> </span><span class="c1">//(13)!</span>
|
|
<span class="w"> </span><span class="n">path</span><span class="o">:</span><span class="p">[</span><span class="n">Vec3</span><span class="p">];</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="n">table</span><span class="w"> </span><span class="n">Weapon</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">name</span><span class="o">:</span><span class="kt">string</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">damage</span><span class="o">:</span><span class="n">short</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="n">root_type</span><span class="w"> </span><span class="n">Monster</span><span class="p">;</span><span class="w"> </span><span class="c1">//(14)!</span>
|
|
</code></pre></div></td></tr></table></div>
|
|
<ol>
|
|
<li>
|
|
<p>FlatBuffers has support for namespaces to place the generated code into.
|
|
There is mixed level of support for namespaces (some languages don't have
|
|
namespaces), but for the C family of languages, it is fully supported.</p>
|
|
</li>
|
|
<li>
|
|
<p>Enums definitions can be defined with the backing numerical type. Implicit
|
|
numbering is supported, so that <code>Green</code> would have a value of 1.</p>
|
|
</li>
|
|
<li>
|
|
<p>A union represents a single value from a set of possible values. Its
|
|
effectively an enum (to represent the type actually store) and a value,
|
|
combined into one. In this example, the union is not very useful, since it
|
|
only has a single type.</p>
|
|
</li>
|
|
<li>
|
|
<p>A struct is a collection of scalar fields with names. It is itself a scalar
|
|
type, which uses less memory and has faster lookup. However, once a struct is
|
|
defined, it cannot be changed. Use tables for data structures that can evolve
|
|
over time.</p>
|
|
</li>
|
|
<li>
|
|
<p>FlatBuffers has the standard set of scalar numerical types (<code>int8</code>, <code>int16</code>,
|
|
<code>int32</code>, <code>int64</code>, <code>uint8</code>, <code>uint16</code>, <code>uint32</code>, <code>uint64</code>, <code>float</code>, <code>double</code>),
|
|
as well as <code>bool</code>. Note, scalars are fixed width, <code>varints</code> are not
|
|
supported.</p>
|
|
</li>
|
|
<li>
|
|
<p>Tables are the main data structure for grouping data together. It can evolve
|
|
by adding and deprecating fields over time, while preserving forward and
|
|
backwards compatibility.</p>
|
|
</li>
|
|
<li>
|
|
<p>A field that happens to be a <code>struct</code>. This means the data of the <code>Vec3</code>
|
|
struct will be serialized inline in the table without any need for offset.</p>
|
|
</li>
|
|
<li>
|
|
<p>Fields can be provided a default value. Default values can be configured to
|
|
not be serialized at all while still providing the default value while
|
|
deserializing. However, once set, a default value cannot be changed.</p>
|
|
</li>
|
|
<li>
|
|
<p>A <code>string</code> field which points to a serialized string external to the table.</p>
|
|
</li>
|
|
<li>
|
|
<p>A deprecated field that is no longer being used. This is used instead of
|
|
removing the field outright.</p>
|
|
</li>
|
|
<li>
|
|
<p>A <code>vector</code> field that points to a vector of bytes. Like <code>strings</code>, the
|
|
vector data is serialized elsewhere and this field just stores an offset to
|
|
the vector.</p>
|
|
</li>
|
|
<li>
|
|
<p>Vector of <code>tables</code> and <code>structs</code> are also possible.</p>
|
|
</li>
|
|
<li>
|
|
<p>A field to a <code>union</code> type.</p>
|
|
</li>
|
|
<li>
|
|
<p>The root of the flatbuffer is always a <code>table</code>. This indicates the type of
|
|
<code>table</code> the "entry" point of the flatbuffer will point to.</p>
|
|
</li>
|
|
</ol>
|
|
<h2 id="compiling-schema-to-code-flatc">Compiling Schema to Code (<code>flatc</code>)</h2>
|
|
<p>After a schema file is written, you compile it to code in the languages you wish
|
|
to work with. This compilation is done by the <a href="../flatc/">FlatBuffers Compiler</a>
|
|
(<code>flatc</code>) which is one of the binaries built in the repo.</p>
|
|
<h3 id="building-flatc">Building <code>flatc</code></h3>
|
|
<p>FlatBuffers uses <a href="https://cmake.org/"><code>cmake</code></a> to build projects files for your
|
|
environment.</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="1:2"><input checked="checked" id="unix" name="__tabbed_1" type="radio" /><input id="windows" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="unix">Unix</label><label for="windows">Windows</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>cmake<span class="w"> </span>-G<span class="w"> </span><span class="s2">"Unix Makefiles"</span>
|
|
make<span class="w"> </span>flatc
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>cmake<span class="w"> </span>-G<span class="w"> </span><span class="s2">"Visual Studio 17 2022"</span>
|
|
msbuild.exe<span class="w"> </span>FlatBuffers.sln
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>See the documentation on <a href="../building/">building</a> for more details and other
|
|
environments. Some languages also include a prebuilt <code>flatc</code> via their package
|
|
manager.</p>
|
|
<h3 id="compiling-schema">Compiling Schema</h3>
|
|
<p>To compile the schema, invoke <code>flatc</code> with the schema file and the language
|
|
flags you wish to generate code for. This compilation will generate files that
|
|
you include in your application code. These files provide convenient APIs for
|
|
serializing and deserializing the flatbuffer binary data.</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="2:15"><input checked="checked" id="c" name="__tabbed_2" type="radio" /><input id="c_1" name="__tabbed_2" type="radio" /><input id="c_2" name="__tabbed_2" type="radio" /><input id="dart" name="__tabbed_2" type="radio" /><input id="go" name="__tabbed_2" type="radio" /><input id="java" name="__tabbed_2" type="radio" /><input id="javascript" name="__tabbed_2" type="radio" /><input id="kotlin" name="__tabbed_2" type="radio" /><input id="lobster" name="__tabbed_2" type="radio" /><input id="lua" name="__tabbed_2" type="radio" /><input id="php" name="__tabbed_2" type="radio" /><input id="python" name="__tabbed_2" type="radio" /><input id="rust" name="__tabbed_2" type="radio" /><input id="swift" name="__tabbed_2" type="radio" /><input id="typescript" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="c">C++</label><label for="c_1">C</label><label for="c_2">C#</label><label for="dart">Dart</label><label for="go">Go</label><label for="java">Java</label><label for="javascript">JavaScript</label><label for="kotlin">Kotlin</label><label for="lobster">Lobster</label><label for="lua">Lua</label><label for="php">PHP</label><label for="python">Python</label><label for="rust">Rust</label><label for="swift">Swift</label><label for="typescript">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--cpp<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Note</p>
|
|
<p>If you're working in C, you need to use the separate project
|
|
<a href="https://github.com/dvidelabs/flatcc">FlatCC</a> which contains a schema
|
|
compiler and runtime library in C for C. See
|
|
<a href="https://github.com/dvidelabs/flatcc#building">flatcc build instructions</a>.</p>
|
|
<p>Please be aware of the difference between <code>flatc</code> and <code>flatcc</code> tools.</p>
|
|
</div>
|
|
<div class="highlight"><pre><span></span><code><span class="nb">cd</span><span class="w"> </span>flatcc
|
|
mkdir<span class="w"> </span>-p<span class="w"> </span>build/tmp/samples/monster
|
|
bin/flatcc<span class="w"> </span>-a<span class="w"> </span>-o<span class="w"> </span>build/tmp/samples/monster<span class="w"> </span>samples/monster/monster.fbs
|
|
<span class="c1"># or just</span>
|
|
flatcc/samples/monster/build.sh
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--csharp<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--dart<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--go<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--java<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--js<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--kotlin<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--lobster<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--lua<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--php<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--python<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--rust<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--swift<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>flatc<span class="w"> </span>--ts<span class="w"> </span>monster.fbs
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>You can deserialize flatbuffers in languages that differ from the language that
|
|
serialized it. For purpose of this tutorial, we assume one language is used for
|
|
both serializing and deserializing.</p>
|
|
<h2 id="application-integration">Application Integration</h2>
|
|
<p>The generated files are then included in your project to be built into your
|
|
application. This is heavily dependent on your build system and language, but
|
|
generally involves two things:</p>
|
|
<ol>
|
|
<li>Importing the generated code.</li>
|
|
<li>Importing the "runtime" libraries.</li>
|
|
</ol>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="3:15"><input checked="checked" id="c_3" name="__tabbed_3" type="radio" /><input id="c_4" name="__tabbed_3" type="radio" /><input id="c_5" name="__tabbed_3" type="radio" /><input id="dart_1" name="__tabbed_3" type="radio" /><input id="go_1" name="__tabbed_3" type="radio" /><input id="java_1" name="__tabbed_3" type="radio" /><input id="javascript_1" name="__tabbed_3" type="radio" /><input id="kotlin_1" name="__tabbed_3" type="radio" /><input id="lobster_1" name="__tabbed_3" type="radio" /><input id="lua_1" name="__tabbed_3" type="radio" /><input id="php_1" name="__tabbed_3" type="radio" /><input id="python_1" name="__tabbed_3" type="radio" /><input id="rust_1" name="__tabbed_3" type="radio" /><input id="swift_1" name="__tabbed_3" type="radio" /><input id="typescript_1" name="__tabbed_3" type="radio" /><div class="tabbed-labels"><label for="c_3">C++</label><label for="c_4">C</label><label for="c_5">C#</label><label for="dart_1">Dart</label><label for="go_1">Go</label><label for="java_1">Java</label><label for="javascript_1">JavaScript</label><label for="kotlin_1">Kotlin</label><label for="lobster_1">Lobster</label><label for="lua_1">Lua</label><label for="php_1">PHP</label><label for="python_1">Python</label><label for="rust_1">Rust</label><label for="swift_1">Swift</label><label for="typescript_1">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="cp">#include</span><span class="w"> </span><span class="cpf">"monster_generated.h"</span><span class="c1"> // This was generated by `flatc`</span>
|
|
<span class="cp">#include</span><span class="w"> </span><span class="cpf">"flatbuffers.h"</span><span class="c1"> // The runtime library for C++</span>
|
|
|
|
<span class="c1">// Simplifies naming in the following examples.</span>
|
|
<span class="k">using</span><span class="w"> </span><span class="k">namespace</span><span class="w"> </span><span class="nn">MyGame</span><span class="o">::</span><span class="nn">Sample</span><span class="p">;</span><span class="w"> </span><span class="c1">// Specified in the schema.</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="cp">#include</span><span class="w"> </span><span class="cpf">"monster_builder.h"</span><span class="c1"> // Generated by `flatcc`.</span>
|
|
|
|
<span class="c1">// Convenient namespace macro to manage long namespace prefix.</span>
|
|
<span class="cp">#undef ns</span>
|
|
<span class="c1">// Specified in the schema.</span>
|
|
<span class="cp">#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(MyGame_Sample, x)</span>
|
|
|
|
<span class="c1">// A helper to simplify creating vectors from C-arrays.</span>
|
|
<span class="cp">#define c_vec_len(V) (sizeof(V)/sizeof((V)[0]))</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="k">using</span><span class="w"> </span><span class="nn">Google.FlatBuffers</span><span class="p">;</span><span class="w"> </span><span class="c1">// The runtime library for C#</span>
|
|
<span class="k">using</span><span class="w"> </span><span class="nn">MyGame.Sample</span><span class="p">;</span><span class="w"> </span><span class="c1">// The generated files from `flatc`</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="k">import</span><span class="w"> </span><span class="s1">'package:flat_buffers/flat_buffers.dart'</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">fb</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Generated by `flatc`.</span>
|
|
<span class="k">import</span><span class="w"> </span><span class="s1">'monster_my_game.sample_generated.dart'</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">myGame</span><span class="p">;</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="p">(</span>
|
|
<span class="w"> </span><span class="nx">flatbuffers</span><span class="w"> </span><span class="s">"github.com/google/flatbuffers/go"</span>
|
|
<span class="w"> </span><span class="nx">sample</span><span class="w"> </span><span class="s">"MyGame/Sample"</span>
|
|
<span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">MyGame.Sample.*</span><span class="p">;</span><span class="w"> </span><span class="c1">//The `flatc` generated files. (Monster, Vec3, etc.)</span>
|
|
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">com.google.flatbuffers.FlatBufferBuilder</span><span class="p">;</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// The following code is an example - use your desired module flavor by</span>
|
|
<span class="c1">// transpiling from TS.</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">flatbuffers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">'/js/flatbuffers'</span><span class="p">).</span><span class="nx">flatbuffers</span><span class="p">;</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">MyGame</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">'./monster_generated'</span><span class="p">).</span><span class="nx">MyGame</span><span class="p">;</span><span class="w"> </span><span class="c1">// Generated by `flatc`.</span>
|
|
|
|
<span class="c1">//------------------------------------------------------------------------//</span>
|
|
|
|
<span class="c1">// The following code is for browser-based HTML/JavaScript. Use the above</span>
|
|
<span class="c1">// code for JavaScript module loaders (e.g. Node.js).</span>
|
|
<span class="o"><</span><span class="nx">script</span><span class="w"> </span><span class="nx">src</span><span class="o">=</span><span class="s2">"../js/flatbuffers.js"</span><span class="o">><</span><span class="err">/script></span>
|
|
<span class="o"><</span><span class="nx">script</span><span class="w"> </span><span class="nx">src</span><span class="o">=</span><span class="s2">"monster_generated.js"</span><span class="o">><</span><span class="sr">/script> /</span><span class="o">/</span><span class="w"> </span><span class="nx">Generated</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="sb">`flatc`</span><span class="p">.</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="k">import</span><span class="w"> </span><span class="nn">MyGame.Sample.*</span><span class="w"> </span><span class="c1">//The `flatc` generated files. (Monster, Vec3, etc.)</span>
|
|
|
|
<span class="k">import</span><span class="w"> </span><span class="nn">com.google.flatbuffers.FlatBufferBuilder</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>import from "../lobster/" // Where to find flatbuffers.lobster
|
|
import monster_generated
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">-- require the flatbuffers module</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">flatbuffers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">require</span><span class="p">(</span><span class="s2">"flatbuffers"</span><span class="p">)</span>
|
|
|
|
<span class="c1">-- require the generated files from `flatc`.</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">require</span><span class="p">(</span><span class="s2">"MyGame.Sample.Color"</span><span class="p">)</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">equipment</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">require</span><span class="p">(</span><span class="s2">"MyGame.Sample.Equipment"</span><span class="p">)</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">monster</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">require</span><span class="p">(</span><span class="s2">"MyGame.Sample.Monster"</span><span class="p">)</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">vec3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">require</span><span class="p">(</span><span class="s2">"MyGame.Sample.Vec3"</span><span class="p">)</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">weapon</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">require</span><span class="p">(</span><span class="s2">"MyGame.Sample.Weapon"</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// It is recommended that your use PSR autoload when using FlatBuffers in</span>
|
|
<span class="c1">// PHP. Here is an example from `SampleBinary.php`:</span>
|
|
<span class="k">function</span> <span class="nf">__autoload</span><span class="p">(</span><span class="nv">$class_name</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="c1">// The last segment of the class name matches the file name.</span>
|
|
<span class="nv">$class</span> <span class="o">=</span> <span class="nb">substr</span><span class="p">(</span><span class="nv">$class_name</span><span class="p">,</span> <span class="nb">strrpos</span><span class="p">(</span><span class="nv">$class_name</span><span class="p">,</span> <span class="s2">"</span><span class="se">\\</span><span class="s2">"</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
|
|
<span class="c1">// `flatbuffers` root.</span>
|
|
<span class="nv">$root_dir</span> <span class="o">=</span> <span class="nb">join</span><span class="p">(</span><span class="nx">DIRECTORY_SEPARATOR</span><span class="p">,</span> <span class="k">array</span><span class="p">(</span><span class="nb">dirname</span><span class="p">(</span><span class="nb">dirname</span><span class="p">(</span><span class="no">__FILE__</span><span class="p">))));</span>
|
|
|
|
<span class="c1">// Contains the `*.php` files for the FlatBuffers library and the `flatc`</span>
|
|
<span class="c1">// generated files.</span>
|
|
<span class="nv">$paths</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="nb">join</span><span class="p">(</span><span class="nx">DIRECTORY_SEPARATOR</span><span class="p">,</span> <span class="k">array</span><span class="p">(</span><span class="nv">$root_dir</span><span class="p">,</span> <span class="s2">"php"</span><span class="p">)),</span>
|
|
<span class="nb">join</span><span class="p">(</span><span class="nx">DIRECTORY_SEPARATOR</span><span class="p">,</span>
|
|
<span class="k">array</span><span class="p">(</span><span class="nv">$root_dir</span><span class="p">,</span> <span class="s2">"samples"</span><span class="p">,</span> <span class="s2">"MyGame"</span><span class="p">,</span> <span class="s2">"Sample"</span><span class="p">)));</span>
|
|
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$paths</span> <span class="k">as</span> <span class="nv">$path</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nv">$file</span> <span class="o">=</span> <span class="nb">join</span><span class="p">(</span><span class="nx">DIRECTORY_SEPARATOR</span><span class="p">,</span> <span class="k">array</span><span class="p">(</span><span class="nv">$path</span><span class="p">,</span> <span class="nv">$class</span> <span class="o">.</span> <span class="s2">".php"</span><span class="p">));</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">file_exists</span><span class="p">(</span><span class="nv">$file</span><span class="p">))</span> <span class="p">{</span>
|
|
<span class="k">require</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span>
|
|
<span class="k">break</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
<span class="p">}</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">flatbuffers</span>
|
|
|
|
<span class="c1"># Generated by `flatc`.</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">MyGame.Sample.Color</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">MyGame.Sample.Equipment</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">MyGame.Sample.Monster</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">MyGame.Sample.Vec3</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">MyGame.Sample.Weapon</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// import the flatbuffers runtime library</span>
|
|
<span class="k">extern</span><span class="w"> </span><span class="k">crate</span><span class="w"> </span><span class="n">flatbuffers</span><span class="p">;</span>
|
|
|
|
<span class="c1">// import the generated code</span>
|
|
<span class="cp">#[allow(dead_code, unused_imports)]</span>
|
|
<span class="cp">#[path = </span><span class="s">"./monster_generated.rs"</span><span class="cp">]</span>
|
|
<span class="k">mod</span><span class="w"> </span><span class="nn">monster_generated</span><span class="p">;</span>
|
|
<span class="k">pub</span><span class="w"> </span><span class="k">use</span><span class="w"> </span><span class="n">monster_generated</span><span class="p">::</span><span class="n">my_game</span><span class="p">::</span><span class="n">sample</span><span class="p">::{</span><span class="n">root_as_monster</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">Color</span><span class="p">,</span><span class="w"> </span><span class="n">Equipment</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">Monster</span><span class="p">,</span><span class="w"> </span><span class="n">MonsterArgs</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">Vec3</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">Weapon</span><span class="p">,</span><span class="w"> </span><span class="n">WeaponArgs</span><span class="p">};</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="cm">/**</span>
|
|
<span class="cm">// make sure that monster_generated.swift is included in your project</span>
|
|
<span class="cm">*/</span>
|
|
<span class="kd">import</span><span class="w"> </span><span class="nc">Flatbuffers</span>
|
|
|
|
<span class="c1">// typealiases for convenience</span>
|
|
<span class="kd">typealias</span><span class="w"> </span><span class="n">Monster</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">MyGame1_Sample_Monster</span>
|
|
<span class="kd">typealias</span><span class="w"> </span><span class="n">Weapon</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">MyGame1_Sample_Weapon</span>
|
|
<span class="kd">typealias</span><span class="w"> </span><span class="n">Color</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">MyGame1_Sample_Color</span>
|
|
<span class="kd">typealias</span><span class="w"> </span><span class="n">Vec3</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">MyGame1_Sample_Vec3</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// note: import flatbuffers with your desired import method</span>
|
|
|
|
<span class="k">import</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">MyGame</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s1">'./monster_generated'</span><span class="p">;</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>For some languages the runtime libraries are just code files you compile into
|
|
your application. While other languages provide packaged libraries via their
|
|
package managers.</p>
|
|
<p>The generated files include APIs for both serializing and deserializing
|
|
FlatBuffers. So these steps are identical for both the consumer and producer.</p>
|
|
<h2 id="serialization">Serialization</h2>
|
|
<p>Once all the files are included into your application, it's time to start
|
|
serializing some data!</p>
|
|
<p>With FlatBuffers, serialization can be a bit verbose, since each piece of data
|
|
must be serialized separately and in a particular order (depth-first, pre-order
|
|
traversal). The verbosity allows efficient serialization without heap
|
|
allocations, at the cost of more complex serialization APIs.</p>
|
|
<p>For example, any reference type (e.g. <code>table</code>, <code>vector</code>, <code>string</code>) must be
|
|
serialized before it can be referred to by other structures. So its typical to
|
|
serialize the data from leaf to root node, as will be shown below.</p>
|
|
<h3 id="flatbufferbuilder">FlatBufferBuilder</h3>
|
|
<p>Most languages use a Builder object for managing the binary array that the data
|
|
is serialized into. It provides an API for serializing data, as well as keeps
|
|
track of some internal state. The generated code wraps methods on the Builder
|
|
object to provide an API tailored to the schema.</p>
|
|
<p>First instantiate a Builder (or reuse an existing one) and specify some memory
|
|
for it. The builder will automatically resize the backing buffer when necessary.</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="4:15"><input checked="checked" id="c_6" name="__tabbed_4" type="radio" /><input id="c_7" name="__tabbed_4" type="radio" /><input id="c_8" name="__tabbed_4" type="radio" /><input id="dart_2" name="__tabbed_4" type="radio" /><input id="go_2" name="__tabbed_4" type="radio" /><input id="java_2" name="__tabbed_4" type="radio" /><input id="javascript_2" name="__tabbed_4" type="radio" /><input id="kotlin_2" name="__tabbed_4" type="radio" /><input id="lobster_2" name="__tabbed_4" type="radio" /><input id="lua_2" name="__tabbed_4" type="radio" /><input id="php_2" name="__tabbed_4" type="radio" /><input id="python_2" name="__tabbed_4" type="radio" /><input id="rust_2" name="__tabbed_4" type="radio" /><input id="swift_2" name="__tabbed_4" type="radio" /><input id="typescript_2" name="__tabbed_4" type="radio" /><div class="tabbed-labels"><label for="c_6">C++</label><label for="c_7">C</label><label for="c_8">C#</label><label for="dart_2">Dart</label><label for="go_2">Go</label><label for="java_2">Java</label><label for="javascript_2">JavaScript</label><label for="kotlin_2">Kotlin</label><label for="lobster_2">Lobster</label><label for="lua_2">Lua</label><label for="php_2">PHP</label><label for="python_2">Python</label><label for="rust_2">Rust</label><label for="swift_2">Swift</label><label for="typescript_2">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="n">flatbuffers</span><span class="o">::</span><span class="n">FlatBufferBuilder</span><span class="w"> </span><span class="nf">builder</span><span class="p">(</span><span class="mi">1024</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">flatcc_builder_t</span><span class="w"> </span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">B</span><span class="p">;</span>
|
|
<span class="n">B</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="n">builder</span><span class="p">;</span>
|
|
<span class="c1">// Initialize the builder object.</span>
|
|
<span class="n">flatcc_builder_init</span><span class="p">(</span><span class="n">B</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="n">FlatBufferBuilder</span><span class="w"> </span><span class="n">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">FlatBufferBuilder</span><span class="p">(</span><span class="mi">1024</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="n">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">fb</span><span class="p">.</span><span class="n">Builder</span><span class="p">(</span><span class="nl">initialSize:</span><span class="w"> </span><span class="m">1024</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="nx">builder</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">flatbuffers</span><span class="p">.</span><span class="nx">NewBuilder</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="n">FlatBufferBuilder</span><span class="w"> </span><span class="n">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">FlatBufferBuilder</span><span class="p">(</span><span class="mi">1024</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">flatbuffers</span><span class="p">.</span><span class="nx">Builder</span><span class="p">(</span><span class="mf">1024</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">FlatBufferBuilder</span><span class="p">(</span><span class="m">1024</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>// Construct a Builder with 1024 byte backing array.
|
|
let builder = flatbuffers_builder {}
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">-- Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">flatbuffers</span><span class="p">.</span><span class="nf">Builder</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="nv">$builder</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Google\FlatBuffers\FlatbufferBuilder</span><span class="p">(</span><span class="mi">1024</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1"># Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="n">builder</span> <span class="o">=</span> <span class="n">flatbuffers</span><span class="o">.</span><span class="n">Builder</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">flatbuffers</span><span class="p">::</span><span class="n">FlatBufferBuilder</span><span class="p">::</span><span class="n">with_capacity</span><span class="p">(</span><span class="mi">1024</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">builder</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">FlatBufferBuilder</span><span class="p">(</span><span class="n">initialSize</span><span class="p">:</span><span class="w"> </span><span class="mi">1024</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Construct a Builder with 1024 byte backing array.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">flatbuffers</span><span class="p">.</span><span class="nx">Builder</span><span class="p">(</span><span class="mf">1024</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>Once a Builder is available, data can be serialized to it via the Builder APIs
|
|
and the generated code.</p>
|
|
<h3 id="serializing-data">Serializing Data</h3>
|
|
<p>In this tutorial, we are building <code>Monsters</code> and <code>Weapons</code> for a computer game.
|
|
A <code>Weapon</code> is represented by a flatbuffer <code>table</code> with some fields. One field is
|
|
the <code>name</code> field, which is type <code>string</code> and the other <code>damage</code> field is a
|
|
numerical scalar.</p>
|
|
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">monster.fbs</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">28</span>
|
|
<span class="normal">29</span>
|
|
<span class="normal">30</span>
|
|
<span class="normal">31</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="n">table</span><span class="w"> </span><span class="n">Weapon</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nl">name</span><span class="p">:</span><span class="n">string</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="nl">damage</span><span class="p">:</span><span class="kt">short</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div></td></tr></table></div>
|
|
<h4 id="strings">Strings</h4>
|
|
<p>Since <code>string</code> is a reference type, we first need to serialize it before
|
|
assigning it to the <code>name</code> field of the <code>Weapon</code> table. This is done through the
|
|
Builder <code>CreateString</code> method.</p>
|
|
<p>Let's serialize two weapon strings.</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="5:15"><input checked="checked" id="c_9" name="__tabbed_5" type="radio" /><input id="c_10" name="__tabbed_5" type="radio" /><input id="c_11" name="__tabbed_5" type="radio" /><input id="dart_3" name="__tabbed_5" type="radio" /><input id="go_3" name="__tabbed_5" type="radio" /><input id="java_3" name="__tabbed_5" type="radio" /><input id="javascript_3" name="__tabbed_5" type="radio" /><input id="kotlin_3" name="__tabbed_5" type="radio" /><input id="lobster_3" name="__tabbed_5" type="radio" /><input id="lua_3" name="__tabbed_5" type="radio" /><input id="php_3" name="__tabbed_5" type="radio" /><input id="python_3" name="__tabbed_5" type="radio" /><input id="rust_3" name="__tabbed_5" type="radio" /><input id="swift_3" name="__tabbed_5" type="radio" /><input id="typescript_3" name="__tabbed_5" type="radio" /><div class="tabbed-labels"><label for="c_9">C++</label><label for="c_10">C</label><label for="c_11">C#</label><label for="dart_3">Dart</label><label for="go_3">Go</label><label for="java_3">Java</label><label for="javascript_3">JavaScript</label><label for="kotlin_3">Kotlin</label><label for="lobster_3">Lobster</label><label for="lua_3">Lua</label><label for="php_3">PHP</label><label for="python_3">Python</label><label for="rust_3">Rust</label><label for="swift_3">Swift</label><label for="typescript_3">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">flatbuffers</span><span class="o">::</span><span class="n">Offset</span><span class="o"><</span><span class="n">String</span><span class="o">></span><span class="w"> </span><span class="n">weapon_one_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">CreateString</span><span class="p">(</span><span class="s">"Sword"</span><span class="p">);</span>
|
|
<span class="n">flatbuffers</span><span class="o">::</span><span class="n">Offset</span><span class="o"><</span><span class="n">String</span><span class="o">></span><span class="w"> </span><span class="n">weapon_two_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">CreateString</span><span class="p">(</span><span class="s">"Axe"</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
<p><code>flatbuffers::Offset<></code> is a just a "typed" integer tied to a particular
|
|
type. It helps make the numerical offset more strongly typed.</p>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">flatbuffers_string_ref_t</span><span class="w"> </span><span class="n">weapon_one_name</span>
|
|
<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">flatbuffers_string_create_str</span><span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="s">"Sword"</span><span class="p">);</span>
|
|
<span class="n">flatbuffers_string_ref_t</span><span class="w"> </span><span class="n">weapon_two_name</span>
|
|
<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">flatbuffers_string_create_str</span><span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="s">"Axe"</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">Offset</span><span class="o"><</span><span class="n">String</span><span class="o">></span><span class="w"> </span><span class="n">weaponOneName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">CreateString</span><span class="p">(</span><span class="s">"Sword"</span><span class="p">);</span>
|
|
<span class="n">Offset</span><span class="o"><</span><span class="n">String</span><span class="o">></span><span class="w"> </span><span class="n">weaponTwoName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">CreateString</span><span class="p">(</span><span class="s">"Axe"</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">weaponOneName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">writeString</span><span class="p">(</span><span class="s2">"Sword"</span><span class="p">);</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">weaponTwoName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">writeString</span><span class="p">(</span><span class="s2">"Axe"</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nx">weaponOne</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">CreateString</span><span class="p">(</span><span class="s">"Sword"</span><span class="p">)</span>
|
|
<span class="nx">weaponTwo</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">CreateString</span><span class="p">(</span><span class="s">"Axe"</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">int</span><span class="w"> </span><span class="n">weaponOneName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="na">createString</span><span class="p">(</span><span class="s">"Sword"</span><span class="p">)</span>
|
|
<span class="kt">int</span><span class="w"> </span><span class="n">weaponTwoName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="na">createString</span><span class="p">(</span><span class="s">"Axe"</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">var</span><span class="w"> </span><span class="nx">weaponOne</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">createString</span><span class="p">(</span><span class="s1">'Sword'</span><span class="p">);</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">weaponTwo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">createString</span><span class="p">(</span><span class="s1">'Axe'</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">val</span><span class="w"> </span><span class="nv">weaponOneName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="na">createString</span><span class="p">(</span><span class="s">"Sword"</span><span class="p">)</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">weaponTwoName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="na">createString</span><span class="p">(</span><span class="s">"Axe"</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>let weapon_one = builder.CreateString("Sword")
|
|
let weapon_two = builder.CreateString("Axe")
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">local</span><span class="w"> </span><span class="nv">weaponOne</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">builder</span><span class="p">:</span><span class="nf">CreateString</span><span class="p">(</span><span class="s2">"Sword"</span><span class="p">)</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">weaponTwo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">builder</span><span class="p">:</span><span class="nf">CreateString</span><span class="p">(</span><span class="s2">"Axe"</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nv">$weapon_one_name</span> <span class="o">=</span> <span class="nv">$builder</span><span class="o">-></span><span class="na">createString</span><span class="p">(</span><span class="s2">"Sword"</span><span class="p">)</span>
|
|
<span class="nv">$weapon_two_name</span> <span class="o">=</span> <span class="nv">$builder</span><span class="o">-></span><span class="na">createString</span><span class="p">(</span><span class="s2">"Axe"</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">weapon_one</span> <span class="o">=</span> <span class="n">builder</span><span class="o">.</span><span class="n">CreateString</span><span class="p">(</span><span class="s1">'Sword'</span><span class="p">)</span>
|
|
<span class="n">weapon_two</span> <span class="o">=</span> <span class="n">builder</span><span class="o">.</span><span class="n">CreateString</span><span class="p">(</span><span class="s1">'Axe'</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">let</span><span class="w"> </span><span class="n">weapon_one_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">create_string</span><span class="p">(</span><span class="s">"Sword"</span><span class="p">);</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">weapon_two_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">create_string</span><span class="p">(</span><span class="s">"Axe"</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">let</span><span class="w"> </span><span class="nv">weapon1Name</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="n">string</span><span class="p">:</span><span class="w"> </span><span class="s">"Sword"</span><span class="p">)</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">weapon2Name</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="n">string</span><span class="p">:</span><span class="w"> </span><span class="s">"Axe"</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">let</span><span class="w"> </span><span class="nx">weaponOne</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">createString</span><span class="p">(</span><span class="s1">'Sword'</span><span class="p">);</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">weaponTwo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">createString</span><span class="p">(</span><span class="s1">'Axe'</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>This performs the actual serialization (the string data is copied into the
|
|
backing array) and returns an offset. Think of the offset as a handle to that
|
|
reference. It's just a "typed" numerical offset to where that data resides in
|
|
the buffer.</p>
|
|
<h4 id="tables">Tables</h4>
|
|
<p>Now that we have some names serialized, we can serialize the <code>Weapon</code> tables.
|
|
Here we will use one of the generated helper functions that was emitted by
|
|
<code>flatc</code>. The <code>CreateWeapon</code> function takes in the Builder object, as well as the
|
|
offset to the weapon's name and a numerical value for the damage field.</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="6:15"><input checked="checked" id="c_12" name="__tabbed_6" type="radio" /><input id="c_13" name="__tabbed_6" type="radio" /><input id="c_14" name="__tabbed_6" type="radio" /><input id="dart_4" name="__tabbed_6" type="radio" /><input id="go_4" name="__tabbed_6" type="radio" /><input id="java_4" name="__tabbed_6" type="radio" /><input id="javascript_4" name="__tabbed_6" type="radio" /><input id="kotlin_4" name="__tabbed_6" type="radio" /><input id="lobster_4" name="__tabbed_6" type="radio" /><input id="lua_4" name="__tabbed_6" type="radio" /><input id="php_4" name="__tabbed_6" type="radio" /><input id="python_4" name="__tabbed_6" type="radio" /><input id="rust_4" name="__tabbed_6" type="radio" /><input id="swift_4" name="__tabbed_6" type="radio" /><input id="typescript_4" name="__tabbed_6" type="radio" /><div class="tabbed-labels"><label for="c_12">C++</label><label for="c_13">C</label><label for="c_14">C#</label><label for="dart_4">Dart</label><label for="go_4">Go</label><label for="java_4">Java</label><label for="javascript_4">JavaScript</label><label for="kotlin_4">Kotlin</label><label for="lobster_4">Lobster</label><label for="lua_4">Lua</label><label for="php_4">PHP</label><label for="python_4">Python</label><label for="rust_4">Rust</label><label for="swift_4">Swift</label><label for="typescript_4">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">short</span><span class="w"> </span><span class="n">weapon_one_damage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
|
|
<span class="kt">short</span><span class="w"> </span><span class="n">weapon_two_damage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Use the `CreateWeapon()` shortcut to create Weapons with all the fields</span>
|
|
<span class="c1">// set.</span>
|
|
<span class="n">flatbuffers</span><span class="o">::</span><span class="n">Offset</span><span class="o"><</span><span class="n">Weapon</span><span class="o">></span><span class="w"> </span><span class="n">sword</span><span class="w"> </span><span class="o">=</span>
|
|
<span class="w"> </span><span class="n">CreateWeapon</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weapon_one_name</span><span class="p">,</span><span class="w"> </span><span class="n">weapon_one_damage</span><span class="p">);</span>
|
|
<span class="n">flatbuffers</span><span class="o">::</span><span class="n">Offset</span><span class="o"><</span><span class="n">Weapon</span><span class="o">></span><span class="w"> </span><span class="n">axe</span><span class="w"> </span><span class="o">=</span>
|
|
<span class="w"> </span><span class="n">CreateWeapon</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weapon_two_name</span><span class="p">,</span><span class="w"> </span><span class="n">weapon_two_damage</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">uint16_t</span><span class="w"> </span><span class="n">weapon_one_damage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
|
|
<span class="kt">uint16_t</span><span class="w"> </span><span class="n">weapon_two_damage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span>
|
|
|
|
<span class="n">ns</span><span class="p">(</span><span class="n">Weapon_ref_t</span><span class="p">)</span><span class="w"> </span><span class="n">sword</span>
|
|
<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Weapon_create</span><span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="n">weapon_one_name</span><span class="p">,</span><span class="w"> </span><span class="n">weapon_one_damage</span><span class="p">));</span>
|
|
<span class="n">ns</span><span class="p">(</span><span class="n">Weapon_ref_t</span><span class="p">)</span><span class="w"> </span><span class="n">axe</span>
|
|
<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Weapon_create</span><span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="n">weapon_two_name</span><span class="p">,</span><span class="w"> </span><span class="n">weapon_two_damage</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">short</span><span class="w"> </span><span class="n">weaponOneDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
|
|
<span class="kt">short</span><span class="w"> </span><span class="n">weaponTwoDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Use the `CreateWeapon()` helper function to create the weapons, since we</span>
|
|
<span class="c1">// set every field.</span>
|
|
<span class="n">Offset</span><span class="o"><</span><span class="n">Weapon</span><span class="o">></span><span class="w"> </span><span class="n">sword</span><span class="w"> </span><span class="o">=</span>
|
|
<span class="w"> </span><span class="n">Weapon</span><span class="p">.</span><span class="n">CreateWeapon</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weaponOneName</span><span class="p">,</span><span class="w"> </span><span class="n">weaponOneDamage</span><span class="p">);</span>
|
|
<span class="n">Offset</span><span class="o"><</span><span class="n">Weapon</span><span class="o">></span><span class="w"> </span><span class="n">axe</span><span class="w"> </span><span class="o">=</span>
|
|
<span class="w"> </span><span class="n">Weapon</span><span class="p">.</span><span class="n">CreateWeapon</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weaponTwoName</span><span class="p">,</span><span class="w"> </span><span class="n">weaponTwoDamage</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">weaponOneDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">3</span><span class="p">;</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">weaponTwoDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">;</span>
|
|
|
|
<span class="kd">final</span><span class="w"> </span><span class="n">swordBuilder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">myGame</span><span class="p">.</span><span class="n">WeaponBuilder</span><span class="p">(</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">begin</span><span class="p">()</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addNameOffset</span><span class="p">(</span><span class="n">weaponOneName</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addDamage</span><span class="p">(</span><span class="n">weaponOneDamage</span><span class="p">);</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">sword</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">swordBuilder</span><span class="p">.</span><span class="n">finish</span><span class="p">();</span>
|
|
|
|
<span class="kd">final</span><span class="w"> </span><span class="n">axeBuilder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">myGame</span><span class="p">.</span><span class="n">WeaponBuilder</span><span class="p">(</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">begin</span><span class="p">()</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addNameOffset</span><span class="p">(</span><span class="n">weaponTwoName</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addDamage</span><span class="p">(</span><span class="n">weaponTwoDamage</span><span class="p">);</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">axe</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">axeBuilder</span><span class="p">.</span><span class="n">finish</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
<p>Note, as an alternative, the previous steps can be combined using the
|
|
generative Builder classes.</p>
|
|
<div class="highlight"><pre><span></span><code><span class="kd">final</span><span class="w"> </span><span class="n">myGame</span><span class="p">.</span><span class="n">WeaponBuilder</span><span class="w"> </span><span class="n">sword</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">myGame</span><span class="p">.</span><span class="n">WeaponObjectBuilder</span><span class="p">(</span>
|
|
<span class="w"> </span><span class="nl">name:</span><span class="w"> </span><span class="s2">"Sword"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nl">damage:</span><span class="w"> </span><span class="m">3</span><span class="p">,</span>
|
|
<span class="p">);</span>
|
|
|
|
<span class="kd">final</span><span class="w"> </span><span class="n">myGame</span><span class="p">.</span><span class="n">WeaponBuilder</span><span class="w"> </span><span class="n">axe</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">myGame</span><span class="p">.</span><span class="n">WeaponObjectBuilder</span><span class="p">(</span>
|
|
<span class="w"> </span><span class="nl">name:</span><span class="w"> </span><span class="s2">"Axe"</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nl">damage:</span><span class="w"> </span><span class="m">5</span><span class="p">,</span>
|
|
<span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create the first `Weapon` ("Sword").</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">WeaponStart</span><span class="p">(</span><span class="nx">builder</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">WeaponAddName</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">weaponOne</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">WeaponAddDamage</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span>
|
|
<span class="nx">sword</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">sample</span><span class="p">.</span><span class="nx">WeaponEnd</span><span class="p">(</span><span class="nx">builder</span><span class="p">)</span>
|
|
|
|
<span class="c1">// Create the second `Weapon` ("Axe").</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">WeaponStart</span><span class="p">(</span><span class="nx">builder</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">WeaponAddName</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">weaponTwo</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">WeaponAddDamage</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">)</span>
|
|
<span class="nx">axe</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">sample</span><span class="p">.</span><span class="nx">WeaponEnd</span><span class="p">(</span><span class="nx">builder</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">short</span><span class="w"> </span><span class="n">weaponOneDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
|
|
<span class="kt">short</span><span class="w"> </span><span class="n">weaponTwoDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Use the `createWeapon()` helper function to create the weapons, since we</span>
|
|
<span class="c1">// set every field.</span>
|
|
<span class="kt">int</span><span class="w"> </span><span class="n">sword</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Weapon</span><span class="p">.</span><span class="na">createWeapon</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weaponOneName</span><span class="p">,</span><span class="w"> </span><span class="n">weaponOneDamage</span><span class="p">);</span>
|
|
<span class="kt">int</span><span class="w"> </span><span class="n">axe</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Weapon</span><span class="p">.</span><span class="na">createWeapon</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weaponTwoName</span><span class="p">,</span><span class="w"> </span><span class="n">weaponTwoDamage</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create the first `Weapon` ('Sword').</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">startWeapon</span><span class="p">(</span><span class="nx">builder</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">addName</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">weaponOne</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">addDamage</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">3</span><span class="p">);</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">sword</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">endWeapon</span><span class="p">(</span><span class="nx">builder</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Create the second `Weapon` ('Axe').</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">startWeapon</span><span class="p">(</span><span class="nx">builder</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">addName</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">weaponTwo</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">addDamage</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">5</span><span class="p">);</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">axe</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">endWeapon</span><span class="p">(</span><span class="nx">builder</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">val</span><span class="w"> </span><span class="nv">weaponOneDamage</span><span class="p">:</span><span class="w"> </span><span class="kt">Short</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">3</span><span class="p">;</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">weaponTwoDamage</span><span class="p">:</span><span class="w"> </span><span class="kt">Short</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Use the `createWeapon()` helper function to create the weapons, since we</span>
|
|
<span class="c1">// set every field.</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">sword</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Weapon</span><span class="p">.</span><span class="na">createWeapon</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weaponOneName</span><span class="p">,</span><span class="w"> </span><span class="n">weaponOneDamage</span><span class="p">)</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">axe</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Weapon</span><span class="p">.</span><span class="na">createWeapon</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weaponTwoName</span><span class="p">,</span><span class="w"> </span><span class="n">weaponTwoDamage</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>let sword = MyGame_Sample_WeaponBuilder { b }
|
|
.start()
|
|
.add_name(weapon_one)
|
|
.add_damage(3)
|
|
.end()
|
|
|
|
let axe = MyGame_Sample_WeaponBuilder { b }
|
|
.start()
|
|
.add_name(weapon_two)
|
|
.add_damage(5)
|
|
.end()
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">-- Create the first 'Weapon'</span>
|
|
<span class="nv">weapon</span><span class="p">.</span><span class="nf">Start</span><span class="p">(</span><span class="nv">builder</span><span class="p">)</span>
|
|
<span class="nv">weapon</span><span class="p">.</span><span class="nf">AddName</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="nv">weaponOne</span><span class="p">)</span>
|
|
<span class="nv">weapon</span><span class="p">.</span><span class="nf">AddDamage</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">sword</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">weapon</span><span class="p">.</span><span class="nf">End</span><span class="p">(</span><span class="nv">builder</span><span class="p">)</span>
|
|
|
|
<span class="c1">-- Create the second 'Weapon'</span>
|
|
<span class="nv">weapon</span><span class="p">.</span><span class="nf">Start</span><span class="p">(</span><span class="nv">builder</span><span class="p">)</span>
|
|
<span class="nv">weapon</span><span class="p">.</span><span class="nf">AddName</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="nv">weaponTwo</span><span class="p">)</span>
|
|
<span class="nv">weapon</span><span class="p">.</span><span class="nf">AddDamage</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">)</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">axe</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">weapon</span><span class="p">.</span><span class="nf">End</span><span class="p">(</span><span class="nv">builder</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nv">$sword</span> <span class="o">=</span> <span class="nx">\MyGame\Sample\Weapon</span><span class="o">::</span><span class="na">CreateWeapon</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="nv">$weapon_one_name</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
|
|
<span class="nv">$axe</span> <span class="o">=</span> <span class="nx">\MyGame\Sample\Weapon</span><span class="o">::</span><span class="na">CreateWeapon</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="nv">$weapon_two_name</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1"># Create the first `Weapon` ('Sword').</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Weapon</span><span class="o">.</span><span class="n">Start</span><span class="p">(</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Weapon</span><span class="o">.</span><span class="n">AddName</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="n">weapon_one</span><span class="p">)</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Weapon</span><span class="o">.</span><span class="n">AddDamage</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
|
|
<span class="n">sword</span> <span class="o">=</span> <span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Weapon</span><span class="o">.</span><span class="n">End</span><span class="p">(</span><span class="n">builder</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Create the second `Weapon` ('Axe').</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Weapon</span><span class="o">.</span><span class="n">Start</span><span class="p">(</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Weapon</span><span class="o">.</span><span class="n">AddName</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="n">weapon_two</span><span class="p">)</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Weapon</span><span class="o">.</span><span class="n">AddDamage</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
|
|
<span class="n">axe</span> <span class="o">=</span> <span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Weapon</span><span class="o">.</span><span class="n">End</span><span class="p">(</span><span class="n">builder</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Use the `Weapon::create` shortcut to create Weapons with named field</span>
|
|
<span class="c1">// arguments.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">sword</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Weapon</span><span class="p">::</span><span class="n">create</span><span class="p">(</span><span class="o">&</span><span class="k">mut</span><span class="w"> </span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">WeaponArgs</span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">name</span><span class="p">:</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">weapon_one_name</span><span class="p">),</span>
|
|
<span class="w"> </span><span class="n">damage</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span>
|
|
<span class="p">});</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">axe</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Weapon</span><span class="p">::</span><span class="n">create</span><span class="p">(</span><span class="o">&</span><span class="k">mut</span><span class="w"> </span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">WeaponArgs</span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">name</span><span class="p">:</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">weapon_two_name</span><span class="p">),</span>
|
|
<span class="w"> </span><span class="n">damage</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span>
|
|
<span class="p">});</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// start creating the weapon by calling startWeapon</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">weapon1Start</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Weapon</span><span class="p">.</span><span class="n">startWeapon</span><span class="p">(&</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="n">Weapon</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">name</span><span class="p">:</span><span class="w"> </span><span class="n">weapon1Name</span><span class="p">,</span><span class="w"> </span><span class="p">&</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="n">Weapon</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">damage</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="p">&</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="c1">// end the object by passing the start point for the weapon 1</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">sword</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Weapon</span><span class="p">.</span><span class="n">endWeapon</span><span class="p">(&</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">start</span><span class="p">:</span><span class="w"> </span><span class="n">weapon1Start</span><span class="p">)</span>
|
|
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">weapon2Start</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Weapon</span><span class="p">.</span><span class="n">startWeapon</span><span class="p">(&</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="n">Weapon</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">name</span><span class="p">:</span><span class="w"> </span><span class="n">weapon2Name</span><span class="p">,</span><span class="w"> </span><span class="p">&</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="n">Weapon</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">damage</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="p">&</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">axe</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Weapon</span><span class="p">.</span><span class="n">endWeapon</span><span class="p">(&</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">start</span><span class="p">:</span><span class="w"> </span><span class="n">weapon2Start</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create the first `Weapon` ('Sword').</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">startWeapon</span><span class="p">(</span><span class="nx">builder</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">addName</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">weaponOne</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">addDamage</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">3</span><span class="p">);</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">sword</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">endWeapon</span><span class="p">(</span><span class="nx">builder</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Create the second `Weapon` ('Axe').</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">startWeapon</span><span class="p">(</span><span class="nx">builder</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">addName</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">weaponTwo</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">addDamage</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">5</span><span class="p">);</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">axe</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">endWeapon</span><span class="p">(</span><span class="nx">builder</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>The generated functions from <code>flatc</code>, like <code>CreateWeapon</code>, are just composed of
|
|
various Builder API methods. So its not required to use the generated code, but
|
|
it does make things much simpler and compact.</p>
|
|
<p>Just like the <code>CreateString</code> methods, the table serialization functions return
|
|
an offset to the location of the serialized <code>Weapon</code> table.</p>
|
|
<p>Now that we have some <code>Weapons</code> serialized, we can serialize a <code>Monster</code>.
|
|
Looking at the schema again, this table has a lot more fields of various types.
|
|
Some of these need to be serialized beforehand, for the same reason we
|
|
serialized the name string before the weapon table.</p>
|
|
<div class="admonition note inline end">
|
|
<p class="admonition-title">Note</p>
|
|
<p>There is no prescribed ordering of which table fields must be serialized
|
|
first, you could serialize in any order you want. You can also not serialize
|
|
a field to provide a <code>null</code> value, this is done by using an 0 offset value.</p>
|
|
</div>
|
|
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">monster.fbs</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">15</span>
|
|
<span class="normal">16</span>
|
|
<span class="normal">17</span>
|
|
<span class="normal">18</span>
|
|
<span class="normal">19</span>
|
|
<span class="normal">20</span>
|
|
<span class="normal">21</span>
|
|
<span class="normal">22</span>
|
|
<span class="normal">23</span>
|
|
<span class="normal">24</span>
|
|
<span class="normal">25</span>
|
|
<span class="normal">26</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="n">table</span><span class="w"> </span><span class="n">Monster</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nl">pos</span><span class="p">:</span><span class="n">Vec3</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="nl">mana</span><span class="p">:</span><span class="kt">short</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">150</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="nl">hp</span><span class="p">:</span><span class="kt">short</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">100</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="nl">name</span><span class="p">:</span><span class="n">string</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="nl">friendly</span><span class="p">:</span><span class="kt">bool</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">false</span><span class="w"> </span><span class="p">(</span><span class="n">deprecated</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="nl">inventory</span><span class="p">:[</span><span class="n">ubyte</span><span class="p">];</span>
|
|
<span class="w"> </span><span class="nl">color</span><span class="p">:</span><span class="n">Color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Blue</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="nl">weapons</span><span class="p">:[</span><span class="n">Weapon</span><span class="p">];</span>
|
|
<span class="w"> </span><span class="nl">equipped</span><span class="p">:</span><span class="n">Equipment</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="nl">path</span><span class="p">:[</span><span class="n">Vec3</span><span class="p">];</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div></td></tr></table></div>
|
|
<h4 id="vectors">Vectors</h4>
|
|
<p>The <code>weapons</code> field is a <code>vector</code> of <code>Weapon</code> tables. We already have two
|
|
<code>Weapons</code> serialized, so we just need to serialize a <code>vector</code> of those offsets.
|
|
The Builder provides multiple ways to create <code>vectors</code>.</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="7:15"><input checked="checked" id="c_15" name="__tabbed_7" type="radio" /><input id="c_16" name="__tabbed_7" type="radio" /><input id="c_17" name="__tabbed_7" type="radio" /><input id="dart_5" name="__tabbed_7" type="radio" /><input id="go_5" name="__tabbed_7" type="radio" /><input id="java_5" name="__tabbed_7" type="radio" /><input id="javascript_5" name="__tabbed_7" type="radio" /><input id="kotlin_5" name="__tabbed_7" type="radio" /><input id="lobster_5" name="__tabbed_7" type="radio" /><input id="lua_5" name="__tabbed_7" type="radio" /><input id="php_5" name="__tabbed_7" type="radio" /><input id="python_5" name="__tabbed_7" type="radio" /><input id="rust_5" name="__tabbed_7" type="radio" /><input id="swift_5" name="__tabbed_7" type="radio" /><input id="typescript_5" name="__tabbed_7" type="radio" /><div class="tabbed-labels"><label for="c_15">C++</label><label for="c_16">C</label><label for="c_17">C#</label><label for="dart_5">Dart</label><label for="go_5">Go</label><label for="java_5">Java</label><label for="javascript_5">JavaScript</label><label for="kotlin_5">Kotlin</label><label for="lobster_5">Lobster</label><label for="lua_5">Lua</label><label for="php_5">PHP</label><label for="python_5">Python</label><label for="rust_5">Rust</label><label for="swift_5">Swift</label><label for="typescript_5">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a std::vector of the offsets we had previous made.</span>
|
|
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">flatbuffers</span><span class="o">::</span><span class="n">Offset</span><span class="o"><</span><span class="n">Weapon</span><span class="o">>></span><span class="w"> </span><span class="n">weapons_vector</span><span class="p">;</span>
|
|
<span class="n">weapons_vector</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">sword</span><span class="p">);</span>
|
|
<span class="n">weapons_vector</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">axe</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Then serialize that std::vector into the buffer and again get an Offset</span>
|
|
<span class="c1">// to that vector. Use `auto` here since the full type is long, and it just</span>
|
|
<span class="c1">// a "typed" number.</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">weapons</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">CreateVector</span><span class="p">(</span><span class="n">weapons_vector</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// We use the internal builder stack to implement a dynamic vector.</span>
|
|
<span class="n">ns</span><span class="p">(</span><span class="n">Weapon_vec_start</span><span class="p">(</span><span class="n">B</span><span class="p">));</span>
|
|
<span class="n">ns</span><span class="p">(</span><span class="n">Weapon_vec_push</span><span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="n">sword</span><span class="p">));</span>
|
|
<span class="n">ns</span><span class="p">(</span><span class="n">Weapon_vec_push</span><span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="n">axe</span><span class="p">));</span>
|
|
<span class="n">ns</span><span class="p">(</span><span class="n">Weapon_vec_ref_t</span><span class="p">)</span><span class="w"> </span><span class="n">weapons</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Weapon_vec_end</span><span class="p">(</span><span class="n">B</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create an array of the two weapon offsets.</span>
|
|
<span class="kt">var</span><span class="w"> </span><span class="n">weaps</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Offset</span><span class="o"><</span><span class="n">Weapon</span><span class="o">></span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
|
|
<span class="n">weaps</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sword</span><span class="p">;</span>
|
|
<span class="n">weaps</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">axe</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Pass the `weaps` array into the `CreateWeaponsVector()` method to create</span>
|
|
<span class="c1">// a FlatBuffer vector.</span>
|
|
<span class="kt">var</span><span class="w"> </span><span class="n">weapons</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">.</span><span class="n">CreateWeaponsVector</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weaps</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// If using the Builder classes, serialize the `[sword,axe]`</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="n">weapons</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">writeList</span><span class="p">([</span><span class="n">sword</span><span class="p">,</span><span class="w"> </span><span class="n">axe</span><span class="p">]);</span>
|
|
|
|
<span class="c1">// If using the ObjectBuilders, just create an array from the two `Weapon`s</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">myGame</span><span class="p">.</span><span class="n">WeaponBuilder</span><span class="o">></span><span class="w"> </span><span class="n">weaps</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">sword</span><span class="p">,</span><span class="w"> </span><span class="n">axe</span><span class="p">];</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a FlatBuffer vector and prepend the weapons.</span>
|
|
<span class="c1">// Note: Since we prepend the data, prepend them in reverse order.</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterStartWeaponsVector</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span>
|
|
<span class="nx">builder</span><span class="p">.</span><span class="nx">PrependUOffsetT</span><span class="p">(</span><span class="nx">axe</span><span class="p">)</span>
|
|
<span class="nx">builder</span><span class="p">.</span><span class="nx">PrependUOffsetT</span><span class="p">(</span><span class="nx">sword</span><span class="p">)</span>
|
|
<span class="nx">weapons</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">EndVector</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Place the two weapons into an array, and pass it to the</span>
|
|
<span class="c1">// `createWeaponsVector()` method to create a FlatBuffer vector.</span>
|
|
<span class="kt">int</span><span class="o">[]</span><span class="w"> </span><span class="n">weaps</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">int</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span><span class="p">;</span>
|
|
<span class="n">weaps</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sword</span><span class="p">;</span>
|
|
<span class="n">weaps</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">axe</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Pass the `weaps` array into the `createWeaponsVector()` method to create</span>
|
|
<span class="c1">// a FlatBuffer vector.</span>
|
|
<span class="kt">int</span><span class="w"> </span><span class="n">weapons</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">.</span><span class="na">createWeaponsVector</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weaps</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create an array from the two `Weapon`s and pass it to the</span>
|
|
<span class="c1">// `createWeaponsVector()` method to create a FlatBuffer vector.</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">weaps</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="nx">sword</span><span class="p">,</span><span class="w"> </span><span class="nx">axe</span><span class="p">];</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">weapons</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">createWeaponsVector</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">weaps</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Place the two weapons into an array, and pass it to the</span>
|
|
<span class="c1">// `createWeaponsVector()` method to create a FlatBuffer vector.</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">weaps</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">intArrayOf</span><span class="p">(</span><span class="n">sword</span><span class="p">,</span><span class="w"> </span><span class="n">axe</span><span class="p">)</span>
|
|
|
|
<span class="c1">// Pass the `weaps` array into the `createWeaponsVector()` method to create</span>
|
|
<span class="c1">// a FlatBuffer vector.</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">weapons</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">.</span><span class="na">createWeaponsVector</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weaps</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>let weapons = builder.MyGame_Sample_MonsterCreateWeaponsVector([sword, axe])
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">-- Create a FlatBuffer vector and prepend the weapons.</span>
|
|
<span class="c1">-- Note: Since we prepend the data, prepend them in reverse order.</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">StartWeaponsVector</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span>
|
|
<span class="nv">builder</span><span class="p">:</span><span class="nf">PrependUOffsetTRelative</span><span class="p">(</span><span class="nv">axe</span><span class="p">)</span>
|
|
<span class="nv">builder</span><span class="p">:</span><span class="nf">PrependUOffsetTRelative</span><span class="p">(</span><span class="nv">sword</span><span class="p">)</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">weapons</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">builder</span><span class="p">:</span><span class="nf">EndVector</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create an array from the two `Weapon`s and pass it to the</span>
|
|
<span class="c1">// `CreateWeaponsVector()` method to create a FlatBuffer vector.</span>
|
|
<span class="nv">$weaps</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="nv">$sword</span><span class="p">,</span> <span class="nv">$axe</span><span class="p">);</span>
|
|
<span class="nv">$weapons</span> <span class="o">=</span> <span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">CreateWeaponsVector</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="nv">$weaps</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1"># Use the generated helper to create the weapons vector from offsets.</span>
|
|
<span class="n">weapons</span> <span class="o">=</span> <span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">CreateWeaponsVector</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="p">[</span><span class="n">sword</span><span class="p">,</span> <span class="n">axe</span><span class="p">])</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a FlatBuffer `vector` that contains offsets to the sword and axe</span>
|
|
<span class="c1">// we created above.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">weapons</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">create_vector</span><span class="p">(</span><span class="o">&</span><span class="p">[</span><span class="n">sword</span><span class="p">,</span><span class="w"> </span><span class="n">axe</span><span class="p">]);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a FlatBuffer `vector` that contains offsets to the sword and axe</span>
|
|
<span class="c1">// we created above.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">weaponsOffset</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">createVector</span><span class="p">(</span><span class="n">ofOffsets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="n">sword</span><span class="p">,</span><span class="w"> </span><span class="n">axe</span><span class="p">])</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create an array from the two `Weapon`s and pass it to the</span>
|
|
<span class="c1">// `createWeaponsVector()` method to create a FlatBuffer vector.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">weaps</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="nx">sword</span><span class="p">,</span><span class="w"> </span><span class="nx">axe</span><span class="p">];</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">weapons</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">createWeaponsVector</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">weaps</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>While we are at it, let us serialize the other two vector fields: the
|
|
<code>inventory</code> field is just a vector of scalars, and the <code>path</code> field is a vector
|
|
of structs (which are scalar data as well). So these vectors can be serialized a
|
|
bit more directly.</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="8:15"><input checked="checked" id="c_18" name="__tabbed_8" type="radio" /><input id="c_19" name="__tabbed_8" type="radio" /><input id="c_20" name="__tabbed_8" type="radio" /><input id="dart_6" name="__tabbed_8" type="radio" /><input id="go_6" name="__tabbed_8" type="radio" /><input id="java_6" name="__tabbed_8" type="radio" /><input id="javascript_6" name="__tabbed_8" type="radio" /><input id="kotlin_6" name="__tabbed_8" type="radio" /><input id="lobster_6" name="__tabbed_8" type="radio" /><input id="lua_6" name="__tabbed_8" type="radio" /><input id="php_6" name="__tabbed_8" type="radio" /><input id="python_6" name="__tabbed_8" type="radio" /><input id="rust_6" name="__tabbed_8" type="radio" /><input id="swift_6" name="__tabbed_8" type="radio" /><input id="typescript_6" name="__tabbed_8" type="radio" /><div class="tabbed-labels"><label for="c_18">C++</label><label for="c_19">C</label><label for="c_20">C#</label><label for="dart_6">Dart</label><label for="go_6">Go</label><label for="java_6">Java</label><label for="javascript_6">JavaScript</label><label for="kotlin_6">Kotlin</label><label for="lobster_6">Lobster</label><label for="lua_6">Lua</label><label for="php_6">PHP</label><label for="python_6">Python</label><label for="rust_6">Rust</label><label for="swift_6">Swift</label><label for="typescript_6">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a `vector` representing the inventory of the Orc. Each number</span>
|
|
<span class="c1">// could correspond to an item that can be claimed after he is slain.</span>
|
|
<span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">treasure</span><span class="p">[]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">8</span><span class="p">,</span><span class="w"> </span><span class="mi">9</span><span class="p">};</span>
|
|
<span class="n">flatbuffers</span><span class="o">::</span><span class="n">Offset</span><span class="o"><</span><span class="n">flatbuffers</span><span class="o">::</span><span class="n">Vector</span><span class="o"><</span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="o">>></span><span class="w"> </span><span class="n">inventory</span><span class="w"> </span><span class="o">=</span>
|
|
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">CreateVector</span><span class="p">(</span><span class="n">treasure</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Construct an array of two `Vec3` structs.</span>
|
|
<span class="n">Vec3</span><span class="w"> </span><span class="n">points</span><span class="p">[]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Vec3</span><span class="p">(</span><span class="mf">1.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0f</span><span class="p">),</span><span class="w"> </span><span class="n">Vec3</span><span class="p">(</span><span class="mf">4.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">5.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">6.0f</span><span class="p">)</span><span class="w"> </span><span class="p">};</span>
|
|
|
|
<span class="c1">// Serialize it as a vector of structs.</span>
|
|
<span class="n">flatbuffers</span><span class="o">::</span><span class="n">Offset</span><span class="o"><</span><span class="n">flatbuffers</span><span class="o">::</span><span class="n">Vector</span><span class="o"><</span><span class="n">Vec3</span><span class="o">>></span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="o">=</span>
|
|
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">CreateVectorOfStructs</span><span class="p">(</span><span class="n">points</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a `vector` representing the inventory of the Orc. Each number</span>
|
|
<span class="c1">// could correspond to an item that can be claimed after he is slain.</span>
|
|
<span class="kt">uint8_t</span><span class="w"> </span><span class="n">treasure</span><span class="p">[]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">8</span><span class="p">,</span><span class="w"> </span><span class="mi">9</span><span class="p">};</span>
|
|
<span class="n">flatbuffers_uint8_vec_ref_t</span><span class="w"> </span><span class="n">inventory</span><span class="p">;</span>
|
|
<span class="c1">// `c_vec_len` is the convenience macro we defined earlier.</span>
|
|
<span class="n">inventory</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">flatbuffers_uint8_vec_create</span><span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="n">treasure</span><span class="p">,</span><span class="w"> </span><span class="n">c_vec_len</span><span class="p">(</span><span class="n">treasure</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a `vector` representing the inventory of the Orc. Each number</span>
|
|
<span class="c1">// could correspond to an item that can be claimed after he is slain.</span>
|
|
<span class="c1">// Note: Since we prepend the bytes, this loop iterates in reverse order.</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="n">StartInventoryVector</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">);</span>
|
|
<span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">9</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">--</span><span class="p">)</span>
|
|
<span class="p">{</span>
|
|
<span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">AddByte</span><span class="p">((</span><span class="kt">byte</span><span class="p">)</span><span class="n">i</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="n">Offset</span><span class="o"><</span><span class="n">Vector</span><span class="o"><</span><span class="kt">byte</span><span class="o">>></span><span class="w"> </span><span class="n">inventory</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">EndVector</span><span class="p">();</span>
|
|
|
|
<span class="w"> </span><span class="c1">// Start building a path vector of length 2.</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="n">StartPathVector</span><span class="p">(</span><span class="n">fbb</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Serialize the individual Vec3 structs</span>
|
|
<span class="n">Vec3</span><span class="p">.</span><span class="n">CreateVec3</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0f</span><span class="p">);</span>
|
|
<span class="n">Vec3</span><span class="p">.</span><span class="n">CreateVec3</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">4.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">5.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">6.0f</span><span class="p">);</span>
|
|
|
|
<span class="c1">// End the vector to get the offset</span>
|
|
<span class="n">Offset</span><span class="o"><</span><span class="n">Vector</span><span class="o"><</span><span class="n">Vec3</span><span class="o">>></span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fbb</span><span class="p">.</span><span class="n">EndVector</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a list representing the inventory of the Orc. Each number</span>
|
|
<span class="c1">// could correspond to an item that can be claimed after he is slain.</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="n">treasure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="m">6</span><span class="p">,</span><span class="w"> </span><span class="m">7</span><span class="p">,</span><span class="w"> </span><span class="m">8</span><span class="p">,</span><span class="w"> </span><span class="m">9</span><span class="p">];</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="n">inventory</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">writeListUint8</span><span class="p">(</span><span class="n">treasure</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Using the Builder classes, you can write a list of structs like so:</span>
|
|
<span class="c1">// Note that the intended order should be reversed if order is important.</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="n">vec3Builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">myGame</span><span class="p">.</span><span class="n">Vec3Builder</span><span class="p">(</span><span class="n">builder</span><span class="p">);</span>
|
|
<span class="n">vec3Builder</span><span class="p">.</span><span class="n">finish</span><span class="p">(</span><span class="m">4.0</span><span class="p">,</span><span class="w"> </span><span class="m">5.0</span><span class="p">,</span><span class="w"> </span><span class="m">6.0</span><span class="p">);</span>
|
|
<span class="n">vec3Builder</span><span class="p">.</span><span class="n">finish</span><span class="p">(</span><span class="m">1.0</span><span class="p">,</span><span class="w"> </span><span class="m">2.0</span><span class="p">,</span><span class="w"> </span><span class="m">3.0</span><span class="p">);</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">endStructVector</span><span class="p">(</span><span class="m">2</span><span class="p">);</span><span class="w"> </span><span class="c1">// the length of the vector</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a `vector` representing the inventory of the Orc. Each number</span>
|
|
<span class="c1">// could correspond to an item that can be claimed after he is slain.</span>
|
|
<span class="c1">// Note: Since we prepend the bytes, this loop iterates in reverse.</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterStartInventoryVector</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">)</span>
|
|
<span class="k">for</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">9</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="o">--</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">PrependByte</span><span class="p">(</span><span class="nb">byte</span><span class="p">(</span><span class="nx">i</span><span class="p">))</span>
|
|
<span class="p">}</span>
|
|
<span class="nx">inv</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">EndVector</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
|
|
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterStartPathVector</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">CreateVec3</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">CreateVec3</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">4.0</span><span class="p">,</span><span class="w"> </span><span class="mf">5.0</span><span class="p">,</span><span class="w"> </span><span class="mf">6.0</span><span class="p">)</span>
|
|
<span class="nx">path</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">EndVector</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a `vector` representing the inventory of the Orc. Each number</span>
|
|
<span class="c1">// could correspond to an item that can be claimed after he is slain.</span>
|
|
<span class="kt">byte</span><span class="o">[]</span><span class="w"> </span><span class="n">treasure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">8</span><span class="p">,</span><span class="w"> </span><span class="mi">9</span><span class="p">};</span>
|
|
<span class="kt">int</span><span class="w"> </span><span class="n">inv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">.</span><span class="na">createInventoryVector</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">treasure</span><span class="p">);</span>
|
|
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">startPathVector</span><span class="p">(</span><span class="n">fbb</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">);</span>
|
|
<span class="n">Vec3</span><span class="p">.</span><span class="na">createVec3</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0f</span><span class="p">);</span>
|
|
<span class="n">Vec3</span><span class="p">.</span><span class="na">createVec3</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">4.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">5.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">6.0f</span><span class="p">);</span>
|
|
<span class="kt">int</span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fbb</span><span class="p">.</span><span class="na">endVector</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a `vector` representing the inventory of the Orc. Each number</span>
|
|
<span class="c1">// could correspond to an item that can be claimed after he is slain.</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">treasure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mf">0</span><span class="p">,</span><span class="w"> </span><span class="mf">1</span><span class="p">,</span><span class="w"> </span><span class="mf">2</span><span class="p">,</span><span class="w"> </span><span class="mf">3</span><span class="p">,</span><span class="w"> </span><span class="mf">4</span><span class="p">,</span><span class="w"> </span><span class="mf">5</span><span class="p">,</span><span class="w"> </span><span class="mf">6</span><span class="p">,</span><span class="w"> </span><span class="mf">7</span><span class="p">,</span><span class="w"> </span><span class="mf">8</span><span class="p">,</span><span class="w"> </span><span class="mf">9</span><span class="p">];</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">inv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">createInventoryVector</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">treasure</span><span class="p">);</span>
|
|
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">startPathVector</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">2</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Vec3</span><span class="p">.</span><span class="nx">createVec3</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Vec3</span><span class="p">.</span><span class="nx">createVec3</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">4.0</span><span class="p">,</span><span class="w"> </span><span class="mf">5.0</span><span class="p">,</span><span class="w"> </span><span class="mf">6.0</span><span class="p">);</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">endVector</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a `vector` representing the inventory of the Orc. Each number</span>
|
|
<span class="c1">// could correspond to an item that can be claimed after he is slain.</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">treasure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">byteArrayOf</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="m">6</span><span class="p">,</span><span class="w"> </span><span class="m">7</span><span class="p">,</span><span class="w"> </span><span class="m">8</span><span class="p">,</span><span class="w"> </span><span class="m">9</span><span class="p">)</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">inv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">.</span><span class="na">createInventoryVector</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">treasure</span><span class="p">)</span>
|
|
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">startPathVector</span><span class="p">(</span><span class="n">fbb</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">)</span>
|
|
<span class="n">Vec3</span><span class="p">.</span><span class="na">createVec3</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="m">1.0f</span><span class="p">,</span><span class="w"> </span><span class="m">2.0f</span><span class="p">,</span><span class="w"> </span><span class="m">3.0f</span><span class="p">)</span>
|
|
<span class="n">Vec3</span><span class="p">.</span><span class="na">createVec3</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="m">4.0f</span><span class="p">,</span><span class="w"> </span><span class="m">5.0f</span><span class="p">,</span><span class="w"> </span><span class="m">6.0f</span><span class="p">)</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fbb</span><span class="p">.</span><span class="na">endVector</span><span class="p">()</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>// Inventory.
|
|
let inv = builder.MyGame_Sample_MonsterCreateInventoryVector(map(10): _)
|
|
|
|
builder.MyGame_Sample_MonsterStartPathVector(2)
|
|
builder.MyGame_Sample_CreateVec3(1.0, 2.0, 3.0)
|
|
builder.MyGame_Sample_CreateVec3(4.0, 5.0, 6.0)
|
|
let path = builder.EndVector(2)
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">-- Create a `vector` representing the inventory of the Orc. Each number</span>
|
|
<span class="c1">-- could correspond to an item that can be claimed after he is slain.</span>
|
|
<span class="c1">-- Note: Since we prepend the bytes, this loop iterates in reverse.</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">StartInventoryVector</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">)</span>
|
|
<span class="kr">for</span><span class="w"> </span><span class="nv">i</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="kr">do</span>
|
|
<span class="w"> </span><span class="nv">builder</span><span class="p">:</span><span class="nf">PrependByte</span><span class="p">(</span><span class="nv">i</span><span class="p">)</span>
|
|
<span class="kr">end</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">inv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">builder</span><span class="p">:</span><span class="nf">EndVector</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
|
|
|
|
<span class="c1">-- Create a FlatBuffer vector and prepend the path locations.</span>
|
|
<span class="c1">-- Note: Since we prepend the data, prepend them in reverse order.</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">StartPathVector</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span>
|
|
<span class="nv">vec3</span><span class="p">.</span><span class="nf">CreateVec3</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0</span><span class="p">)</span>
|
|
<span class="nv">vec3</span><span class="p">.</span><span class="nf">CreateVec3</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">4.0</span><span class="p">,</span><span class="w"> </span><span class="mf">5.0</span><span class="p">,</span><span class="w"> </span><span class="mf">6.0</span><span class="p">)</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">builder</span><span class="p">:</span><span class="nf">EndVector</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a `vector` representing the inventory of the Orc. Each number</span>
|
|
<span class="c1">// could correspond to an item that can be claimed after he is slain.</span>
|
|
<span class="nv">$treasure</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">);</span>
|
|
<span class="nv">$inv</span> <span class="o">=</span> <span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">CreateInventoryVector</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="nv">$treasure</span><span class="p">);</span>
|
|
|
|
<span class="nx">\MyGame\Example\Monster</span><span class="o">::</span><span class="na">StartPathVector</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
|
|
<span class="nx">\MyGame\Sample\Vec3</span><span class="o">::</span><span class="na">CreateVec3</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">,</span> <span class="mf">3.0</span><span class="p">);</span>
|
|
<span class="nx">\MyGame\Sample\Vec3</span><span class="o">::</span><span class="na">CreateVec3</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">,</span> <span class="mf">3.0</span><span class="p">);</span>
|
|
<span class="nv">$path</span> <span class="o">=</span> <span class="nv">$builder</span><span class="o">-></span><span class="na">endVector</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1"># Create a `vector` representing the inventory of the Orc. Each number</span>
|
|
<span class="c1"># could correspond to an item that can be claimed after he is slain.</span>
|
|
<span class="n">inv</span> <span class="o">=</span> <span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">CreateInventoryVector</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">))</span>
|
|
|
|
<span class="n">path_points</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Vec3T</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">z</span><span class="o">=</span><span class="mf">3.0</span><span class="p">),</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Vec3T</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mf">4.0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mf">5.0</span><span class="p">,</span> <span class="n">z</span><span class="o">=</span><span class="mf">6.0</span><span class="p">),</span>
|
|
<span class="p">]</span>
|
|
<span class="n">path</span> <span class="o">=</span> <span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">CreatePathVector</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="n">path_points</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Inventory.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">inventory</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">create_vector</span><span class="p">(</span><span class="o">&</span><span class="p">[</span><span class="mi">0</span><span class="k">u8</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">8</span><span class="p">,</span><span class="w"> </span><span class="mi">9</span><span class="p">]);</span>
|
|
|
|
<span class="c1">// Create the path vector of Vec3 objects.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Vec3</span><span class="p">::</span><span class="n">new</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0</span><span class="p">);</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Vec3</span><span class="p">::</span><span class="n">new</span><span class="p">(</span><span class="mf">4.0</span><span class="p">,</span><span class="w"> </span><span class="mf">5.0</span><span class="p">,</span><span class="w"> </span><span class="mf">6.0</span><span class="p">);</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">create_vector</span><span class="p">(</span><span class="o">&</span><span class="p">[</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">]);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// create inventory</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">inventory</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="n">Byte</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">8</span><span class="p">,</span><span class="w"> </span><span class="mi">9</span><span class="p">]</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">inventoryOffset</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">createVector</span><span class="p">(</span><span class="n">inventory</span><span class="p">)</span>
|
|
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">path</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">fbb</span><span class="p">.</span><span class="n">createVector</span><span class="p">(</span><span class="n">ofStructs</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
|
|
<span class="w"> </span><span class="n">Vec3</span><span class="p">(</span><span class="n">x</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">),</span>
|
|
<span class="w"> </span><span class="n">Vec3</span><span class="p">(</span><span class="n">x</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p">:</span><span class="w"> </span><span class="mi">6</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create a `vector` representing the inventory of the Orc. Each number</span>
|
|
<span class="c1">// could correspond to an item that can be claimed after he is slain.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">treasure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mf">0</span><span class="p">,</span><span class="w"> </span><span class="mf">1</span><span class="p">,</span><span class="w"> </span><span class="mf">2</span><span class="p">,</span><span class="w"> </span><span class="mf">3</span><span class="p">,</span><span class="w"> </span><span class="mf">4</span><span class="p">,</span><span class="w"> </span><span class="mf">5</span><span class="p">,</span><span class="w"> </span><span class="mf">6</span><span class="p">,</span><span class="w"> </span><span class="mf">7</span><span class="p">,</span><span class="w"> </span><span class="mf">8</span><span class="p">,</span><span class="w"> </span><span class="mf">9</span><span class="p">];</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">inv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">createInventoryVector</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">treasure</span><span class="p">);</span>
|
|
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">startPathVector</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">2</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Vec3</span><span class="p">.</span><span class="nx">createVec3</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Vec3</span><span class="p">.</span><span class="nx">createVec3</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">4.0</span><span class="p">,</span><span class="w"> </span><span class="mf">5.0</span><span class="p">,</span><span class="w"> </span><span class="mf">6.0</span><span class="p">);</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">endVector</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<h4 id="unions">Unions</h4>
|
|
<p>The last non-scalar data field for the <code>Monster</code> table is the <code>equipped</code> <code>union</code>
|
|
field. For this case, we will reuse an already serialized <code>Weapon</code> (the only
|
|
type in the union), without needing to reserialize it. Union fields implicitly
|
|
add a hidden <code>_type</code> field that stores the type of value stored in the union.
|
|
When serializing a union, you must explicitly set this type field, along with
|
|
providing the union value.</p>
|
|
<p>We will also serialize the other scalar data at the same time, since we have all
|
|
the necessary values and Offsets to make a <code>Monster</code>.</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="9:15"><input checked="checked" id="c_21" name="__tabbed_9" type="radio" /><input id="c_22" name="__tabbed_9" type="radio" /><input id="c_23" name="__tabbed_9" type="radio" /><input id="dart_7" name="__tabbed_9" type="radio" /><input id="go_7" name="__tabbed_9" type="radio" /><input id="java_7" name="__tabbed_9" type="radio" /><input id="javascript_7" name="__tabbed_9" type="radio" /><input id="kotlin_7" name="__tabbed_9" type="radio" /><input id="lobster_7" name="__tabbed_9" type="radio" /><input id="lua_7" name="__tabbed_9" type="radio" /><input id="php_7" name="__tabbed_9" type="radio" /><input id="python_7" name="__tabbed_9" type="radio" /><input id="rust_7" name="__tabbed_9" type="radio" /><input id="swift_7" name="__tabbed_9" type="radio" /><input id="typescript_7" name="__tabbed_9" type="radio" /><div class="tabbed-labels"><label for="c_21">C++</label><label for="c_22">C</label><label for="c_23">C#</label><label for="dart_7">Dart</label><label for="go_7">Go</label><label for="java_7">Java</label><label for="javascript_7">JavaScript</label><label for="kotlin_7">Kotlin</label><label for="lobster_7">Lobster</label><label for="lua_7">Lua</label><label for="php_7">PHP</label><label for="python_7">Python</label><label for="rust_7">Rust</label><label for="swift_7">Swift</label><label for="typescript_7">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create the remaining data needed for the Monster.</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">CreateString</span><span class="p">(</span><span class="s">"Orc"</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Create the position struct</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">position</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Vec3</span><span class="p">(</span><span class="mf">1.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0f</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Set his hit points to 300 and his mana to 150.</span>
|
|
<span class="kt">int</span><span class="w"> </span><span class="n">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">300</span><span class="p">;</span>
|
|
<span class="kt">int</span><span class="w"> </span><span class="n">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">150</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Finally, create the monster using the `CreateMonster` helper function</span>
|
|
<span class="c1">// to set all fields.</span>
|
|
<span class="c1">//</span>
|
|
<span class="c1">// Here we set the union field by using the `.Union()` method of the</span>
|
|
<span class="c1">// `Offset<Weapon>` axe we already serialized above. We just have to specify</span>
|
|
<span class="c1">// which type of object we put in the union, and do that with the</span>
|
|
<span class="c1">// auto-generated `Equipment_Weapon` enum.</span>
|
|
<span class="n">flatbuffers</span><span class="o">::</span><span class="n">Offset</span><span class="o"><</span><span class="n">Monster</span><span class="o">></span><span class="w"> </span><span class="n">orc</span><span class="w"> </span><span class="o">=</span>
|
|
<span class="w"> </span><span class="n">CreateMonster</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">position</span><span class="p">,</span><span class="w"> </span><span class="n">mana</span><span class="p">,</span><span class="w"> </span><span class="n">hp</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">inventory</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">Color_Red</span><span class="p">,</span><span class="w"> </span><span class="n">weapons</span><span class="p">,</span><span class="w"> </span><span class="n">Equipment_Weapon</span><span class="p">,</span><span class="w"> </span><span class="n">axe</span><span class="p">.</span><span class="n">Union</span><span class="p">(),</span>
|
|
<span class="w"> </span><span class="n">path</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Serialize a name for our monster, called "Orc".</span>
|
|
<span class="c1">// The _str suffix indicates the source is an ascii-z string.</span>
|
|
<span class="n">flatbuffers_string_ref_t</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">flatbuffers_string_create_str</span><span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="s">"Orc"</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Set his hit points to 300 and his mana to 150.</span>
|
|
<span class="kt">uint16_t</span><span class="w"> </span><span class="n">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">300</span><span class="p">;</span>
|
|
<span class="kt">uint16_t</span><span class="w"> </span><span class="n">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">150</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Define an equipment union. `create` calls in C has a single</span>
|
|
<span class="c1">// argument for unions where C++ has both a type and a data argument.</span>
|
|
<span class="n">ns</span><span class="p">(</span><span class="n">Equipment_union_ref_t</span><span class="p">)</span><span class="w"> </span><span class="n">equipped</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Equipment_as_Weapon</span><span class="p">(</span><span class="n">axe</span><span class="p">));</span>
|
|
<span class="n">ns</span><span class="p">(</span><span class="n">Vec3_t</span><span class="p">)</span><span class="w"> </span><span class="n">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mf">1.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0f</span><span class="w"> </span><span class="p">};</span>
|
|
<span class="n">ns</span><span class="p">(</span><span class="n">Monster_create_as_root</span><span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">pos</span><span class="p">,</span><span class="w"> </span><span class="n">mana</span><span class="p">,</span><span class="w"> </span><span class="n">hp</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">inventory</span><span class="p">,</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Color_Red</span><span class="p">),</span>
|
|
<span class="w"> </span><span class="n">weapons</span><span class="p">,</span><span class="w"> </span><span class="n">equipped</span><span class="p">,</span><span class="w"> </span><span class="n">path</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Create the remaining data needed for the Monster.</span>
|
|
<span class="kt">var</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">CreateString</span><span class="p">(</span><span class="s">"Orc"</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Create our monster using `StartMonster()` and `EndMonster()`.</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="n">StartMonster</span><span class="p">(</span><span class="n">builder</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="n">AddPos</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">Vec3</span><span class="p">.</span><span class="n">CreateVec3</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0f</span><span class="p">));</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="n">AddHp</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">short</span><span class="p">)</span><span class="mi">300</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="n">AddName</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="n">AddInventory</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">inv</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="n">AddColor</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">Color</span><span class="p">.</span><span class="n">Red</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="n">AddWeapons</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weapons</span><span class="p">);</span>
|
|
<span class="c1">// For union fields, we explicitly add the auto-generated enum for the type</span>
|
|
<span class="c1">// of value stored in the union.</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="n">AddEquippedType</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">Equipment</span><span class="p">.</span><span class="n">Weapon</span><span class="p">);</span>
|
|
<span class="c1">// And we just use the `.Value` property of the already serialized axe.</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="n">AddEquipped</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">axe</span><span class="p">.</span><span class="n">Value</span><span class="p">);</span><span class="w"> </span><span class="c1">// Axe</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="n">AddPath</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">path</span><span class="p">);</span>
|
|
<span class="n">Offset</span><span class="o"><</span><span class="n">Monster</span><span class="o">></span><span class="w"> </span><span class="n">orc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">.</span><span class="n">EndMonster</span><span class="p">(</span><span class="n">builder</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Serialize a name for our monster, called "Orc".</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">writeString</span><span class="p">(</span><span class="s1">'Orc'</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Using the Builder API:</span>
|
|
<span class="c1">// Set his hit points to 300 and his mana to 150.</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">300</span><span class="p">;</span>
|
|
<span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">150</span><span class="p">;</span>
|
|
|
|
<span class="kd">final</span><span class="w"> </span><span class="n">monster</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">myGame</span><span class="p">.</span><span class="n">MonsterBuilder</span><span class="p">(</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">begin</span><span class="p">()</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addNameOffset</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addInventoryOffset</span><span class="p">(</span><span class="n">inventory</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addWeaponsOffset</span><span class="p">(</span><span class="n">weapons</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addEquippedType</span><span class="p">(</span><span class="n">myGame</span><span class="p">.</span><span class="n">EquipmentTypeId</span><span class="p">.</span><span class="n">Weapon</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addEquippedOffset</span><span class="p">(</span><span class="n">axe</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addHp</span><span class="p">(</span><span class="n">hp</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addMana</span><span class="p">(</span><span class="n">mana</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addPos</span><span class="p">(</span><span class="n">vec3Builder</span><span class="p">.</span><span class="n">finish</span><span class="p">(</span><span class="m">1.0</span><span class="p">,</span><span class="w"> </span><span class="m">2.0</span><span class="p">,</span><span class="w"> </span><span class="m">3.0</span><span class="p">))</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addPathOffset</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="p">..</span><span class="n">addColor</span><span class="p">(</span><span class="n">myGame</span><span class="p">.</span><span class="n">Color</span><span class="p">.</span><span class="n">Red</span><span class="p">);</span>
|
|
|
|
<span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">orc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">finish</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Serialize a name for our monster, called "Orc".</span>
|
|
<span class="nx">name</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">CreateString</span><span class="p">(</span><span class="s">"Orc"</span><span class="p">)</span>
|
|
|
|
<span class="c1">// Create our monster using `MonsterStart()` and `MonsterEnd()`.</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterStart</span><span class="p">(</span><span class="nx">builder</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterAddPos</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">sample</span><span class="p">.</span><span class="nx">CreateVec3</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0</span><span class="p">))</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterAddHp</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">300</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterAddName</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">name</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterAddInventory</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">inv</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterAddColor</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">sample</span><span class="p">.</span><span class="nx">ColorRed</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterAddWeapons</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">weapons</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterAddEquippedType</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">sample</span><span class="p">.</span><span class="nx">EquipmentWeapon</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterAddEquipped</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">axe</span><span class="p">)</span>
|
|
<span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterAddPath</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">)</span>
|
|
<span class="nx">orc</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">sample</span><span class="p">.</span><span class="nx">MonsterEnd</span><span class="p">(</span><span class="nx">builder</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Serialize a name for our monster, called "Orc".</span>
|
|
<span class="kt">int</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="na">createString</span><span class="p">(</span><span class="s">"Orc"</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Create our monster using `startMonster()` and `endMonster()`.</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">startMonster</span><span class="p">(</span><span class="n">builder</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addPos</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">Vec3</span><span class="p">.</span><span class="na">createVec3</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0f</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0f</span><span class="p">));</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addName</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addColor</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">Color</span><span class="p">.</span><span class="na">Red</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addHp</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">short</span><span class="p">)</span><span class="mi">300</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addInventory</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">inv</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addWeapons</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weapons</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addEquippedType</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">Equipment</span><span class="p">.</span><span class="na">Weapon</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addEquipped</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">axe</span><span class="p">);</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addPath</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">path</span><span class="p">);</span>
|
|
<span class="kt">int</span><span class="w"> </span><span class="n">orc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">.</span><span class="na">endMonster</span><span class="p">(</span><span class="n">builder</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Serialize a name for our monster, called 'Orc'.</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">createString</span><span class="p">(</span><span class="s1">'Orc'</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Create our monster by using `startMonster()` and `endMonster()`.</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">startMonster</span><span class="p">(</span><span class="nx">builder</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addPos</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Vec3</span><span class="p">.</span><span class="nx">createVec3</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0</span><span class="p">));</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addHp</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">300</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addColor</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Color</span><span class="p">.</span><span class="nx">Red</span><span class="p">)</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addName</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">name</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addInventory</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">inv</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addWeapons</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">weapons</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addEquippedType</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Equipment</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addEquipped</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">axe</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addPath</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">);</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">orc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">endMonster</span><span class="p">(</span><span class="nx">builder</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Serialize a name for our monster, called "Orc".</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="na">createString</span><span class="p">(</span><span class="s">"Orc"</span><span class="p">)</span>
|
|
|
|
<span class="c1">// Create our monster using `startMonster()` and `endMonster()`.</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">startMonster</span><span class="p">(</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addPos</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">Vec3</span><span class="p">.</span><span class="na">createVec3</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="m">1.0f</span><span class="p">,</span><span class="w"> </span><span class="m">2.0f</span><span class="p">,</span><span class="w"> </span><span class="m">3.0f</span><span class="p">))</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addName</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">)</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addColor</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">Color</span><span class="p">.</span><span class="na">Red</span><span class="p">)</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addHp</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="m">300.</span><span class="n">toShort</span><span class="p">())</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addInventory</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">inv</span><span class="p">)</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addWeapons</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">weapons</span><span class="p">)</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addEquippedType</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">Equipment</span><span class="p">.</span><span class="na">Weapon</span><span class="p">)</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addEquipped</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">axe</span><span class="p">)</span>
|
|
<span class="n">Monster</span><span class="p">.</span><span class="na">addPath</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="n">path</span><span class="p">)</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">orc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">.</span><span class="na">endMonster</span><span class="p">(</span><span class="n">builder</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>// Name of the monster.
|
|
let name = builder.CreateString("Orc")
|
|
|
|
let orc = MyGame_Sample_MonsterBuilder { b }
|
|
.start()
|
|
.add_pos(b.MyGame_Sample_CreateVec3(1.0, 2.0, 3.0))
|
|
.add_hp(300)
|
|
.add_name(name)
|
|
.add_inventory(inv)
|
|
.add_color(MyGame_Sample_Color_Red)
|
|
.add_weapons(weapons)
|
|
.add_equipped_type(MyGame_Sample_Equipment_Weapon)
|
|
.add_equipped(weapon_offsets[1])
|
|
.add_path(path)
|
|
.end()
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">-- Serialize a name for our monster, called 'orc'</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">builder</span><span class="p">:</span><span class="nf">CreateString</span><span class="p">(</span><span class="s2">"Orc"</span><span class="p">)</span>
|
|
|
|
<span class="c1">-- Create our monster by using Start() andEnd()</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">Start</span><span class="p">(</span><span class="nv">builder</span><span class="p">)</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">AddPos</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="nv">vec3</span><span class="p">.</span><span class="nf">CreateVec3</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0</span><span class="p">))</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">AddHp</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="mi">300</span><span class="p">)</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">AddName</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="nv">name</span><span class="p">)</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">AddInventory</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="nv">inv</span><span class="p">)</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">AddColor</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="nv">color</span><span class="p">.</span><span class="py">Red</span><span class="p">)</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">AddWeapons</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="nv">weapons</span><span class="p">)</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">AddEquippedType</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="nv">equipment</span><span class="p">.</span><span class="py">Weapon</span><span class="p">)</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">AddEquipped</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="nv">axe</span><span class="p">)</span>
|
|
<span class="nv">monster</span><span class="p">.</span><span class="nf">AddPath</span><span class="p">(</span><span class="nv">builder</span><span class="p">,</span><span class="w"> </span><span class="nv">path</span><span class="p">)</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">orc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">monster</span><span class="p">.</span><span class="nf">End</span><span class="p">(</span><span class="nv">builder</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Serialize a name for our monster, called "Orc".</span>
|
|
<span class="nv">$name</span> <span class="o">=</span> <span class="nv">$builder</span><span class="o">-></span><span class="na">createString</span><span class="p">(</span><span class="s2">"Orc"</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Create our monster by using `StartMonster()` and `EndMonster()`.</span>
|
|
<span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">StartMonster</span><span class="p">(</span><span class="nv">$builder</span><span class="p">);</span>
|
|
<span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">AddPos</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span>
|
|
<span class="nx">\MyGame\Sample\Vec3</span><span class="o">::</span><span class="na">CreateVec3</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">,</span> <span class="mf">3.0</span><span class="p">));</span>
|
|
<span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">AddHp</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="mi">300</span><span class="p">);</span>
|
|
<span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">AddName</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="nv">$name</span><span class="p">);</span>
|
|
<span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">AddInventory</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="nv">$inv</span><span class="p">);</span>
|
|
<span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">AddColor</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="nx">\MyGame\Sample\Color</span><span class="o">::</span><span class="na">Red</span><span class="p">);</span>
|
|
<span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">AddWeapons</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="nv">$weapons</span><span class="p">);</span>
|
|
<span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">AddEquippedType</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span>
|
|
<span class="nx">\MyGame\Sample\Equipment</span><span class="o">::</span><span class="na">Weapon</span><span class="p">);</span>
|
|
<span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">AddEquipped</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="nv">$axe</span><span class="p">);</span>
|
|
<span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">AddPath</span><span class="p">(</span><span class="nv">$builder</span><span class="p">,</span> <span class="nv">$path</span><span class="p">);</span>
|
|
<span class="nv">$orc</span> <span class="o">=</span> <span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">EndMonster</span><span class="p">(</span><span class="nv">$builder</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1"># Serialize a name for our monster, called "Orc".</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="n">builder</span><span class="o">.</span><span class="n">CreateString</span><span class="p">(</span><span class="s2">"Orc"</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Create our monster by using `Monster.Start()` and `Monster.End()`.</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">Start</span><span class="p">(</span><span class="n">builder</span><span class="p">)</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">AddPos</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Vec3</span><span class="o">.</span><span class="n">CreateVec3</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">,</span> <span class="mf">3.0</span><span class="p">))</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">AddHp</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="mi">300</span><span class="p">)</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">AddName</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">AddInventory</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="n">inv</span><span class="p">)</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">AddColor</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Color</span><span class="o">.</span><span class="n">Color</span><span class="p">()</span><span class="o">.</span><span class="n">Red</span><span class="p">)</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">AddWeapons</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="n">weapons</span><span class="p">)</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">AddEquippedType</span><span class="p">(</span>
|
|
<span class="n">builder</span><span class="p">,</span> <span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Equipment</span><span class="o">.</span><span class="n">Equipment</span><span class="p">()</span><span class="o">.</span><span class="n">Weapon</span><span class="p">)</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">AddEquipped</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="n">axe</span><span class="p">)</span>
|
|
<span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">AddPath</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
|
|
<span class="n">orc</span> <span class="o">=</span> <span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">End</span><span class="p">(</span><span class="n">builder</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Name of the Monster.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">create_string</span><span class="p">(</span><span class="s">"Orc"</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Create the monster using the `Monster::create` helper function. This</span>
|
|
<span class="c1">// function accepts a `MonsterArgs` struct, which supplies all of the data</span>
|
|
<span class="c1">// needed to build a `Monster`. To supply empty/default fields, just use the</span>
|
|
<span class="c1">// Rust built-in `Default::default()` function, as demonstrated below.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">orc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">::</span><span class="n">create</span><span class="p">(</span><span class="o">&</span><span class="k">mut</span><span class="w"> </span><span class="n">builder</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">MonsterArgs</span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">pos</span><span class="p">:</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="o">&</span><span class="n">Vec3</span><span class="p">::</span><span class="n">new</span><span class="p">(</span><span class="mf">1.0</span><span class="k">f32</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="k">f32</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0</span><span class="k">f32</span><span class="p">)),</span>
|
|
<span class="w"> </span><span class="n">mana</span><span class="p">:</span><span class="w"> </span><span class="mi">150</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">hp</span><span class="p">:</span><span class="w"> </span><span class="mi">80</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">name</span><span class="p">:</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">name</span><span class="p">),</span>
|
|
<span class="w"> </span><span class="n">inventory</span><span class="p">:</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">inventory</span><span class="p">),</span>
|
|
<span class="w"> </span><span class="n">color</span><span class="p">:</span><span class="w"> </span><span class="nc">Color</span><span class="p">::</span><span class="n">Red</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">weapons</span><span class="p">:</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">weapons</span><span class="p">),</span>
|
|
<span class="w"> </span><span class="n">equipped_type</span><span class="p">:</span><span class="w"> </span><span class="nc">Equipment</span><span class="p">::</span><span class="n">Weapon</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">equipped</span><span class="p">:</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">axe</span><span class="p">.</span><span class="n">as_union_value</span><span class="p">()),</span>
|
|
<span class="w"> </span><span class="n">path</span><span class="p">:</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">path</span><span class="p">),</span>
|
|
<span class="w"> </span><span class="o">..</span><span class="nb">Default</span><span class="p">::</span><span class="n">default</span><span class="p">()</span>
|
|
<span class="p">});</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Name of the Monster.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">name</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="n">string</span><span class="p">:</span><span class="w"> </span><span class="s">"Orc"</span><span class="p">)</span>
|
|
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">orc</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">.</span><span class="n">createMonster</span><span class="p">(</span>
|
|
<span class="w"> </span><span class="p">&</span><span class="n">builder</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">pos</span><span class="p">:</span><span class="w"> </span><span class="n">MyGame_Sample_Vec3</span><span class="p">(</span><span class="n">x</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">),</span>
|
|
<span class="w"> </span><span class="n">hp</span><span class="p">:</span><span class="w"> </span><span class="mi">300</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">nameOffset</span><span class="p">:</span><span class="w"> </span><span class="n">name</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">inventoryVectorOffset</span><span class="p">:</span><span class="w"> </span><span class="n">inventoryOffset</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">color</span><span class="p">:</span><span class="w"> </span><span class="p">.</span><span class="n">red</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">weaponsVectorOffset</span><span class="p">:</span><span class="w"> </span><span class="n">weaponsOffset</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">equippedType</span><span class="p">:</span><span class="w"> </span><span class="p">.</span><span class="n">weapon</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">equippedOffset</span><span class="p">:</span><span class="w"> </span><span class="n">axe</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Serialize a name for our monster, called 'Orc'.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">createString</span><span class="p">(</span><span class="s1">'Orc'</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Create our monster by using `startMonster()` and `endMonster()`.</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">startMonster</span><span class="p">(</span><span class="nx">builder</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addPos</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Vec3</span><span class="p">.</span><span class="nx">createVec3</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0</span><span class="p">));</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addHp</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="mf">300</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addColor</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Color</span><span class="p">.</span><span class="nx">Red</span><span class="p">)</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addName</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">name</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addInventory</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">inv</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addWeapons</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">weapons</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addEquippedType</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Equipment</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addEquipped</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">axe</span><span class="p">);</span>
|
|
<span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">addPath</span><span class="p">(</span><span class="nx">builder</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">);</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">orc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">endMonster</span><span class="p">(</span><span class="nx">builder</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<h3 id="finishing">Finishing</h3>
|
|
<p>At this point, we have serialized a <code>Monster</code> we've named "orc" to the
|
|
flatbuffer and have its offset. The <code>root_type</code> of the schema is also a
|
|
<code>Monster</code>, so we have everything we need to finish the serialization step.</p>
|
|
<p>This is done by calling the appropriate <code>finish</code> method on the Builder, passing
|
|
in the orc offset to indicate this <code>table</code> is the "entry" point when
|
|
deserializing the buffer later.</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="10:15"><input checked="checked" id="c_24" name="__tabbed_10" type="radio" /><input id="c_25" name="__tabbed_10" type="radio" /><input id="c_26" name="__tabbed_10" type="radio" /><input id="dart_8" name="__tabbed_10" type="radio" /><input id="go_8" name="__tabbed_10" type="radio" /><input id="java_8" name="__tabbed_10" type="radio" /><input id="javascript_8" name="__tabbed_10" type="radio" /><input id="kotlin_8" name="__tabbed_10" type="radio" /><input id="lobster_8" name="__tabbed_10" type="radio" /><input id="lua_8" name="__tabbed_10" type="radio" /><input id="php_8" name="__tabbed_10" type="radio" /><input id="python_8" name="__tabbed_10" type="radio" /><input id="rust_8" name="__tabbed_10" type="radio" /><input id="swift_8" name="__tabbed_10" type="radio" /><input id="typescript_8" name="__tabbed_10" type="radio" /><div class="tabbed-labels"><label for="c_24">C++</label><label for="c_25">C</label><label for="c_26">C#</label><label for="dart_8">Dart</label><label for="go_8">Go</label><label for="java_8">Java</label><label for="javascript_8">JavaScript</label><label for="kotlin_8">Kotlin</label><label for="lobster_8">Lobster</label><label for="lua_8">Lua</label><label for="php_8">PHP</label><label for="python_8">Python</label><label for="rust_8">Rust</label><label for="swift_8">Swift</label><label for="typescript_8">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Call `Finish()` to instruct the builder that this monster is complete.</span>
|
|
<span class="c1">// You could also call `FinishMonsterBuffer(builder, orc);`</span>
|
|
<span class="n">builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">(</span><span class="n">orc</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Because we used `Monster_create_as_root`, we do not need a `finish` call</span>
|
|
<span class="c1">// in C.</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Call `Finish()` to instruct the builder that this monster is complete.</span>
|
|
<span class="c1">// You could also call `Monster.FinishMonsterBuffer(builder, orc);`</span>
|
|
<span class="n">builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">(</span><span class="n">orc</span><span class="p">.</span><span class="n">Value</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Call `finish()` to instruct the builder that this monster is complete.</span>
|
|
<span class="c1">// See the next code section, as in Dart `finish` will also return the byte</span>
|
|
<span class="c1">// array.</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Call `Finish()` to instruct the builder that this monster is complete.</span>
|
|
<span class="nx">builder</span><span class="p">.</span><span class="nx">Finish</span><span class="p">(</span><span class="nx">orc</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Call `finish()` to instruct the builder that this monster is complete.</span>
|
|
<span class="n">builder</span><span class="p">.</span><span class="na">finish</span><span class="p">(</span><span class="n">orc</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Call `finish()` to instruct the builder that this monster is complete.</span>
|
|
<span class="nx">builder</span><span class="p">.</span><span class="nx">finish</span><span class="p">(</span><span class="nx">orc</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Call `finish()` to instruct the builder that this monster is complete.</span>
|
|
<span class="n">builder</span><span class="p">.</span><span class="na">finish</span><span class="p">(</span><span class="n">orc</span><span class="p">)</span><span class="w"> </span><span class="p">;</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>// Call `Finish()` to instruct the builder that this monster is complete.
|
|
builder.Finish(orc)
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">-- Call 'Finish()' to instruct the builder that this monster is complete.</span>
|
|
<span class="nv">builder</span><span class="p">:</span><span class="nf">Finish</span><span class="p">(</span><span class="nv">orc</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Call `finish()` to instruct the builder that this monster is complete.</span>
|
|
<span class="nv">$builder</span><span class="o">-></span><span class="na">finish</span><span class="p">(</span><span class="nv">$orc</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1"># Call `Finish()` to instruct the builder that this monster is complete.</span>
|
|
<span class="n">builder</span><span class="o">.</span><span class="n">Finish</span><span class="p">(</span><span class="n">orc</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Call `finish()` to instruct the builder that this monster is complete.</span>
|
|
<span class="n">builder</span><span class="p">.</span><span class="n">finish</span><span class="p">(</span><span class="n">orc</span><span class="p">,</span><span class="w"> </span><span class="nb">None</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Call `finish()` to instruct the builder that this monster is complete.</span>
|
|
<span class="n">builder</span><span class="p">.</span><span class="n">finish</span><span class="p">(</span><span class="n">offset</span><span class="p">:</span><span class="w"> </span><span class="n">orc</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Call `finish()` to instruct the builder that this monster is complete.</span>
|
|
<span class="nx">builder</span><span class="p">.</span><span class="nx">finish</span><span class="p">(</span><span class="nx">orc</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>Once you finish a Builder, you can no longer serialize more data to it.</p>
|
|
<h4 id="buffer-access">Buffer Access</h4>
|
|
<p>The flatbuffer is now ready to be stored somewhere, sent over the network,
|
|
compressed, or whatever you would like to do with it. You access the raw buffer
|
|
like so:</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="11:15"><input checked="checked" id="c_27" name="__tabbed_11" type="radio" /><input id="c_28" name="__tabbed_11" type="radio" /><input id="c_29" name="__tabbed_11" type="radio" /><input id="dart_9" name="__tabbed_11" type="radio" /><input id="go_9" name="__tabbed_11" type="radio" /><input id="java_9" name="__tabbed_11" type="radio" /><input id="javascript_9" name="__tabbed_11" type="radio" /><input id="kotlin_9" name="__tabbed_11" type="radio" /><input id="lobster_9" name="__tabbed_11" type="radio" /><input id="lua_9" name="__tabbed_11" type="radio" /><input id="php_9" name="__tabbed_11" type="radio" /><input id="python_9" name="__tabbed_11" type="radio" /><input id="rust_9" name="__tabbed_11" type="radio" /><input id="swift_9" name="__tabbed_11" type="radio" /><input id="typescript_9" name="__tabbed_11" type="radio" /><div class="tabbed-labels"><label for="c_27">C++</label><label for="c_28">C</label><label for="c_29">C#</label><label for="dart_9">Dart</label><label for="go_9">Go</label><label for="java_9">Java</label><label for="javascript_9">JavaScript</label><label for="kotlin_9">Kotlin</label><label for="lobster_9">Lobster</label><label for="lua_9">Lua</label><label for="php_9">PHP</label><label for="python_9">Python</label><label for="rust_9">Rust</label><label for="swift_9">Swift</label><label for="typescript_9">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// This must be called after `Finish()`.</span>
|
|
<span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">GetBufferPointer</span><span class="p">();</span>
|
|
|
|
<span class="c1">// Returns the size of the buffer that `GetBufferPointer()` points to.</span>
|
|
<span class="kt">int</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">GetSize</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">buf</span><span class="p">;</span>
|
|
<span class="kt">size_t</span><span class="w"> </span><span class="n">size</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Allocate and extract a readable buffer from internal builder heap.</span>
|
|
<span class="c1">// The returned buffer must be deallocated using `free`.</span>
|
|
<span class="c1">// NOTE: Finalizing the buffer does NOT change the builder, it</span>
|
|
<span class="c1">// just creates a snapshot of the builder content.</span>
|
|
<span class="n">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">flatcc_builder_finalize_buffer</span><span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">size</span><span class="p">);</span>
|
|
<span class="c1">// use buf</span>
|
|
<span class="n">free</span><span class="p">(</span><span class="n">buf</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Optionally reset builder to reuse builder without deallocating</span>
|
|
<span class="c1">// internal stack and heap.</span>
|
|
<span class="n">flatcc_builder_reset</span><span class="p">(</span><span class="n">B</span><span class="p">);</span>
|
|
<span class="c1">// build next buffer.</span>
|
|
<span class="c1">// ...</span>
|
|
|
|
<span class="c1">// Cleanup.</span>
|
|
<span class="n">flatcc_builder_clear</span><span class="p">(</span><span class="n">B</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// This must be called after `Finish()`.</span>
|
|
<span class="c1">//</span>
|
|
<span class="c1">// The data in this ByteBuffer does NOT start at 0, but at buf.Position.</span>
|
|
<span class="c1">// The end of the data is marked by buf.Length, so the size is</span>
|
|
<span class="c1">// buf.Length - buf.Position.</span>
|
|
<span class="n">FlatBuffers</span><span class="p">.</span><span class="n">ByteBuffer</span><span class="w"> </span><span class="n">dataBuffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">DataBuffer</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Alternatively this copies the above data out of the ByteBuffer for you:</span>
|
|
<span class="kt">byte</span><span class="p">[]</span><span class="w"> </span><span class="n">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">SizedByteArray</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">final</span><span class="w"> </span><span class="n">Uint8List</span><span class="w"> </span><span class="n">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">finish</span><span class="p">(</span><span class="n">orc</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// This must be called after `Finish()`.</span>
|
|
<span class="nx">buf</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">FinishedBytes</span><span class="p">()</span><span class="w"> </span><span class="c1">// Of type `byte[]`.</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// This must be called after `finish()`.</span>
|
|
<span class="n">java</span><span class="p">.</span><span class="na">nio</span><span class="p">.</span><span class="na">ByteBuffer</span><span class="w"> </span><span class="n">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="na">dataBuffer</span><span class="p">();</span>
|
|
<span class="c1">// The data in this ByteBuffer does NOT start at 0, but at buf.position().</span>
|
|
<span class="c1">// The number of bytes is buf.remaining().</span>
|
|
|
|
<span class="c1">// Alternatively this copies the above data out of the ByteBuffer for you:</span>
|
|
<span class="kt">byte</span><span class="o">[]</span><span class="w"> </span><span class="n">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="na">sizedByteArray</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// This must be called after `finish()`.</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">asUint8Array</span><span class="p">();</span><span class="w"> </span><span class="c1">// Of type `Uint8Array`.</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// This must be called after `finish()`.</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="na">dataBuffer</span><span class="p">()</span>
|
|
<span class="c1">// The data in this ByteBuffer does NOT start at 0, but at buf.position().</span>
|
|
<span class="c1">// The number of bytes is buf.remaining().</span>
|
|
|
|
<span class="c1">// Alternatively this copies the above data out of the ByteBuffer for you:</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="na">sizedByteArray</span><span class="p">()</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>// This must be called after `Finish()`.
|
|
let buf = builder.SizedCopy() // Of type `string`.
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">local</span><span class="w"> </span><span class="nv">bufAsString</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">builder</span><span class="p">:</span><span class="nf">Output</span><span class="p">()</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// This must be called after `finish()`.</span>
|
|
<span class="nv">$buf</span> <span class="o">=</span> <span class="nv">$builder</span><span class="o">-></span><span class="na">dataBuffer</span><span class="p">();</span> <span class="c1">// Of type `Google\FlatBuffers\ByteBuffer`</span>
|
|
<span class="c1">// The data in this ByteBuffer does NOT start at 0, but at</span>
|
|
<span class="c1">// buf->getPosition().</span>
|
|
<span class="c1">// The end of the data is marked by buf->capacity(), so the size is</span>
|
|
<span class="c1">// buf->capacity() - buf->getPosition().</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1"># This must be called after `Finish()`.</span>
|
|
<span class="n">buf</span> <span class="o">=</span> <span class="n">builder</span><span class="o">.</span><span class="n">Output</span><span class="p">()</span> <span class="o">//</span> <span class="n">Of</span> <span class="nb">type</span> <span class="err">`</span><span class="nb">bytearray</span><span class="err">`</span><span class="o">.</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// This must be called after `finish()`.</span>
|
|
<span class="c1">// `finished_data` returns a byte slice.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">finished_data</span><span class="p">();</span><span class="w"> </span><span class="c1">// Of type `&[u8]`</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// This must be called after `finish()`.</span>
|
|
<span class="c1">// `sizedByteArray` returns the finished buf of type [UInt8].</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">buf</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">sizedByteArray</span>
|
|
<span class="c1">// or you can use to get an object of type Data</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">bufData</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">ByteBuffer</span><span class="p">(</span><span class="n">data</span><span class="p">:</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">data</span><span class="p">)</span>
|
|
<span class="c1">// or</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">buf</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">sizedBuffer</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// This must be called after `finish()`.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">asUint8Array</span><span class="p">();</span><span class="w"> </span><span class="c1">// Of type `Uint8Array`.</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>Now you can write the bytes to a file or send them over the network. The buffer
|
|
stays valid until the Builder is cleared or destroyed.</p>
|
|
<p>Make sure your file mode (or transfer protocol) is set to BINARY, and not TEXT.
|
|
If you try to transfer a flatbuffer in TEXT mode, the buffer will be corrupted
|
|
and be hard to diagnose.</p>
|
|
<h2 id="deserialization">Deserialization</h2>
|
|
<p>Deserialization is a bit of a misnomer, since FlatBuffers doesn't deserialize
|
|
the whole buffer when accessed. It just "decodes" the data that is requested,
|
|
leaving all the other data untouched. It is up to the application to decide if
|
|
the data is copied out or even read in the first place. However, we continue to
|
|
use the word <code>deserialize</code> to mean accessing data from a binary flatbuffer.</p>
|
|
<p>Now that we have successfully create an orc FlatBuffer, the data can be saved,
|
|
sent over a network, etc. At some point, the buffer will be accessed to obtain
|
|
the underlying data.</p>
|
|
<p>The same application setup used for serialization is needed for deserialization
|
|
(see <a href="#application-integration">application integration</a>).</p>
|
|
<h3 id="root-access">Root Access</h3>
|
|
<p>All access to the data in the flatbuffer must first go through the root object.
|
|
There is only one root object per flatbuffer. The generated code provides
|
|
functions to get the root object given the buffer.</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="12:15"><input checked="checked" id="c_30" name="__tabbed_12" type="radio" /><input id="c_31" name="__tabbed_12" type="radio" /><input id="c_32" name="__tabbed_12" type="radio" /><input id="dart_10" name="__tabbed_12" type="radio" /><input id="go_10" name="__tabbed_12" type="radio" /><input id="java_10" name="__tabbed_12" type="radio" /><input id="javascript_10" name="__tabbed_12" type="radio" /><input id="kotlin_10" name="__tabbed_12" type="radio" /><input id="lobster_10" name="__tabbed_12" type="radio" /><input id="lua_10" name="__tabbed_12" type="radio" /><input id="php_10" name="__tabbed_12" type="radio" /><input id="python_10" name="__tabbed_12" type="radio" /><input id="rust_10" name="__tabbed_12" type="radio" /><input id="swift_10" name="__tabbed_12" type="radio" /><input id="typescript_10" name="__tabbed_12" type="radio" /><div class="tabbed-labels"><label for="c_30">C++</label><label for="c_31">C</label><label for="c_32">C#</label><label for="dart_10">Dart</label><label for="go_10">Go</label><label for="java_10">Java</label><label for="javascript_10">JavaScript</label><label for="kotlin_10">Kotlin</label><label for="lobster_10">Lobster</label><label for="lua_10">Lua</label><label for="php_10">PHP</label><label for="python_10">Python</label><label for="rust_10">Rust</label><label for="swift_10">Swift</label><label for="typescript_10">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">buffer_pointer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="cm">/* the data you just read */</span><span class="p">;</span>
|
|
|
|
<span class="c1">// Get a view to the root object inside the buffer.</span>
|
|
<span class="n">Monster</span><span class="w"> </span><span class="n">monster</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GetMonster</span><span class="p">(</span><span class="n">buffer_pointer</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Note that we use the `table_t` suffix when reading a table object</span>
|
|
<span class="c1">// as opposed to the `ref_t` suffix used during the construction of</span>
|
|
<span class="c1">// the buffer.</span>
|
|
<span class="n">ns</span><span class="p">(</span><span class="n">Monster_table_t</span><span class="p">)</span><span class="w"> </span><span class="n">monster</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Monster_as_root</span><span class="p">(</span><span class="n">buffer</span><span class="p">));</span>
|
|
|
|
<span class="c1">// Note: root object pointers are NOT the same as the `buffer` pointer.</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">byte</span><span class="p">[]</span><span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="cm">/* the data you just read */</span>
|
|
|
|
<span class="c1">// Get a view to the root object inside the buffer.</span>
|
|
<span class="n">Monster</span><span class="w"> </span><span class="n">monster</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">.</span><span class="n">GetRootAsMonster</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">ByteBuffer</span><span class="p">(</span><span class="n">bytes</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">List</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="c1">// the data, e.g. from file or network</span>
|
|
<span class="c1">// A generated factory constructor that will read the data.</span>
|
|
<span class="n">myGame</span><span class="p">.</span><span class="n">Monster</span><span class="w"> </span><span class="n">monster</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">myGame</span><span class="p">.</span><span class="n">Monster</span><span class="p">(</span><span class="n">data</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">var</span><span class="w"> </span><span class="nx">buf</span><span class="w"> </span><span class="p">[]</span><span class="kt">byte</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="cm">/* the data you just read */</span>
|
|
|
|
<span class="c1">// Get an accessor to the root object inside the buffer.</span>
|
|
<span class="nx">monster</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">sample</span><span class="p">.</span><span class="nx">GetRootAsMonster</span><span class="p">(</span><span class="nx">buf</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
|
|
|
|
<span class="c1">// Note: We use `0` for the offset here, which is typical for most buffers</span>
|
|
<span class="c1">// you would read. If you wanted to read from `builder.Bytes` directly, you</span>
|
|
<span class="c1">// would need to pass in the offset of `builder.Head()`, as the builder</span>
|
|
<span class="c1">// constructs the buffer backwards, so may not start at offset 0.</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">byte</span><span class="o">[]</span><span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="cm">/* the data you just read */</span>
|
|
<span class="n">java</span><span class="p">.</span><span class="na">nio</span><span class="p">.</span><span class="na">ByteBuffer</span><span class="w"> </span><span class="n">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">java</span><span class="p">.</span><span class="na">nio</span><span class="p">.</span><span class="na">ByteBuffer</span><span class="p">.</span><span class="na">wrap</span><span class="p">(</span><span class="n">bytes</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Get an accessor to the root object inside the buffer.</span>
|
|
<span class="n">Monster</span><span class="w"> </span><span class="n">monster</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">.</span><span class="na">getRootAsMonster</span><span class="p">(</span><span class="n">buf</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// the data you just read, as a `Uint8Array`</span>
|
|
<span class="c1">// Note that the example here uses `readFileSync` from the built-in `fs`</span>
|
|
<span class="c1">// module, but other methods for accessing the file contents will also work.</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">bytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nb">Uint8Array</span><span class="p">(</span><span class="nx">readFileSync</span><span class="p">(</span><span class="s1">'./monsterdata.bin'</span><span class="p">));</span>
|
|
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">flatbuffers</span><span class="p">.</span><span class="nx">ByteBuffer</span><span class="p">(</span><span class="nx">bytes</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Get an accessor to the root object inside the buffer.</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">monster</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">getRootAsMonster</span><span class="p">(</span><span class="nx">buf</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">val</span><span class="w"> </span><span class="nv">bytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="cm">/* the data you just read */</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">java</span><span class="p">.</span><span class="na">nio</span><span class="p">.</span><span class="na">ByteBuffer</span><span class="p">.</span><span class="na">wrap</span><span class="p">(</span><span class="n">bytes</span><span class="p">)</span>
|
|
|
|
<span class="c1">// Get an accessor to the root object inside the buffer.</span>
|
|
<span class="n">Monster</span><span class="w"> </span><span class="n">monster</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Monster</span><span class="p">.</span><span class="na">getRootAsMonster</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>buf = /* the data you just read, in a string */
|
|
|
|
// Get an accessor to the root object inside the buffer.
|
|
let monster = MyGame_Sample_GetRootAsMonster(buf)
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">local</span><span class="w"> </span><span class="nv">bufAsString</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="c1">-- The data you just read in</span>
|
|
|
|
<span class="c1">-- Convert the string representation into binary array Lua structure</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">flatbuffers</span><span class="p">.</span><span class="py">binaryArray</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="nv">bufAsString</span><span class="p">)</span>
|
|
|
|
<span class="c1">-- Get an accessor to the root object insert the buffer</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">mon</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">monster</span><span class="p">.</span><span class="nf">GetRootAsMonster</span><span class="p">(</span><span class="nv">buf</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nv">$bytes</span> <span class="o">=</span> <span class="cm">/* the data you just read, in a string */</span>
|
|
<span class="nv">$buf</span> <span class="o">=</span> <span class="nx">Google\FlatBuffers\ByteBuffer</span><span class="o">::</span><span class="na">wrap</span><span class="p">(</span><span class="nv">$bytes</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Get an accessor to the root object inside the buffer.</span>
|
|
<span class="nv">$monster</span> <span class="o">=</span> <span class="nx">\MyGame\Sample\Monster</span><span class="o">::</span><span class="na">GetRootAsMonster</span><span class="p">(</span><span class="nv">$buf</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">buf</span> <span class="o">=</span> <span class="o">/*</span> <span class="n">the</span> <span class="n">data</span> <span class="n">you</span> <span class="n">just</span> <span class="n">read</span><span class="p">,</span> <span class="ow">in</span> <span class="n">an</span> <span class="nb">object</span> <span class="n">of</span> <span class="nb">type</span> <span class="s2">"bytearray"</span> <span class="o">*/</span>
|
|
|
|
<span class="c1"># Get an accessor to the root object inside the buffer.</span>
|
|
<span class="n">monster</span> <span class="o">=</span> <span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">Monster</span><span class="o">.</span><span class="n">GetRootAs</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Note: We use `0` for the offset here, which is typical for most buffers</span>
|
|
<span class="c1"># you would read. If you wanted to read from the `builder.Bytes` directly,</span>
|
|
<span class="c1"># you would need to pass in the offset of `builder.Head()`, as the builder</span>
|
|
<span class="c1"># constructs the buffer backwards, so may not start at offset 0.</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">let</span><span class="w"> </span><span class="n">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="cm">/* the data you just read, in a &[u8] */</span>
|
|
|
|
<span class="c1">// Get an accessor to the root object inside the buffer.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">monster</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">root_as_monster</span><span class="p">(</span><span class="n">buf</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// create a ByteBuffer(:) from an [UInt8] or Data()</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nv">buf</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="c1">// Get your data</span>
|
|
<span class="c1">// Get an accessor to the root object inside the buffer.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">monster</span><span class="p">:</span><span class="w"> </span><span class="n">Monster</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">try</span><span class="p">!</span><span class="w"> </span><span class="n">getCheckedRoot</span><span class="p">(</span><span class="n">byteBuffer</span><span class="p">:</span><span class="w"> </span><span class="p">&</span><span class="n">byteBuffer</span><span class="p">)</span>
|
|
<span class="c1">// let monster: Monster = getRoot(byteBuffer: &byteBuffer)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// the data you just read, as a `Uint8Array`.</span>
|
|
<span class="c1">// Note that the example here uses `readFileSync` from the built-in `fs`</span>
|
|
<span class="c1">// module, but other methods for accessing the file contents will also work.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">bytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nb">Uint8Array</span><span class="p">(</span><span class="nx">readFileSync</span><span class="p">(</span><span class="s1">'./monsterdata.bin'</span><span class="p">));</span>
|
|
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">flatbuffers</span><span class="p">.</span><span class="nx">ByteBuffer</span><span class="p">(</span><span class="nx">bytes</span><span class="p">);</span>
|
|
|
|
<span class="c1">// Get an accessor to the root object inside the buffer.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">monster</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Monster</span><span class="p">.</span><span class="nx">getRootAsMonster</span><span class="p">(</span><span class="nx">buf</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>Again, make sure you read the bytes in BINARY mode, otherwise the buffer may be
|
|
corrupted.</p>
|
|
<p>In most languages, the returned object is just a "view" of the data with helpful
|
|
accessors. Data is typically not copied out of the backing buffer. This also
|
|
means the backing buffer must remain alive for the duration of the views.</p>
|
|
<h3 id="table-access">Table Access</h3>
|
|
<p>If you look in the generated files emitted by <code>flatc</code>, you will see it generated
|
|
, for each <code>table</code>, accessors of all its non-<code>deprecated</code> fields. For example,
|
|
some of the accessors of the <code>Monster</code> root table would look like:</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="13:15"><input checked="checked" id="c_33" name="__tabbed_13" type="radio" /><input id="c_34" name="__tabbed_13" type="radio" /><input id="c_35" name="__tabbed_13" type="radio" /><input id="dart_11" name="__tabbed_13" type="radio" /><input id="go_11" name="__tabbed_13" type="radio" /><input id="java_11" name="__tabbed_13" type="radio" /><input id="javascript_11" name="__tabbed_13" type="radio" /><input id="kotlin_11" name="__tabbed_13" type="radio" /><input id="lobster_11" name="__tabbed_13" type="radio" /><input id="lua_11" name="__tabbed_13" type="radio" /><input id="php_11" name="__tabbed_13" type="radio" /><input id="python_11" name="__tabbed_13" type="radio" /><input id="rust_11" name="__tabbed_13" type="radio" /><input id="swift_11" name="__tabbed_13" type="radio" /><input id="typescript_11" name="__tabbed_13" type="radio" /><div class="tabbed-labels"><label for="c_33">C++</label><label for="c_34">C</label><label for="c_35">C#</label><label for="dart_11">Dart</label><label for="go_11">Go</label><label for="java_11">Java</label><label for="javascript_11">JavaScript</label><label for="kotlin_11">Kotlin</label><label for="lobster_11">Lobster</label><label for="lua_11">Lua</label><label for="php_11">PHP</label><label for="python_11">Python</label><label for="rust_11">Rust</label><label for="swift_11">Swift</label><label for="typescript_11">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="k">auto</span><span class="w"> </span><span class="n">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="o">-></span><span class="n">hp</span><span class="p">();</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="o">-></span><span class="n">mana</span><span class="p">();</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="o">-></span><span class="n">name</span><span class="p">()</span><span class="o">-></span><span class="n">c_str</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">uint16_t</span><span class="w"> </span><span class="n">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Monster_hp</span><span class="p">(</span><span class="n">monster</span><span class="p">));</span>
|
|
<span class="kt">uint16_t</span><span class="w"> </span><span class="n">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Monster_mana</span><span class="p">(</span><span class="n">monster</span><span class="p">));</span>
|
|
<span class="n">flatbuffers_string_t</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Monster_name</span><span class="p">(</span><span class="n">monster</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// For C#, unlike most other languages support by FlatBuffers, most values</span>
|
|
<span class="c1">// (except for vectors and unions) are available as properties instead of</span>
|
|
<span class="c1">// accessor methods.</span>
|
|
<span class="kt">var</span><span class="w"> </span><span class="n">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">Hp</span><span class="p">;</span>
|
|
<span class="kt">var</span><span class="w"> </span><span class="n">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">Mana</span><span class="p">;</span>
|
|
<span class="kt">var</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">Name</span><span class="p">;</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// For Dart, unlike other languages support by FlatBuffers, most values</span>
|
|
<span class="c1">// are available as properties instead of accessor methods.</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="n">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">hp</span><span class="p">;</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="n">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">mana</span><span class="p">;</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">name</span><span class="p">;</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nx">hp</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">Hp</span><span class="p">()</span>
|
|
<span class="nx">mana</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">Mana</span><span class="p">()</span>
|
|
<span class="nx">name</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">string</span><span class="p">(</span><span class="nx">monster</span><span class="p">.</span><span class="nx">Name</span><span class="p">())</span><span class="w"> </span><span class="c1">// Note: `monster.Name()` returns a byte[].</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">short</span><span class="w"> </span><span class="n">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">hp</span><span class="p">();</span>
|
|
<span class="kt">short</span><span class="w"> </span><span class="n">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">mana</span><span class="p">();</span>
|
|
<span class="n">String</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">name</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">var</span><span class="w"> </span><span class="nx">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">hp</span><span class="p">();</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">mana</span><span class="p">();</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">name</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">val</span><span class="w"> </span><span class="nv">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">hp</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">mana</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">name</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>let hp = monster.hp
|
|
let mana = monster.mana
|
|
let name = monster.name
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">local</span><span class="w"> </span><span class="nv">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">mon</span><span class="p">:</span><span class="nf">Hp</span><span class="p">()</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">mon</span><span class="p">:</span><span class="nf">Mana</span><span class="p">()</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">mon</span><span class="p">:</span><span class="nf">Name</span><span class="p">()</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nv">$hp</span> <span class="o">=</span> <span class="nv">$monster</span><span class="o">-></span><span class="na">getHp</span><span class="p">();</span>
|
|
<span class="nv">$mana</span> <span class="o">=</span> <span class="nv">$monster</span><span class="o">-></span><span class="na">getMana</span><span class="p">();</span>
|
|
<span class="nv">$name</span> <span class="o">=</span> <span class="nx">monster</span><span class="o">-></span><span class="na">getName</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">hp</span> <span class="o">=</span> <span class="n">monster</span><span class="o">.</span><span class="n">Hp</span><span class="p">()</span>
|
|
<span class="n">mana</span> <span class="o">=</span> <span class="n">monster</span><span class="o">.</span><span class="n">Mana</span><span class="p">()</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="n">monster</span><span class="o">.</span><span class="n">Name</span><span class="p">()</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Get and test some scalar types from the FlatBuffer.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">hp</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">mana</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">name</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">let</span><span class="w"> </span><span class="nv">hp</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">hp</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">mana</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">mana</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">name</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">name</span><span class="w"> </span><span class="c1">// returns an optional string</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">let</span><span class="w"> </span><span class="nx">hp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">hp</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">mana</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">mana</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">name</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>These accessors should hold the values <code>300</code>, <code>150</code>, and <code>"Orc"</code> respectively.</p>
|
|
<p>The default value of <code>150</code> wasn't stored in the <code>mana</code> field, but we are still
|
|
able to retrieve it. That is because the generated accessors return a hard-coded
|
|
default value when it doesn't find the value in the buffer.</p>
|
|
<h4 id="nested-object-access">Nested Object Access</h4>
|
|
<p>Accessing nested objects is very similar, with the nested field pointing to
|
|
another object type. Be careful, the field could be <code>null</code> if not present.</p>
|
|
<p>For example, accessing the <code>pos</code> <code>struct</code>, which is type <code>Vec3</code> you would do:</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="14:15"><input checked="checked" id="c_36" name="__tabbed_14" type="radio" /><input id="c_37" name="__tabbed_14" type="radio" /><input id="c_38" name="__tabbed_14" type="radio" /><input id="dart_12" name="__tabbed_14" type="radio" /><input id="go_12" name="__tabbed_14" type="radio" /><input id="java_12" name="__tabbed_14" type="radio" /><input id="javascript_12" name="__tabbed_14" type="radio" /><input id="kotlin_12" name="__tabbed_14" type="radio" /><input id="lobster_12" name="__tabbed_14" type="radio" /><input id="lua_12" name="__tabbed_14" type="radio" /><input id="php_12" name="__tabbed_14" type="radio" /><input id="python_12" name="__tabbed_14" type="radio" /><input id="rust_12" name="__tabbed_14" type="radio" /><input id="swift_12" name="__tabbed_14" type="radio" /><input id="typescript_12" name="__tabbed_14" type="radio" /><div class="tabbed-labels"><label for="c_36">C++</label><label for="c_37">C</label><label for="c_38">C#</label><label for="dart_12">Dart</label><label for="go_12">Go</label><label for="java_12">Java</label><label for="javascript_12">JavaScript</label><label for="kotlin_12">Kotlin</label><label for="lobster_12">Lobster</label><label for="lua_12">Lua</label><label for="php_12">PHP</label><label for="python_12">Python</label><label for="rust_12">Rust</label><label for="swift_12">Swift</label><label for="typescript_12">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="k">auto</span><span class="w"> </span><span class="n">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="o">-></span><span class="n">pos</span><span class="p">();</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="o">-></span><span class="n">x</span><span class="p">();</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="o">-></span><span class="n">y</span><span class="p">();</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="o">-></span><span class="n">z</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">ns</span><span class="p">(</span><span class="n">Vec3_struct_t</span><span class="p">)</span><span class="w"> </span><span class="n">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Monster_pos</span><span class="p">(</span><span class="n">monster</span><span class="p">));</span>
|
|
<span class="kt">float</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Vec3_x</span><span class="p">(</span><span class="n">pos</span><span class="p">));</span>
|
|
<span class="kt">float</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Vec3_y</span><span class="p">(</span><span class="n">pos</span><span class="p">));</span>
|
|
<span class="kt">float</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Vec3_z</span><span class="p">(</span><span class="n">pos</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">var</span><span class="w"> </span><span class="n">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">Pos</span><span class="p">.</span><span class="n">Value</span><span class="p">;</span>
|
|
<span class="kt">var</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="n">X</span><span class="p">;</span>
|
|
<span class="kt">var</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="n">Y</span><span class="p">;</span>
|
|
<span class="kt">var</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="n">Z</span><span class="p">;</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">myGame</span><span class="p">.</span><span class="n">Vec3</span><span class="w"> </span><span class="n">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">pos</span><span class="p">;</span>
|
|
<span class="kt">double</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="n">x</span><span class="p">;</span>
|
|
<span class="kt">double</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="n">y</span><span class="p">;</span>
|
|
<span class="kt">double</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="n">z</span><span class="p">;</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nx">pos</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">Pos</span><span class="p">(</span><span class="kc">nil</span><span class="p">)</span>
|
|
<span class="nx">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">pos</span><span class="p">.</span><span class="nx">X</span><span class="p">()</span>
|
|
<span class="nx">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">pos</span><span class="p">.</span><span class="nx">Y</span><span class="p">()</span>
|
|
<span class="nx">z</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">pos</span><span class="p">.</span><span class="nx">Z</span><span class="p">()</span>
|
|
|
|
<span class="c1">// Note: Whenever you access a new object, like in `Pos()`, a new temporary</span>
|
|
<span class="c1">// accessor object gets created. If your code is very performance sensitive,</span>
|
|
<span class="c1">// you can pass in a pointer to an existing `Vec3` instead of `nil`. This</span>
|
|
<span class="c1">// allows you to reuse it across many calls to reduce the amount of object</span>
|
|
<span class="c1">// allocation/garbage collection.</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">Vec3</span><span class="w"> </span><span class="n">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">pos</span><span class="p">();</span>
|
|
<span class="kt">float</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="na">x</span><span class="p">();</span>
|
|
<span class="kt">float</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="na">y</span><span class="p">();</span>
|
|
<span class="kt">float</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="na">z</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">var</span><span class="w"> </span><span class="nx">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">pos</span><span class="p">();</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">pos</span><span class="p">.</span><span class="nx">x</span><span class="p">();</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">pos</span><span class="p">.</span><span class="nx">y</span><span class="p">();</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">pos</span><span class="p">.</span><span class="nx">z</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">val</span><span class="w"> </span><span class="nv">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">pos</span><span class="o">!!</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="na">x</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="na">y</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="na">z</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>let pos = monster.pos
|
|
let x = pos.x
|
|
let y = pos.y
|
|
let z = pos.z
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">local</span><span class="w"> </span><span class="nv">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">mon</span><span class="p">:</span><span class="nf">Pos</span><span class="p">()</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">pos</span><span class="p">:</span><span class="nf">X</span><span class="p">()</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">pos</span><span class="p">:</span><span class="nf">Y</span><span class="p">()</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">pos</span><span class="p">:</span><span class="nf">Z</span><span class="p">()</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nv">$pos</span> <span class="o">=</span> <span class="nv">$monster</span><span class="o">-></span><span class="na">getPos</span><span class="p">();</span>
|
|
<span class="nv">$x</span> <span class="o">=</span> <span class="nv">$pos</span><span class="o">-></span><span class="na">getX</span><span class="p">();</span>
|
|
<span class="nv">$y</span> <span class="o">=</span> <span class="nv">$pos</span><span class="o">-></span><span class="na">getY</span><span class="p">();</span>
|
|
<span class="nv">$z</span> <span class="o">=</span> <span class="nv">$pos</span><span class="o">-></span><span class="na">getZ</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">pos</span> <span class="o">=</span> <span class="n">monster</span><span class="o">.</span><span class="n">Pos</span><span class="p">()</span>
|
|
<span class="n">x</span> <span class="o">=</span> <span class="n">pos</span><span class="o">.</span><span class="n">X</span><span class="p">()</span>
|
|
<span class="n">y</span> <span class="o">=</span> <span class="n">pos</span><span class="o">.</span><span class="n">Y</span><span class="p">()</span>
|
|
<span class="n">z</span> <span class="o">=</span> <span class="n">pos</span><span class="o">.</span><span class="n">Z</span><span class="p">()</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">let</span><span class="w"> </span><span class="n">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">pos</span><span class="p">().</span><span class="n">unwrap</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="n">x</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="n">y</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="n">z</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">let</span><span class="w"> </span><span class="nv">pos</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">pos</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">x</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="n">x</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">y</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="n">y</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">z</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">pos</span><span class="p">.</span><span class="n">z</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">let</span><span class="w"> </span><span class="nx">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">pos</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">pos</span><span class="p">.</span><span class="nx">x</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">pos</span><span class="p">.</span><span class="nx">y</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">pos</span><span class="p">.</span><span class="nx">z</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>Where <code>x</code>, <code>y</code>, and <code>z</code> will contain <code>1.0</code>, <code>2.0</code>, and <code>3.0</code> respectively.</p>
|
|
<h3 id="vector-access">Vector Access</h3>
|
|
<p>Similarly, we can access elements of the <code>inventory</code> <code>vector</code> by indexing it.
|
|
You can also iterate over the length of the vector.</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="15:15"><input checked="checked" id="c_39" name="__tabbed_15" type="radio" /><input id="c_40" name="__tabbed_15" type="radio" /><input id="c_41" name="__tabbed_15" type="radio" /><input id="dart_13" name="__tabbed_15" type="radio" /><input id="go_13" name="__tabbed_15" type="radio" /><input id="java_13" name="__tabbed_15" type="radio" /><input id="javascript_13" name="__tabbed_15" type="radio" /><input id="kotlin_13" name="__tabbed_15" type="radio" /><input id="lobster_13" name="__tabbed_15" type="radio" /><input id="lua_13" name="__tabbed_15" type="radio" /><input id="php_13" name="__tabbed_15" type="radio" /><input id="python_13" name="__tabbed_15" type="radio" /><input id="rust_13" name="__tabbed_15" type="radio" /><input id="swift_13" name="__tabbed_15" type="radio" /><input id="typescript_13" name="__tabbed_15" type="radio" /><div class="tabbed-labels"><label for="c_39">C++</label><label for="c_40">C</label><label for="c_41">C#</label><label for="dart_13">Dart</label><label for="go_13">Go</label><label for="java_13">Java</label><label for="javascript_13">JavaScript</label><label for="kotlin_13">Kotlin</label><label for="lobster_13">Lobster</label><label for="lua_13">Lua</label><label for="php_13">PHP</label><label for="python_13">Python</label><label for="rust_13">Rust</label><label for="swift_13">Swift</label><label for="typescript_13">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">flatbuffers</span><span class="o">::</span><span class="n">Vector</span><span class="o"><</span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="o">></span><span class="w"> </span><span class="n">inv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="o">-></span><span class="n">inventory</span><span class="p">();</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">inv_len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">inv</span><span class="o">-></span><span class="n">size</span><span class="p">();</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">third_item</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">inv</span><span class="o">-></span><span class="n">Get</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// If `inv` hasn't been set, it will be null. It is valid get</span>
|
|
<span class="c1">// the length of null which will be 0, useful for iteration.</span>
|
|
<span class="n">flatbuffers_uint8_vec_t</span><span class="w"> </span><span class="n">inv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Monster_inventory</span><span class="p">(</span><span class="n">monster</span><span class="p">));</span>
|
|
<span class="kt">size_t</span><span class="w"> </span><span class="n">inv_len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">flatbuffers_uint8_vec_len</span><span class="p">(</span><span class="n">inv</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">int</span><span class="w"> </span><span class="n">invLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">InventoryLength</span><span class="p">;</span>
|
|
<span class="kt">var</span><span class="w"> </span><span class="n">thirdItem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">Inventory</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">int</span><span class="w"> </span><span class="n">invLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">inventory</span><span class="p">.</span><span class="n">length</span><span class="p">;</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="n">thirdItem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">inventory</span><span class="p">[</span><span class="m">2</span><span class="p">];</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nx">invLength</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">InventoryLength</span><span class="p">()</span>
|
|
<span class="nx">thirdItem</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">Inventory</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">int</span><span class="w"> </span><span class="n">invLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">inventoryLength</span><span class="p">();</span>
|
|
<span class="kt">byte</span><span class="w"> </span><span class="n">thirdItem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">inventory</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">var</span><span class="w"> </span><span class="nx">invLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">inventoryLength</span><span class="p">();</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">thirdItem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">inventory</span><span class="p">(</span><span class="mf">2</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">val</span><span class="w"> </span><span class="nv">invLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">inventoryLength</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">thirdItem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">inventory</span><span class="p">(</span><span class="m">2</span><span class="p">)</span><span class="o">!!</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>let inv_len = monster.inventory_length
|
|
let third_item = monster.inventory(2)
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">local</span><span class="w"> </span><span class="nv">invLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">mon</span><span class="p">:</span><span class="nf">InventoryLength</span><span class="p">()</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">thirdItem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">mon</span><span class="p">:</span><span class="nf">Inventory</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span><span class="w"> </span><span class="c1">-- Lua is 1-based</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nv">$inv_len</span> <span class="o">=</span> <span class="nv">$monster</span><span class="o">-></span><span class="na">getInventoryLength</span><span class="p">();</span>
|
|
<span class="nv">$third_item</span> <span class="o">=</span> <span class="nv">$monster</span><span class="o">-></span><span class="na">getInventory</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">inv_len</span> <span class="o">=</span> <span class="n">monster</span><span class="o">.</span><span class="n">InventoryLength</span><span class="p">()</span>
|
|
<span class="n">third_item</span> <span class="o">=</span> <span class="n">monster</span><span class="o">.</span><span class="n">Inventory</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Get and test an element from the `inventory` FlatBuffer's `vector`.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">inv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">inventory</span><span class="p">().</span><span class="n">unwrap</span><span class="p">();</span>
|
|
|
|
<span class="c1">// Note that this vector is returned as a slice, because direct access for</span>
|
|
<span class="c1">// this type, a `u8` vector, is safe on all platforms:</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">third_item</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">inv</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Get a the count of objects in the vector</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">count</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">inventoryCount</span>
|
|
|
|
<span class="c1">// get item at index 4</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">object</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">inventory</span><span class="p">(</span><span class="n">at</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
|
|
|
|
<span class="c1">// or you can fetch the entire array</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">inv</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">inventory</span>
|
|
<span class="c1">// inv[4] should equal object</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">let</span><span class="w"> </span><span class="nx">invLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">inventoryLength</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">thirdItem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">inventory</span><span class="p">(</span><span class="mf">2</span><span class="p">);</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>For vectors of tables, you can access the elements like any other vector, except
|
|
you need to handle the result as a FlatBuffer table. Here we iterate over the
|
|
<code>weapons</code> vector that is houses <code>Weapon</code> <code>tables</code>.</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="16:15"><input checked="checked" id="c_42" name="__tabbed_16" type="radio" /><input id="c_43" name="__tabbed_16" type="radio" /><input id="c_44" name="__tabbed_16" type="radio" /><input id="dart_14" name="__tabbed_16" type="radio" /><input id="go_14" name="__tabbed_16" type="radio" /><input id="java_14" name="__tabbed_16" type="radio" /><input id="javascript_14" name="__tabbed_16" type="radio" /><input id="kotlin_14" name="__tabbed_16" type="radio" /><input id="lobster_14" name="__tabbed_16" type="radio" /><input id="lua_14" name="__tabbed_16" type="radio" /><input id="php_14" name="__tabbed_16" type="radio" /><input id="python_14" name="__tabbed_16" type="radio" /><input id="rust_14" name="__tabbed_16" type="radio" /><input id="swift_14" name="__tabbed_16" type="radio" /><input id="typescript_14" name="__tabbed_16" type="radio" /><div class="tabbed-labels"><label for="c_42">C++</label><label for="c_43">C</label><label for="c_44">C#</label><label for="dart_14">Dart</label><label for="go_14">Go</label><label for="java_14">Java</label><label for="javascript_14">JavaScript</label><label for="kotlin_14">Kotlin</label><label for="lobster_14">Lobster</label><label for="lua_14">Lua</label><label for="php_14">PHP</label><label for="python_14">Python</label><label for="rust_14">Rust</label><label for="swift_14">Swift</label><label for="typescript_14">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">flatbuffers</span><span class="o">::</span><span class="n">Vector</span><span class="o"><</span><span class="n">Weapon</span><span class="o">></span><span class="w"> </span><span class="n">weapons</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="o">-></span><span class="n">weapons</span><span class="p">();</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">weapon_len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapons</span><span class="o">-></span><span class="n">size</span><span class="p">();</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">second_weapon_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapons</span><span class="o">-></span><span class="n">Get</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">-></span><span class="n">name</span><span class="p">()</span><span class="o">-></span><span class="n">str</span><span class="p">();</span>
|
|
<span class="k">auto</span><span class="w"> </span><span class="n">second_weapon_damage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapons</span><span class="o">-></span><span class="n">Get</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">-></span><span class="n">damage</span><span class="p">()</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">ns</span><span class="p">(</span><span class="n">Weapon_vec_t</span><span class="p">)</span><span class="w"> </span><span class="n">weapons</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Monster_weapons</span><span class="p">(</span><span class="n">monster</span><span class="p">));</span>
|
|
<span class="kt">size_t</span><span class="w"> </span><span class="n">weapons_len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Weapon_vec_len</span><span class="p">(</span><span class="n">weapons</span><span class="p">));</span>
|
|
<span class="c1">// We can use `const char *` instead of `flatbuffers_string_t`.</span>
|
|
<span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">second_weapon_name</span><span class="w"> </span><span class="o">=</span>
|
|
<span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Weapon_name</span><span class="p">(</span><span class="n">ns</span><span class="p">(</span><span class="n">Weapon_vec_at</span><span class="p">(</span><span class="n">weapons</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">))));</span>
|
|
<span class="kt">uint16_t</span><span class="w"> </span><span class="n">second_weapon_damage</span><span class="w"> </span><span class="o">=</span>
|
|
<span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Weapon_damage</span><span class="p">(</span><span class="n">ns</span><span class="p">(</span><span class="n">Weapon_vec_at</span><span class="p">(</span><span class="n">weapons</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">))));</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">int</span><span class="w"> </span><span class="n">weaponsLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">WeaponsLength</span><span class="p">;</span>
|
|
<span class="kt">var</span><span class="w"> </span><span class="n">secondWeaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">Weapons</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="n">Name</span><span class="p">;</span>
|
|
<span class="kt">var</span><span class="w"> </span><span class="n">secondWeaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">Weapons</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="n">Damage</span><span class="p">;</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">int</span><span class="w"> </span><span class="n">weaponsLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">weapons</span><span class="p">.</span><span class="n">length</span><span class="p">;</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="n">secondWeaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">weapons</span><span class="p">[</span><span class="m">1</span><span class="p">].</span><span class="n">name</span><span class="p">;</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="n">secondWeaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">Weapons</span><span class="p">[</span><span class="m">1</span><span class="p">].</span><span class="n">damage</span><span class="p">;</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nx">weaponLength</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">WeaponsLength</span><span class="p">()</span>
|
|
<span class="c1">// We need a `sample.Weapon` to pass into `monster.Weapons()`</span>
|
|
<span class="c1">// to capture the output of the function.k</span>
|
|
<span class="nx">weapon</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">new</span><span class="p">(</span><span class="nx">sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">)</span>
|
|
<span class="k">if</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">Weapons</span><span class="p">(</span><span class="nx">weapon</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nx">secondWeaponName</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">weapon</span><span class="p">.</span><span class="nx">Name</span><span class="p">()</span>
|
|
<span class="w"> </span><span class="nx">secondWeaponDamage</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">weapon</span><span class="p">.</span><span class="nx">Damage</span><span class="p">()</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">int</span><span class="w"> </span><span class="n">weaponsLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">weaponsLength</span><span class="p">();</span>
|
|
<span class="n">String</span><span class="w"> </span><span class="n">secondWeaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">weapons</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="na">name</span><span class="p">();</span>
|
|
<span class="kt">short</span><span class="w"> </span><span class="n">secondWeaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">weapons</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="na">damage</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">var</span><span class="w"> </span><span class="nx">weaponsLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">weaponsLength</span><span class="p">();</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">secondWeaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">weapons</span><span class="p">(</span><span class="mf">1</span><span class="p">).</span><span class="nx">name</span><span class="p">();</span>
|
|
<span class="kd">var</span><span class="w"> </span><span class="nx">secondWeaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">weapons</span><span class="p">(</span><span class="mf">1</span><span class="p">).</span><span class="nx">damage</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">val</span><span class="w"> </span><span class="nv">weaponsLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">weaponsLength</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">secondWeaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">weapons</span><span class="p">(</span><span class="m">1</span><span class="p">)</span><span class="o">!!</span><span class="p">.</span><span class="na">name</span>
|
|
<span class="kd">val</span><span class="w"> </span><span class="nv">secondWeaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">weapons</span><span class="p">(</span><span class="m">1</span><span class="p">)</span><span class="o">!!</span><span class="p">.</span><span class="na">damage</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>let weapons_length = monster.weapons_length
|
|
let second_weapon_name = monster.weapons(1).name
|
|
let second_weapon_damage = monster.weapons(1).damage
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">local</span><span class="w"> </span><span class="nv">weaponsLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">mon</span><span class="p">:</span><span class="nf">WeaponsLength</span><span class="p">()</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">secondWeaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">mon</span><span class="p">:</span><span class="nf">Weapon</span><span class="p">(</span><span class="mi">2</span><span class="p">):</span><span class="nf">Name</span><span class="p">()</span>
|
|
<span class="kd">local</span><span class="w"> </span><span class="nv">secondWeaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">mon</span><span class="p">:</span><span class="nf">Weapon</span><span class="p">(</span><span class="mi">2</span><span class="p">):</span><span class="nf">Damage</span><span class="p">()</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nv">$weapons_len</span> <span class="o">=</span> <span class="nv">$monster</span><span class="o">-></span><span class="na">getWeaponsLength</span><span class="p">();</span>
|
|
<span class="nv">$second_weapon_name</span> <span class="o">=</span> <span class="nv">$monster</span><span class="o">-></span><span class="na">getWeapons</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">-></span><span class="na">getName</span><span class="p">();</span>
|
|
<span class="nv">$second_weapon_damage</span> <span class="o">=</span> <span class="nv">$monster</span><span class="o">-></span><span class="na">getWeapons</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">-></span><span class="na">getDamage</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">weapons_length</span> <span class="o">=</span> <span class="n">monster</span><span class="o">.</span><span class="n">WeaponsLength</span><span class="p">()</span>
|
|
<span class="n">second_weapon_name</span> <span class="o">=</span> <span class="n">monster</span><span class="o">.</span><span class="n">Weapons</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">Name</span><span class="p">()</span>
|
|
<span class="n">second_weapon_damage</span> <span class="o">=</span> <span class="n">monster</span><span class="o">.</span><span class="n">Weapons</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">Damage</span><span class="p">()</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Get and test the `weapons` FlatBuffers's `vector`.</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">weps</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">weapons</span><span class="p">().</span><span class="n">unwrap</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">weps_len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weps</span><span class="p">.</span><span class="n">len</span><span class="p">();</span>
|
|
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">wep2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weps</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">second_weapon_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">wep2</span><span class="p">.</span><span class="n">name</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="n">second_weapon_damage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">wep2</span><span class="p">.</span><span class="n">damage</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Get the count of weapon objects</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">wepsCount</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">weaponsCount</span>
|
|
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">weapon2</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">weapons</span><span class="p">(</span><span class="n">at</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">weaponName</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">weapon2</span><span class="p">.</span><span class="n">name</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nv">weaponDmg</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">weapon2</span><span class="p">.</span><span class="n">damage</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">let</span><span class="w"> </span><span class="nx">weaponsLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">weaponsLength</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">secondWeaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">weapons</span><span class="p">(</span><span class="mf">1</span><span class="p">).</span><span class="nx">name</span><span class="p">();</span>
|
|
<span class="kd">let</span><span class="w"> </span><span class="nx">secondWeaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">weapons</span><span class="p">(</span><span class="mf">1</span><span class="p">).</span><span class="nx">damage</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<h3 id="union-access">Union Access</h3>
|
|
<p>Lastly , we can access our <code>equipped</code> <code>union</code> field. Just like when we created
|
|
the union, we need to get both parts of the union: the type and the data.</p>
|
|
<p>We can access the type to dynamically cast the data as needed (since the union
|
|
only stores a FlatBuffer <code>table</code>).</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="17:15"><input checked="checked" id="c_45" name="__tabbed_17" type="radio" /><input id="c_46" name="__tabbed_17" type="radio" /><input id="c_47" name="__tabbed_17" type="radio" /><input id="dart_15" name="__tabbed_17" type="radio" /><input id="go_15" name="__tabbed_17" type="radio" /><input id="java_15" name="__tabbed_17" type="radio" /><input id="javascript_15" name="__tabbed_17" type="radio" /><input id="kotlin_15" name="__tabbed_17" type="radio" /><input id="lobster_15" name="__tabbed_17" type="radio" /><input id="lua_15" name="__tabbed_17" type="radio" /><input id="php_15" name="__tabbed_17" type="radio" /><input id="python_15" name="__tabbed_17" type="radio" /><input id="rust_15" name="__tabbed_17" type="radio" /><input id="swift_15" name="__tabbed_17" type="radio" /><input id="typescript_15" name="__tabbed_17" type="radio" /><div class="tabbed-labels"><label for="c_45">C++</label><label for="c_46">C</label><label for="c_47">C#</label><label for="dart_15">Dart</label><label for="go_15">Go</label><label for="java_15">Java</label><label for="javascript_15">JavaScript</label><label for="kotlin_15">Kotlin</label><label for="lobster_15">Lobster</label><label for="lua_15">Lua</label><label for="php_15">PHP</label><label for="python_15">Python</label><label for="rust_15">Rust</label><label for="swift_15">Swift</label><label for="typescript_15">TypeScript</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="k">auto</span><span class="w"> </span><span class="n">union_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">equipped_type</span><span class="p">();</span>
|
|
|
|
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">union_type</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">Equipment_Weapon</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="c1">// Requires `static_cast` to type `const Weapon*`.</span>
|
|
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">weapon</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">static_cast</span><span class="o"><</span><span class="k">const</span><span class="w"> </span><span class="n">Weapon</span><span class="o">*></span><span class="p">(</span><span class="n">monster</span><span class="o">-></span><span class="n">equipped</span><span class="p">());</span>
|
|
|
|
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">weapon_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapon</span><span class="o">-></span><span class="n">name</span><span class="p">()</span><span class="o">-></span><span class="n">str</span><span class="p">();</span><span class="w"> </span><span class="c1">// "Axe"</span>
|
|
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">weapon_damage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapon</span><span class="o">-></span><span class="n">damage</span><span class="p">();</span><span class="w"> </span><span class="c1">// 5</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Access union type field.</span>
|
|
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ns</span><span class="p">(</span><span class="n">Monster_equipped_type</span><span class="p">(</span><span class="n">monster</span><span class="p">))</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Equipment_Weapon</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="c1">// Cast to appropriate type:</span>
|
|
<span class="w"> </span><span class="c1">// C allows for silent void pointer assignment, so we need no</span>
|
|
<span class="w"> </span><span class="c1">// explicit cast.</span>
|
|
<span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Weapon_table_t</span><span class="p">)</span><span class="w"> </span><span class="n">weapon</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Monster_equipped</span><span class="p">(</span><span class="n">monster</span><span class="p">));</span>
|
|
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">weapon_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Weapon_name</span><span class="p">(</span><span class="n">weapon</span><span class="p">));</span><span class="w"> </span><span class="c1">// "Axe"</span>
|
|
<span class="w"> </span><span class="kt">uint16_t</span><span class="w"> </span><span class="n">weapon_damage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ns</span><span class="p">(</span><span class="n">Weapon_damage</span><span class="p">(</span><span class="n">weapon</span><span class="p">));</span><span class="w"> </span><span class="c1">// 5</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">var</span><span class="w"> </span><span class="n">unionType</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">EquippedType</span><span class="p">;</span>
|
|
|
|
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">unionType</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">Equipment</span><span class="p">.</span><span class="n">Weapon</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">weapon</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">Equipped</span><span class="o"><</span><span class="n">Weapon</span><span class="o">></span><span class="p">().</span><span class="n">Value</span><span class="p">;</span>
|
|
|
|
<span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">weaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapon</span><span class="p">.</span><span class="n">Name</span><span class="p">;</span><span class="w"> </span><span class="c1">// "Axe"</span>
|
|
<span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">weaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapon</span><span class="p">.</span><span class="n">Damage</span><span class="p">;</span><span class="w"> </span><span class="c1">// 5</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">var</span><span class="w"> </span><span class="n">unionType</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">equippedType</span><span class="p">.</span><span class="n">value</span><span class="p">;</span>
|
|
|
|
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">unionType</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">myGame</span><span class="p">.</span><span class="n">EquipmentTypeId</span><span class="p">.</span><span class="n">Weapon</span><span class="p">.</span><span class="n">value</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="n">myGame</span><span class="p">.</span><span class="n">Weapon</span><span class="w"> </span><span class="n">weapon</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mon</span><span class="p">.</span><span class="n">equipped</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">myGame</span><span class="p">.</span><span class="n">Weapon</span><span class="p">;</span>
|
|
|
|
<span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="n">weaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapon</span><span class="p">.</span><span class="n">name</span><span class="p">;</span><span class="w"> </span><span class="c1">// "Axe"</span>
|
|
<span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="n">weaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapon</span><span class="p">.</span><span class="n">damage</span><span class="p">;</span><span class="w"> </span><span class="c1">// 5</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// We need a `flatbuffers.Table` to capture the output of the</span>
|
|
<span class="c1">// `monster.Equipped()` function.</span>
|
|
<span class="nx">unionTable</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">new</span><span class="p">(</span><span class="nx">flatbuffers</span><span class="p">.</span><span class="nx">Table</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">Equipped</span><span class="p">(</span><span class="nx">unionTable</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="nx">unionType</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">EquippedType</span><span class="p">()</span>
|
|
|
|
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">unionType</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nx">sample</span><span class="p">.</span><span class="nx">EquipmentWeapon</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="c1">// Create a `sample.Weapon` object that can be initialized with the</span>
|
|
<span class="w"> </span><span class="c1">// contents of the `flatbuffers.Table` (`unionTable`), which was</span>
|
|
<span class="w"> </span><span class="c1">// populated by `monster.Equipped()`.</span>
|
|
<span class="w"> </span><span class="nx">unionWeapon</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nb">new</span><span class="p">(</span><span class="nx">sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="nx">unionWeapon</span><span class="p">.</span><span class="nx">Init</span><span class="p">(</span><span class="nx">unionTable</span><span class="p">.</span><span class="nx">Bytes</span><span class="p">,</span><span class="w"> </span><span class="nx">unionTable</span><span class="p">.</span><span class="nx">Pos</span><span class="p">)</span>
|
|
|
|
<span class="w"> </span><span class="nx">weaponName</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">unionWeapon</span><span class="p">.</span><span class="nx">Name</span><span class="p">()</span>
|
|
<span class="w"> </span><span class="nx">weaponDamage</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">unionWeapon</span><span class="p">.</span><span class="nx">Damage</span><span class="p">()</span>
|
|
<span class="w"> </span><span class="p">}</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kt">int</span><span class="w"> </span><span class="n">unionType</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">EquippedType</span><span class="p">();</span>
|
|
|
|
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">unionType</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">Equipment</span><span class="p">.</span><span class="na">Weapon</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="c1">// Requires an explicit cast to `Weapon`.</span>
|
|
<span class="w"> </span><span class="n">Weapon</span><span class="w"> </span><span class="n">weapon</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Weapon</span><span class="p">)</span><span class="n">monster</span><span class="p">.</span><span class="na">equipped</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">Weapon</span><span class="p">());</span>
|
|
|
|
<span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">weaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapon</span><span class="p">.</span><span class="na">name</span><span class="p">();</span><span class="w"> </span><span class="c1">// "Axe"</span>
|
|
<span class="w"> </span><span class="kt">short</span><span class="w"> </span><span class="n">weaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapon</span><span class="p">.</span><span class="na">damage</span><span class="p">();</span><span class="w"> </span><span class="c1">// 5</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">var</span><span class="w"> </span><span class="nx">unionType</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">equippedType</span><span class="p">();</span>
|
|
|
|
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">unionType</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Equipment</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="c1">// 'Axe'</span>
|
|
<span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nx">weaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">equipped</span><span class="p">(</span><span class="ow">new</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">()).</span><span class="nx">name</span><span class="p">();</span>
|
|
<span class="w"> </span><span class="c1">// 5</span>
|
|
<span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nx">weaponDamage</span><span class="w"> </span><span class="o">=</span>
|
|
<span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">equipped</span><span class="p">(</span><span class="ow">new</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">()).</span><span class="nx">damage</span><span class="p">();</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">val</span><span class="w"> </span><span class="nv">unionType</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">EquippedType</span>
|
|
|
|
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">unionType</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">Equipment</span><span class="p">.</span><span class="na">Weapon</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="c1">// Requires an explicit cast to `Weapon`.</span>
|
|
<span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">weapon</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="na">equipped</span><span class="p">(</span><span class="n">Weapon</span><span class="p">())</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">Weapon</span>
|
|
|
|
<span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">weaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapon</span><span class="p">.</span><span class="na">name</span><span class="w"> </span><span class="c1">// "Axe"</span>
|
|
<span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">weaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">weapon</span><span class="p">.</span><span class="na">damage</span><span class="w"> </span><span class="c1">// 5</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>union_type = monster.equipped_type
|
|
|
|
if union_type == MyGame_Sample_Equipment_Weapon:
|
|
// `monster.equipped_as_Weapon` returns a FlatBuffer handle much like
|
|
// normal table fields, but this is only valid to call if we already
|
|
// know it is the correct type.
|
|
let union_weapon = monster.equipped_as_Weapon
|
|
|
|
let weapon_name = union_weapon.name // "Axe"
|
|
let weapon_damage = union_weapon.damage // 5
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">local</span><span class="w"> </span><span class="nv">unionType</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">mon</span><span class="p">:</span><span class="nf">EquippedType</span><span class="p">()</span>
|
|
|
|
<span class="kr">if</span><span class="w"> </span><span class="nv">unionType</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nv">equipment</span><span class="p">.</span><span class="py">Weapon</span><span class="w"> </span><span class="kr">then</span>
|
|
<span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">unionWeapon</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">weapon</span><span class="p">.</span><span class="nf">New</span><span class="p">()</span>
|
|
<span class="w"> </span><span class="nv">unionWeapon</span><span class="p">:</span><span class="nf">Init</span><span class="p">(</span><span class="nv">mon</span><span class="p">:</span><span class="nf">Equipped</span><span class="p">().</span><span class="nv">bytes</span><span class="p">,</span><span class="w"> </span><span class="nv">mon</span><span class="p">:</span><span class="nf">Equipped</span><span class="p">().</span><span class="nv">pos</span><span class="p">)</span>
|
|
|
|
<span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">weaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">unionWeapon</span><span class="p">:</span><span class="nf">Name</span><span class="p">()</span><span class="w"> </span><span class="c1">-- 'Axe'</span>
|
|
<span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">weaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">unionWeapon</span><span class="p">:</span><span class="nf">Damage</span><span class="p">()</span><span class="w"> </span><span class="c1">-- 5</span>
|
|
<span class="kr">end</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="nv">$union_type</span> <span class="o">=</span> <span class="nv">$monster</span><span class="o">-></span><span class="na">getEquippedType</span><span class="p">();</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span><span class="nv">$union_type</span> <span class="o">==</span> <span class="nx">\MyGame\Sample\Equipment</span><span class="o">::</span><span class="na">Weapon</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="c1">// "Axe"</span>
|
|
<span class="nv">$weapon_name</span> <span class="o">=</span>
|
|
<span class="nv">$monster</span><span class="o">-></span><span class="na">getEquipped</span><span class="p">(</span><span class="k">new</span> <span class="nx">\MyGame\Sample\Weapon</span><span class="p">())</span><span class="o">-></span><span class="na">getName</span><span class="p">();</span>
|
|
<span class="c1">// 5</span>
|
|
<span class="nv">$weapon_damage</span> <span class="o">=</span>
|
|
<span class="nv">$monster</span><span class="o">-></span><span class="na">getEquipped</span><span class="p">(</span><span class="k">new</span> <span class="nx">\MyGame\Sample\Weapon</span><span class="p">())</span><span class="o">-></span><span class="na">getDamage</span><span class="p">();</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="n">union_type</span> <span class="o">=</span> <span class="n">monster</span><span class="o">.</span><span class="n">EquippedType</span><span class="p">()</span>
|
|
|
|
<span class="k">if</span> <span class="n">union_type</span> <span class="o">==</span> <span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Equipment</span><span class="o">.</span><span class="n">Equipment</span><span class="p">()</span><span class="o">.</span><span class="n">Weapon</span><span class="p">:</span>
|
|
<span class="c1"># `monster.Equipped()` returns a `flatbuffers.Table`, which can be used</span>
|
|
<span class="c1"># to initialize a `MyGame.Sample.Weapon.Weapon()`.</span>
|
|
<span class="n">union_weapon</span> <span class="o">=</span> <span class="n">MyGame</span><span class="o">.</span><span class="n">Sample</span><span class="o">.</span><span class="n">Weapon</span><span class="o">.</span><span class="n">Weapon</span><span class="p">()</span>
|
|
<span class="n">union_weapon</span><span class="o">.</span><span class="n">Init</span><span class="p">(</span><span class="n">monster</span><span class="o">.</span><span class="n">Equipped</span><span class="p">()</span><span class="o">.</span><span class="n">Bytes</span><span class="p">,</span> <span class="n">monster</span><span class="o">.</span><span class="n">Equipped</span><span class="p">()</span><span class="o">.</span><span class="n">Pos</span><span class="p">)</span>
|
|
|
|
<span class="n">weapon_name</span> <span class="o">=</span> <span class="n">union_weapon</span><span class="o">.</span><span class="n">Name</span><span class="p">()</span> <span class="o">//</span> <span class="s1">'Axe'</span>
|
|
<span class="n">weapon_damage</span> <span class="o">=</span> <span class="n">union_weapon</span><span class="o">.</span><span class="n">Damage</span><span class="p">()</span> <span class="o">//</span> <span class="mi">5</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Get and test the `Equipment` union (`equipped` field).</span>
|
|
<span class="c1">// `equipped_as_weapon` returns a FlatBuffer handle much like normal table</span>
|
|
<span class="c1">// fields, but this will return `None` if the union is not actually of that</span>
|
|
<span class="c1">// type.</span>
|
|
<span class="k">if</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">equipped_type</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">Equipment</span><span class="p">::</span><span class="n">Weapon</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">equipped</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">equipped_as_weapon</span><span class="p">().</span><span class="n">unwrap</span><span class="p">();</span>
|
|
<span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">weapon_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">equipped</span><span class="p">.</span><span class="n">name</span><span class="p">();</span>
|
|
<span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">weapon_damage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">equipped</span><span class="p">.</span><span class="n">damage</span><span class="p">();</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="c1">// Get and check if the monster has an equipped item</span>
|
|
<span class="k">if</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">equippedType</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="p">.</span><span class="n">weapon</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">_weapon</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">monster</span><span class="p">.</span><span class="n">equipped</span><span class="p">(</span><span class="n">type</span><span class="p">:</span><span class="w"> </span><span class="n">Weapon</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">name</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">_weapon</span><span class="p">.</span><span class="n">name</span><span class="w"> </span><span class="c1">// should return "Axe"</span>
|
|
<span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">dmg</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">_weapon</span><span class="p">.</span><span class="n">damage</span><span class="w"> </span><span class="c1">// should return 5</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code><span class="kd">let</span><span class="w"> </span><span class="nx">unionType</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">equippedType</span><span class="p">();</span>
|
|
|
|
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">unionType</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Equipment</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
|
<span class="w"> </span><span class="c1">// 'Axe'</span>
|
|
<span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">weaponName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">equipped</span><span class="p">(</span><span class="ow">new</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">()).</span><span class="nx">name</span><span class="p">();</span>
|
|
<span class="w"> </span><span class="c1">// 5</span>
|
|
<span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">weaponDamage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">monster</span><span class="p">.</span><span class="nx">equipped</span><span class="p">(</span><span class="ow">new</span><span class="w"> </span><span class="nx">MyGame</span><span class="p">.</span><span class="nx">Sample</span><span class="p">.</span><span class="nx">Weapon</span><span class="p">()).</span><span class="nx">damage</span><span class="p">();</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</article>
|
|
</div>
|
|
|
|
|
|
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
|
|
|
|
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
|
</div>
|
|
|
|
</main>
|
|
|
|
<footer class="md-footer">
|
|
|
|
|
|
|
|
<nav class="md-footer__inner md-grid" aria-label="Footer" >
|
|
|
|
|
|
<a href="../quick_start/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Quick Start">
|
|
<div class="md-footer__button md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
|
</div>
|
|
<div class="md-footer__title">
|
|
<span class="md-footer__direction">
|
|
Previous
|
|
</span>
|
|
<div class="md-ellipsis">
|
|
Quick Start
|
|
</div>
|
|
</div>
|
|
</a>
|
|
|
|
|
|
|
|
<a href="../building/" class="md-footer__link md-footer__link--next" aria-label="Next: Building">
|
|
<div class="md-footer__title">
|
|
<span class="md-footer__direction">
|
|
Next
|
|
</span>
|
|
<div class="md-ellipsis">
|
|
Building
|
|
</div>
|
|
</div>
|
|
<div class="md-footer__button md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
|
|
</div>
|
|
</a>
|
|
|
|
</nav>
|
|
|
|
|
|
<div class="md-footer-meta md-typeset">
|
|
<div class="md-footer-meta__inner md-grid">
|
|
<div class="md-copyright">
|
|
|
|
<div class="md-copyright__highlight">
|
|
Copyright © 2025 Google
|
|
</div>
|
|
|
|
|
|
Made with
|
|
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
|
Material for MkDocs
|
|
</a>
|
|
|
|
</div>
|
|
|
|
|
|
<div class="md-social">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a href="https://github.com/google/flatbuffers" target="_blank" rel="noopener" title="github.com" class="md-social__link">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a href="https:///discord.gg/6qgKs3R" target="_blank" rel="noopener" title="" class="md-social__link">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M492.5 69.8c-.2-.3-.4-.6-.8-.7-38.1-17.5-78.4-30-119.7-37.1-.4-.1-.8 0-1.1.1s-.6.4-.8.8c-5.5 9.9-10.5 20.2-14.9 30.6-44.6-6.8-89.9-6.8-134.4 0-4.5-10.5-9.5-20.7-15.1-30.6-.2-.3-.5-.6-.8-.8s-.7-.2-1.1-.2C162.5 39 122.2 51.5 84.1 69c-.3.1-.6.4-.8.7C7.1 183.5-13.8 294.6-3.6 404.2c0 .3.1.5.2.8s.3.4.5.6c44.4 32.9 94 58 146.8 74.2.4.1.8.1 1.1 0s.7-.4.9-.7c11.3-15.4 21.4-31.8 30-48.8.1-.2.2-.5.2-.8s0-.5-.1-.8-.2-.5-.4-.6-.4-.3-.7-.4c-15.8-6.1-31.2-13.4-45.9-21.9-.3-.2-.5-.4-.7-.6s-.3-.6-.3-.9 0-.6.2-.9.3-.5.6-.7c3.1-2.3 6.2-4.7 9.1-7.1.3-.2.6-.4.9-.4s.7 0 1 .1c96.2 43.9 200.4 43.9 295.5 0 .3-.1.7-.2 1-.2s.7.2.9.4c2.9 2.4 6 4.9 9.1 7.2.2.2.4.4.6.7s.2.6.2.9-.1.6-.3.9-.4.5-.6.6c-14.7 8.6-30 15.9-45.9 21.8-.2.1-.5.2-.7.4s-.3.4-.4.7-.1.5-.1.8.1.5.2.8c8.8 17 18.8 33.3 30 48.8.2.3.6.6.9.7s.8.1 1.1 0c52.9-16.2 102.6-41.3 147.1-74.2.2-.2.4-.4.5-.6s.2-.5.2-.8c12.3-126.8-20.5-236.9-86.9-334.5zm-302 267.7c-29 0-52.8-26.6-52.8-59.2s23.4-59.2 52.8-59.2c29.7 0 53.3 26.8 52.8 59.2 0 32.7-23.4 59.2-52.8 59.2m195.4 0c-29 0-52.8-26.6-52.8-59.2s23.4-59.2 52.8-59.2c29.7 0 53.3 26.8 52.8 59.2 0 32.7-23.2 59.2-52.8 59.2"/></svg>
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a href="https://twitter.com/dbaileychess" target="_blank" rel="noopener" title="twitter.com" class="md-social__link">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M357.2 48h70.6L273.6 224.2 455 464H313L201.7 318.6 74.5 464H3.8l164.9-188.5L-5.2 48h145.6l100.5 132.9zm-24.8 373.8h39.1L119.1 88h-42z"/></svg>
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
</div>
|
|
<div class="md-dialog" data-md-component="dialog">
|
|
<div class="md-dialog__inner md-typeset"></div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["content.code.annotate", "content.tabs.link", "navigation.expand", "navigation.footer", "header.autohide", "content.action.edit"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
|
|
|
|
|
|
<script src="../assets/javascripts/bundle.79ae519e.min.js"></script>
|
|
|
|
|
|
</body>
|
|
</html> |