| |
| <!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.0"> |
| |
| |
| |
| <title>Tutorial - FlatBuffers Docs</title> |
| |
| |
| |
| <link rel="stylesheet" href="../assets/stylesheets/main.618322db.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"># 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="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">StartWeaponsVector</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> |
| <span class="n">builder</span><span class="o">.</span><span class="n">PrependUOffsetTRelative</span><span class="p">(</span><span class="n">axe</span><span class="p">)</span> |
| <span class="n">builder</span><span class="o">.</span><span class="n">PrependUOffsetTRelative</span><span class="p">(</span><span class="n">sword</span><span class="p">)</span> |
| <span class="n">weapons</span> <span class="o">=</span> <span class="n">builder</span><span class="o">.</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 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="c1"># Note: Since we prepend the bytes, this loop iterates in reverse.</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">StartInventoryVector</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> |
| <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">reversed</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">builder</span><span class="o">.</span><span class="n">PrependByte</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> |
| <span class="n">inv</span> <span class="o">=</span> <span class="n">builder</span><span class="o">.</span><span class="n">EndVector</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">StartPathVector</span><span class="p">(</span><span class="n">builder</span><span class="p">,</span> <span class="mi">2</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">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">4.0</span><span class="p">,</span> <span class="mf">5.0</span><span class="p">,</span> <span class="mf">6.0</span><span class="p">)</span> |
| <span class="n">path</span> <span class="o">=</span> <span class="n">builder</span><span class="o">.</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">// 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.7a47a382.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.e71a0d61.min.js"></script> |
| |
| |
| </body> |
| </html> |