mirror of
https://github.com/marzer/tomlplusplus.git
synced 2026-02-09 23:52:13 +00:00
359 lines
39 KiB
HTML
359 lines
39 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en"><head>
|
|
<meta charset="utf-8"/>
|
|
<title>toml++ TOML
|
|
for
|
|
modern
|
|
C++</title>
|
|
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400i,600,600i%7CSource+Code+Pro:400,400i,600" rel="stylesheet"/>
|
|
<link href="m-dark+documentation.compiled.css" rel="stylesheet"/>
|
|
<link href="tomlplusplus.css" rel="stylesheet"/>
|
|
<link href="favicon.ico" rel="icon" type="image/vnd.microsoft.icon"/>
|
|
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
|
<meta content="#22272e" name="theme-color"/>
|
|
<meta content="gbtcNgKlNiPSMKkYMw4zWFVWGPH_oU93m9n_-nb4qK8" name="google-site-verification"/>
|
|
<meta content="Header-only
|
|
TOML
|
|
config
|
|
file
|
|
parser
|
|
and
|
|
serializer
|
|
for
|
|
modern
|
|
C++." name="description"/>
|
|
<script src="tomlplusplus.js"></script>
|
|
</head>
|
|
<body>
|
|
<header><nav id="navigation">
|
|
<div class="m-container">
|
|
<div class="m-row">
|
|
<a class="m-col-t-8 m-col-m-none m-left-m" href="index.html" id="m-navbar-brand"><img src="logo.png"/>toml++ <span class="m-thin">TOML
|
|
for
|
|
modern
|
|
C++</span></a>
|
|
<div class="m-col-t-4 m-hide-m m-text-right m-nopadr">
|
|
<a class="m-doc-search-icon" href="#search" onclick="return showSearch()" title="Search"><svg style="height: 0.9rem;" viewBox="0 0 16 16">
|
|
<path d="m6 0c-3.31 0-6 2.69-6 6 0 3.31 2.69 6 6 6 1.49 0 2.85-0.541 3.89-1.44-0.0164 0.338 0.147 0.759 0.5 1.15l3.22 3.79c0.552 0.614 1.45 0.665 2 0.115 0.55-0.55 0.499-1.45-0.115-2l-3.79-3.22c-0.392-0.353-0.812-0.515-1.15-0.5 0.895-1.05 1.44-2.41 1.44-3.89 0-3.31-2.69-6-6-6zm0 1.56a4.44 4.44 0 0 1 4.44 4.44 4.44 4.44 0 0 1-4.44 4.44 4.44 4.44 0 0 1-4.44-4.44 4.44 4.44 0 0 1 4.44-4.44z" id="m-doc-search-icon-path"></path>
|
|
</svg></a>
|
|
<a href="#navigation" id="m-navbar-show" title="Show navigation"></a>
|
|
<a href="#" id="m-navbar-hide" title="Hide navigation"></a>
|
|
</div>
|
|
<div class="m-col-t-12 m-show-m m-col-m-none m-right-m" id="m-navbar-collapse">
|
|
<div class="m-row">
|
|
<ol class="m-col-t-6 m-col-m-none">
|
|
<li><a href="namespaces.html">Namespaces</a></li>
|
|
</ol>
|
|
<ol class="m-col-t-6 m-col-m-none" start="2">
|
|
<li><a href="annotated.html">Classes</a></li>
|
|
<li><a class="github" href="https://github.com/marzer/tomlplusplus/" target="_blank">Github</a></li>
|
|
<li class="m-show-m"><a class="m-doc-search-icon" href="#search" onclick="return showSearch()" title="Search"><svg style="height: 0.9rem;" viewBox="0 0 16 16">
|
|
<use href="#m-doc-search-icon-path"></use>
|
|
</svg></a></li>
|
|
</ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</nav></header>
|
|
<main><article>
|
|
<div class="m-container m-container-inflatable">
|
|
<div class="m-row">
|
|
<div class="m-col-l-10 m-push-l-1">
|
|
<img alt="Image" class="m-image" src="banner_small.png" style="width: 1280px;"/><div class="gh-badges"><a href="https://github.com/marzer/tomlplusplus/releases" target="_blank"><img alt="Releases" src="https://img.shields.io/github/v/release/marzer/tomlplusplus?style=flat-square"/></a><a href="https://en.cppreference.com/w/cpp/compiler_support" target="_blank"><img alt="C++17" src="badge-C++17.svg"/></a><a href="https://en.cppreference.com/w/cpp/compiler_support" target="_blank"><img alt="C++20" src="badge-C++20.svg"/></a><a href="https://github.com/toml-lang/toml/blob/master/README.md" target="_blank"><img alt="TOML" src="badge-TOML.svg"/></a><a href="https://github.com/marzer/tomlplusplus/blob/master/LICENSE" target="_blank"><img alt="MIT License" src="badge-license-MIT.svg"/></a><a href="https://circleci.com/gh/marzer/tomlplusplus" target="_blank"><img alt="CircleCI" src="https://img.shields.io/circleci/build/github/marzer/tomlplusplus?label=circle%20ci&logo=circleci&logoColor=white&style=flat-square"/></a><a href="https://github.com/fffaraz/awesome-cpp" target="_blank"><img alt="Mentioned in Awesome C++" src="badge-awesome.svg"/></a></div>
|
|
<div class="m-block m-default">
|
|
<h3>Contents</h3>
|
|
<ul>
|
|
<li><a href="#mainpage-features">Features</a></li>
|
|
<li><a href="#mainpage-adding-lib">Adding toml++ to your project</a></li>
|
|
<li><a href="#mainpage-api-documentation">API Documentation</a></li>
|
|
<li>
|
|
<a href="#mainpage-example">Basic examples</a>
|
|
<ul>
|
|
<li><a href="#mainpage-example-parsing-files">Parsing TOML files</a></li>
|
|
<li><a href="#mainpage-example-parsing-strings">Parsing TOML directly from strings and streams</a></li>
|
|
<li><a href="#mainpage-example-manipulations">Traversing and manipulating data</a></li>
|
|
<li><a href="#mainpage-example-serialization">Serializing as TOML and JSON</a></li>
|
|
<li><a href="#mainpage-example-speed-up-compilation">Speeding up compilation</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#mainpage-contributing">Contributing</a></li>
|
|
<li><a href="#mainpage-license">License</a></li>
|
|
<li><a href="#mainpage-contact">Contacting the author</a></li>
|
|
</ul>
|
|
</div>
|
|
<section id="mainpage-features"><h2><a href="#mainpage-features">Features</a></h2><ul><li><a href="https://github.com/toml-lang/toml/blob/master/README.md">TOML v1.0.0-rc.1</a>, plus optional support for some unreleased TOML features</li><li>C++17 (plus some C++20 features where available, e.g. experimental support for <a class="m-doc tpp-injected tpp-external" href="https://en.cppreference.com/w/cpp/language/types" target="_blank">char8_t</a> strings)</li><li>Proper UTF-8 handling (incl. BOM)</li><li>Works with or without exceptions</li><li>Doesn't require RTTI</li><li>First-class support for serializing to JSON<br/></li><li>Tested on Clang, GCC and MSVC (VS2019)<br/></li><li>Tested on x64, x86 and ARM</li></ul></section><section id="mainpage-adding-lib"><h2><a href="#mainpage-adding-lib">Adding toml++ to your project</a></h2><p>It's header-only library so really all you have to do is clone <a href="https://github.com/marzer/tomlplusplus/">the repository</a> from GitHub and set your include paths. There's some minor configuration you can do to customize some basic library functionality, but that's totally optional. See the <a href="https://github.com/marzer/tomlplusplus/blob/master/README.md">README</a> for more info.</p></section><section id="mainpage-api-documentation"><h2><a href="#mainpage-api-documentation">API Documentation</a></h2><p>You're looking at it! Browse the docs using the links at the top of the page. You can search from anywhere by pressing the TAB key.</p></section><section id="mainpage-example"><h2><a href="#mainpage-example">Basic examples</a></h2><section id="mainpage-example-parsing-files"><h3><a href="#mainpage-example-parsing-files">Parsing TOML files</a></h3><p>toml++ works whether you have exceptions enabled or not. For the most part the usage is the same, the main difference being how parsing errors are reported to the caller. When exceptions are enabled a successful call to a parsing function simply returns a <a class="m-doc" href="classtoml_1_1table.html">toml::<wbr/>table</a>, whereas a failed call sees a <a class="m-doc" href="classtoml_1_1parse__error.html">toml::<wbr/>parse_error</a> thrown directly from the site of the error:</p><pre class="m-code"><span class="cp">#include</span> <span class="cpf"><iostream></span><span class="cp"></span>
|
|
<span class="cp">#include</span> <span class="cpf"><fstream> //required for parse_file()</span><span class="cp"></span>
|
|
<span class="cp">#include</span> <span class="cpf"><toml++/toml.h></span><span class="cp"></span>
|
|
<span class="k">using</span> <span class="k">namespace</span> <span class="ns">std::</span><span class="n">string_view_literals</span><span class="p">;</span>
|
|
|
|
<span class="ut">int</span> <span class="nf">main</span><span class="p">()</span>
|
|
<span class="p">{</span>
|
|
<span class="ns">toml::</span><span class="ut">table</span> <span class="n">tbl</span><span class="p">;</span>
|
|
<span class="k">try</span>
|
|
<span class="p">{</span>
|
|
<span class="n">tbl</span> <span class="o">=</span> <span class="ns">toml::</span><span class="n">parse_file</span><span class="p">(</span><span class="s">"configuration.toml"</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="ns">toml::</span><span class="ut">parse_error</span><span class="o">&</span> <span class="n">err</span><span class="p">)</span>
|
|
<span class="p">{</span>
|
|
<span class="ns">std::</span><span class="n">cerr</span>
|
|
<span class="o"><<</span> <span class="s">"Error parsing file '"</span> <span class="o"><<</span> <span class="o">*</span><span class="n">err</span><span class="p">.</span><span class="n">source</span><span class="p">().</span><span class="n">path</span>
|
|
<span class="o"><<</span> <span class="s">"':</span><span class="se">\n</span><span class="s">"</span> <span class="o"><<</span> <span class="n">err</span><span class="p">.</span><span class="n">description</span><span class="p">()</span>
|
|
<span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s"> ("</span> <span class="o"><<</span> <span class="n">err</span><span class="p">.</span><span class="n">source</span><span class="p">().</span><span class="n">begin</span> <span class="o"><<</span> <span class="s">")</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="n">do_stuff_with_your_config</span><span class="p">(</span><span class="n">tbl</span><span class="p">);</span>
|
|
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
|
|
<span class="p">}</span></pre><p>When exceptions are disabled parsing functions return a <a class="m-doc" href="classtoml_1_1parse__result.html">toml::<wbr/>parse_result</a> instead and it is up to the caller to check if parsing has been successful by examining the return value:</p><pre class="m-code"><span class="cp">#include</span> <span class="cpf"><iostream></span><span class="cp"></span>
|
|
<span class="cp">#include</span> <span class="cpf"><fstream> //required for parse_file()</span><span class="cp"></span>
|
|
<span class="cp">#include</span> <span class="cpf"><toml++/toml.h></span><span class="cp"></span>
|
|
<span class="k">using</span> <span class="k">namespace</span> <span class="ns">std::</span><span class="n">string_view_literals</span><span class="p">;</span>
|
|
|
|
<span class="ut">int</span> <span class="nf">main</span><span class="p">()</span>
|
|
<span class="p">{</span>
|
|
<span class="ns">toml::</span><span class="ut">parse_result</span> <span class="n">tbl</span> <span class="o">=</span> <span class="ns">toml::</span><span class="n">parse_file</span><span class="p">(</span><span class="s">"configuration.toml"</span><span class="p">);</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">tbl</span><span class="p">)</span>
|
|
<span class="p">{</span>
|
|
<span class="ns">std::</span><span class="n">cerr</span>
|
|
<span class="o"><<</span> <span class="s">"Error parsing file '"</span> <span class="o"><<</span> <span class="o">*</span><span class="n">tbl</span><span class="p">.</span><span class="n">error</span><span class="p">().</span><span class="n">source</span><span class="p">().</span><span class="n">path</span>
|
|
<span class="o"><<</span> <span class="s">"':</span><span class="se">\n</span><span class="s">"</span> <span class="o"><<</span> <span class="n">tbl</span><span class="p">.</span><span class="n">error</span><span class="p">().</span><span class="n">description</span><span class="p">()</span>
|
|
<span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s"> ("</span> <span class="o"><<</span> <span class="n">tbl</span><span class="p">.</span><span class="n">error</span><span class="p">().</span><span class="n">source</span><span class="p">().</span><span class="n">begin</span> <span class="o"><<</span> <span class="s">")</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="n">do_stuff_with_your_config</span><span class="p">(</span><span class="n">tbl</span><span class="p">);</span> <span class="c1">//toml::parse_result is convertible to toml::table</span>
|
|
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
|
|
<span class="p">}</span></pre><p>Instances of <a class="m-doc" href="classtoml_1_1parse__error.html">toml::<wbr/>parse_error</a> can be printed directly to streams:</p><pre class="m-code"><span class="k">try</span>
|
|
<span class="p">{</span>
|
|
<span class="k">auto</span> <span class="n">tbl</span> <span class="o">=</span> <span class="ns">toml::</span><span class="n">parse</span><span class="p">(</span><span class="s">"enabled = trUe"</span><span class="sa">sv</span><span class="p">);</span> <span class="c1">//fails; TOML booleans are case-sensitive</span>
|
|
<span class="p">}</span>
|
|
<span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="ns">toml::</span><span class="ut">parse_error</span> <span class="o">&</span> <span class="n">err</span><span class="p">)</span>
|
|
<span class="p">{</span>
|
|
<span class="ns">std::</span><span class="n">cerr</span> <span class="o"><<</span> <span class="s">"Parsing failed:</span><span class="se">\n</span><span class="s">"</span> <span class="o"><<</span> <span class="n">err</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
|
|
<span class="p">}</span></pre><pre class="m-console"><span class="go">Parsing failed:</span>
|
|
<span class="go">Encountered unexpected character while parsing boolean; expected 'true', saw 'trU'</span>
|
|
<span class="go"> (error occurred at line 1, column 13)</span></pre><p>If the default error formatting is not be suitable for your use-case you can access the error's <a class="m-doc" href="structtoml_1_1source__region.html">toml::<wbr/>source_region</a> and description directly from the error object (as in the examples above).</p><aside class="m-note m-default"><h4>See also</h4><ul><li><a class="m-doc" href="namespacetoml.html#a1000595fe5e209e6fb5278ec0492d13d">toml::<wbr/>parse_file()</a><br/></li><li><a class="m-doc" href="classtoml_1_1parse__result.html">toml::<wbr/>parse_result</a><br/></li><li><a class="m-doc" href="classtoml_1_1parse__error.html">toml::<wbr/>parse_error</a><br/></li><li><a class="m-doc" href="structtoml_1_1source__region.html">toml::<wbr/>source_region</a><br/></li><li><a class="m-doc" href="structtoml_1_1source__position.html">toml::<wbr/>source_position</a></li></ul></aside></section><section id="mainpage-example-parsing-strings"><h3><a href="#mainpage-example-parsing-strings">Parsing TOML directly from strings and streams</a></h3><p>Strings and <a class="m-doc tpp-injected tpp-external" href="https://en.cppreference.com/w/cpp/io/basic_istream" target="_blank">std::istreams</a> can be read directly using <a class="m-doc" href="namespacetoml.html#ada8654fb4ceef15c20fc1d5e0cc734dd">toml::<wbr/>parse()</a>:</p><pre class="m-code"><span class="cp">#include</span> <span class="cpf"><iostream></span><span class="cp"></span>
|
|
<span class="cp">#include</span> <span class="cpf"><sstream></span><span class="cp"></span>
|
|
<span class="cp">#include</span> <span class="cpf"><toml++/toml.h></span><span class="cp"></span>
|
|
<span class="k">using</span> <span class="k">namespace</span> <span class="ns">std::</span><span class="n">string_view_literals</span><span class="p">;</span>
|
|
|
|
<span class="ut">int</span> <span class="nf">main</span><span class="p">()</span>
|
|
<span class="p">{</span>
|
|
<span class="k">static</span> <span class="k">constexpr</span> <span class="k">auto</span> <span class="n">source</span> <span class="o">=</span> <span class="sa">R</span><span class="s">"</span><span class="dl">(</span><span class="s"></span>
|
|
<span class="s"> [library]</span>
|
|
<span class="s"> name = "toml++"</span>
|
|
<span class="s"> authors = ["Mark Gillard <mark.gillard@outlook.com.au>"]</span>
|
|
<span class="s"> </span>
|
|
<span class="s"> [dependencies]</span>
|
|
<span class="s"> cpp = 17</span>
|
|
<span class="s"> </span><span class="dl">)</span><span class="s">"</span><span class="sa">sv</span><span class="p">;</span>
|
|
|
|
<span class="c1">// parse directly from a string view:</span>
|
|
<span class="p">{</span>
|
|
<span class="k">auto</span> <span class="n">tbl</span> <span class="o">=</span> <span class="ns">toml::</span><span class="n">parse</span><span class="p">(</span><span class="n">source</span><span class="p">);</span>
|
|
<span class="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">tbl</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="c1">// parse from a string stream:</span>
|
|
<span class="p">{</span>
|
|
<span class="ns">std::</span><span class="ut">stringstream</span> <span class="n">ss</span><span class="p">{</span> <span class="ns">std::</span><span class="ut">string</span><span class="p">{</span> <span class="n">source</span> <span class="p">}</span> <span class="p">};</span>
|
|
<span class="k">auto</span> <span class="n">tbl</span> <span class="o">=</span> <span class="ns">toml::</span><span class="n">parse</span><span class="p">(</span><span class="n">ss</span><span class="p">);</span>
|
|
<span class="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">tbl</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
|
|
<span class="p">}</span></pre><pre class="m-console"><span class="go">[dependencies]</span>
|
|
<span class="go">cpp = 17</span>
|
|
|
|
<span class="go">[library]</span>
|
|
<span class="go">authors = ["Mark Gillard <mark@notarealwebsite.com>"]</span>
|
|
<span class="go">name = "toml++"</span>
|
|
|
|
<span class="go">... exactly as above, but twice</span></pre><aside class="m-note m-default"><h4>See also</h4><p><a class="m-doc" href="namespacetoml.html#ada8654fb4ceef15c20fc1d5e0cc734dd">toml::<wbr/>parse()</a><br/></p></aside></section><section id="mainpage-example-manipulations"><h3><a href="#mainpage-example-manipulations">Traversing and manipulating data</a></h3><p>A TOML document is a tree of values, arrays and tables, represented as the <a class="m-doc" href="classtoml_1_1value.html">toml::<wbr/>value</a>, <a class="m-doc" href="classtoml_1_1array.html">toml::<wbr/>array</a> and <a class="m-doc" href="classtoml_1_1table.html">toml::<wbr/>table</a>, respectively. All three inherit from <a class="m-doc" href="classtoml_1_1node.html">toml::<wbr/>node</a>, and can be easily accessed via the <a class="m-doc" href="classtoml_1_1node__view.html">toml::<wbr/>node_view</a>:</p><pre class="m-code"><span class="cp">#include</span> <span class="cpf"><iostream></span><span class="cp"></span>
|
|
<span class="cp">#include</span> <span class="cpf"><toml++/toml.h></span><span class="cp"></span>
|
|
<span class="k">using</span> <span class="k">namespace</span> <span class="ns">std::</span><span class="n">string_view_literals</span><span class="p">;</span>
|
|
|
|
<span class="ut">int</span> <span class="nf">main</span><span class="p">()</span>
|
|
<span class="p">{</span>
|
|
<span class="k">static</span> <span class="k">constexpr</span> <span class="k">auto</span> <span class="n">source</span> <span class="o">=</span> <span class="sa">R</span><span class="s">"</span><span class="dl">(</span><span class="s"></span>
|
|
<span class="s"> numbers = [ 1, 2, 3, "four", 5.0 ]</span>
|
|
<span class="s"> vegetables = [ "tomato", "onion", "mushroom", "lettuce" ]</span>
|
|
<span class="s"> minerals = [ "quartz", "iron", "copper", "diamond" ]</span>
|
|
|
|
<span class="s"> [animals]</span>
|
|
<span class="s"> cats = [ "tiger", "lion", "puma" ]</span>
|
|
<span class="s"> birds = [ "macaw", "pigeon", "canary" ]</span>
|
|
<span class="s"> fish = [ "salmon", "trout", "carp" ]</span>
|
|
|
|
<span class="s"> </span><span class="dl">)</span><span class="s">"</span><span class="sa">sv</span><span class="p">;</span>
|
|
<span class="k">auto</span> <span class="n">tbl</span> <span class="o">=</span> <span class="ns">toml::</span><span class="n">parse</span><span class="p">(</span><span class="n">source</span><span class="p">);</span>
|
|
|
|
<span class="c1">// get a view of the element 'numbers'</span>
|
|
<span class="k">auto</span> <span class="n">numbers</span> <span class="o">=</span> <span class="n">tbl</span><span class="p">[</span><span class="s">"numbers"</span><span class="p">];</span>
|
|
<span class="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"table has 'numbers': "</span> <span class="o"><<</span> <span class="o">!!</span><span class="n">numbers</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
|
|
<span class="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"numbers is a: "</span> <span class="o"><<</span> <span class="n">numbers</span><span class="p">.</span><span class="n">type</span><span class="p">()</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
|
|
<span class="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"numbers: "</span> <span class="o"><<</span> <span class="n">numbers</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
|
|
|
|
<span class="c1">// get the underlying array object to do some more advanced stuff</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="k">auto</span> <span class="n">arr</span> <span class="o">=</span> <span class="n">numbers</span><span class="p">.</span><span class="n">as_array</span><span class="p">())</span>
|
|
<span class="p">{</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="k">auto</span><span class="o">&</span> <span class="nl">elem</span> <span class="p">:</span> <span class="o">*</span><span class="n">arr</span><span class="p">)</span>
|
|
<span class="p">{</span>
|
|
<span class="c1">// visitation helps deal with the polymorphic nature of TOML data</span>
|
|
<span class="n">elem</span><span class="p">.</span><span class="n">visit</span><span class="p">([](</span><span class="k">auto</span><span class="o">&&</span> <span class="n">el</span><span class="p">)</span> <span class="k">noexcept</span>
|
|
<span class="p">{</span>
|
|
<span class="k">if</span> <span class="k">constexpr</span> <span class="p">(</span><span class="ns">toml::</span><span class="n">is_number</span><span class="o"><</span><span class="k">decltype</span><span class="p">(</span><span class="n">el</span><span class="p">)</span><span class="o">></span><span class="p">)</span>
|
|
<span class="p">(</span><span class="o">*</span><span class="n">el</span><span class="p">)</span><span class="o">++</span><span class="p">;</span>
|
|
<span class="k">else</span> <span class="k">if</span> <span class="k">constexpr</span> <span class="p">(</span><span class="ns">toml::</span><span class="n">is_string</span><span class="o"><</span><span class="k">decltype</span><span class="p">(</span><span class="n">el</span><span class="p">)</span><span class="o">></span><span class="p">)</span>
|
|
<span class="n">el</span> <span class="o">=</span> <span class="s">"five"</span><span class="sa">sv</span><span class="p">;</span>
|
|
<span class="p">});</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="c1">// arrays are very similar to <a class="m-doc tpp-injected tpp-external" href="https://en.cppreference.com/w/cpp/container/vector" target="_blank">std::vector</a></span>
|
|
<span class="n">arr</span><span class="o">-></span><span class="n">push_back</span><span class="p">(</span><span class="mi">7</span><span class="p">);</span>
|
|
<span class="n">arr</span><span class="o">-></span><span class="n">emplace_back</span><span class="o"><</span><span class="ns">toml::</span><span class="ut">array</span><span class="o">></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="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"numbers: "</span> <span class="o"><<</span> <span class="n">numbers</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="c1">// node-views can be chained to quickly query deeper</span>
|
|
<span class="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"cats: "</span> <span class="o"><<</span> <span class="n">tbl</span><span class="p">[</span><span class="s">"animals"</span><span class="p">][</span><span class="s">"cats"</span><span class="p">]</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
|
|
<span class="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"fish[1]: "</span> <span class="o"><<</span> <span class="n">tbl</span><span class="p">[</span><span class="s">"animals"</span><span class="p">][</span><span class="s">"fish"</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
|
|
|
|
<span class="c1">// ...even if the element doesn't exist</span>
|
|
<span class="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"dinosaurs: "</span> <span class="o"><<</span> <span class="n">tbl</span><span class="p">[</span><span class="s">"animals"</span><span class="p">][</span><span class="s">"dinosaurs"</span><span class="p">]</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <span class="c1">//no dinosaurs :(</span>
|
|
|
|
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
|
|
<span class="p">}</span></pre><pre class="m-console"><span class="go">table has 'numbers': true</span>
|
|
<span class="go">numbers is an: array</span>
|
|
<span class="go">numbers: [1, 2, 3, "four", 5.0]</span>
|
|
<span class="go">numbers: [2, 3, 4, "five", 6.0, 7, [8, 9]]</span>
|
|
<span class="go">cats: ["tiger", "lion", "puma"]</span>
|
|
<span class="go">fish[1]: "trout"</span>
|
|
<span class="go">dinosaurs:</span></pre><aside class="m-note m-default"><h4>See also</h4><ul><li><a class="m-doc" href="classtoml_1_1node.html">toml::<wbr/>node</a></li><li><a class="m-doc" href="classtoml_1_1node__view.html">toml::<wbr/>node_view</a></li><li><a class="m-doc" href="classtoml_1_1value.html">toml::<wbr/>value</a></li><li><a class="m-doc" href="classtoml_1_1array.html">toml::<wbr/>array</a></li><li><a class="m-doc" href="classtoml_1_1table.html">toml::<wbr/>table</a></li></ul></aside></section><section id="mainpage-example-serialization"><h3><a href="#mainpage-example-serialization">Serializing as TOML and JSON</a></h3><pre class="m-code"><span class="cp">#include</span> <span class="cpf"><iostream></span><span class="cp"></span>
|
|
<span class="cp">#include</span> <span class="cpf"><toml++/toml.h></span><span class="cp"></span>
|
|
|
|
<span class="ut">int</span> <span class="nf">main</span><span class="p">()</span>
|
|
<span class="p">{</span>
|
|
<span class="k">auto</span> <span class="n">tbl</span> <span class="o">=</span> <span class="ns">toml::</span><span class="ut">table</span><span class="p">{{</span>
|
|
<span class="p">{</span> <span class="s">"lib"</span><span class="p">,</span> <span class="s">"toml++"</span> <span class="p">},</span>
|
|
<span class="p">{</span> <span class="s">"cpp"</span><span class="p">,</span> <span class="ns">toml::</span><span class="ut">array</span><span class="p">{</span> <span class="mi">17</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="s">"and beyond"</span> <span class="p">}</span> <span class="p">},</span>
|
|
<span class="p">{</span> <span class="s">"toml"</span><span class="p">,</span> <span class="ns">toml::</span><span class="ut">array</span><span class="p">{</span> <span class="s">"1.0.0"</span><span class="p">,</span> <span class="s">"and beyond"</span> <span class="p">}</span> <span class="p">},</span>
|
|
<span class="p">{</span> <span class="s">"repo"</span><span class="p">,</span> <span class="s">"https://github.com/marzer/tomlplusplus/"</span> <span class="p">},</span>
|
|
<span class="p">{</span> <span class="s">"author"</span><span class="p">,</span> <span class="ns">toml::</span><span class="ut">table</span><span class="p">{{</span>
|
|
<span class="p">{</span> <span class="s">"name"</span><span class="p">,</span> <span class="s">"Mark Gillard"</span> <span class="p">},</span>
|
|
<span class="p">{</span> <span class="s">"github"</span><span class="p">,</span> <span class="s">"https://github.com/marzer"</span> <span class="p">},</span>
|
|
<span class="p">{</span> <span class="s">"twitter"</span><span class="p">,</span> <span class="s">"https://twitter.com/marzer8789"</span> <span class="p">}</span>
|
|
<span class="p">}}</span>
|
|
<span class="p">},</span>
|
|
<span class="p">}};</span>
|
|
|
|
<span class="c1">// serializing as TOML is just writing it to a stream</span>
|
|
<span class="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"###### TOML ######"</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n\n</span><span class="s">"</span><span class="p">;</span>
|
|
<span class="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">tbl</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n\n</span><span class="s">"</span><span class="p">;</span>
|
|
|
|
<span class="c1">// serializing as JSON is _also_ just writing it to a stream, but via a json_formatter:</span>
|
|
<span class="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"###### JSON ######"</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n\n</span><span class="s">"</span><span class="p">;</span>
|
|
<span class="ns">std::</span><span class="n">cout</span> <span class="o"><<</span> <span class="ns">toml::</span><span class="ut">json_formatter</span><span class="p">{</span> <span class="n">tbl</span> <span class="p">}</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n\n</span><span class="s">"</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
|
|
<span class="p">}</span></pre><pre class="m-console"><span class="gp">#</span><span class="c1">##### TOML ######</span>
|
|
|
|
<span class="go">cpp = [17, 20, "and beyond"]</span>
|
|
<span class="go">lib = "toml++"</span>
|
|
<span class="go">repo = "https://github.com/marzer/tomlplusplus/"</span>
|
|
<span class="go">toml = ["1.0.0", "and beyond"]</span>
|
|
|
|
<span class="go">[author]</span>
|
|
<span class="go">github = "https://github.com/marzer"</span>
|
|
<span class="go">name = "Mark Gillard"</span>
|
|
<span class="go">twitter = "https://twitter.com/marzer8789"</span>
|
|
|
|
<span class="gp">#</span><span class="c1">##### JSON ######</span>
|
|
|
|
<span class="go">{</span>
|
|
<span class="go"> "author" : {</span>
|
|
<span class="go"> "github" : "https://github.com/marzer",</span>
|
|
<span class="go"> "name" : "Mark Gillard",</span>
|
|
<span class="go"> "twitter" : "https://twitter.com/marzer8789"</span>
|
|
<span class="go"> },</span>
|
|
<span class="go"> "cpp" : [</span>
|
|
<span class="go"> 17,</span>
|
|
<span class="go"> 20,</span>
|
|
<span class="go"> "and beyond"</span>
|
|
<span class="go"> ],</span>
|
|
<span class="go"> "lib" : "toml++",</span>
|
|
<span class="go"> "repo" : "https://github.com/marzer/tomlplusplus/",</span>
|
|
<span class="go"> "toml" : [</span>
|
|
<span class="go"> "1.0.0",</span>
|
|
<span class="go"> "and beyond"</span>
|
|
<span class="go"> ]</span>
|
|
<span class="go">}</span></pre><aside class="m-note m-default"><h4>See also</h4><ul><li><a class="m-doc" href="classtoml_1_1default__formatter.html">toml::<wbr/>default_formatter</a></li><li><a class="m-doc" href="classtoml_1_1json__formatter.html">toml::<wbr/>json_formatter</a></li></ul></aside></section><section id="mainpage-example-speed-up-compilation"><h3><a href="#mainpage-example-speed-up-compilation">Speeding up compilation</a></h3><p>Because <code>toml++</code> is a header-only library of nontrivial size you might find that compilation times noticeably increase after you add it to your project, especially if you add the library's header somewhere that's visible from a large number of translation units. You can counter this by disabling 'all inline' mode and explicitly controlling where the library's implementation is compiled.</p><p><strong>Step 1: Set <code>TOML_ALL_INLINE</code> to <code>0</code> before including <code>toml++</code></strong></p><p>This must be the same everywhere, so either set it as a global <code>#define</code> in your build system, or do it manually before including toml++ in some global header that's used everywhere in your project:</p><pre class="m-code"><span class="c1">// global_header_that_includes_toml++.h</span>
|
|
|
|
<span class="cp">#define TOML_ALL_INLINE 0</span>
|
|
<span class="cp">#include</span> <span class="cpf"><toml.hpp></span><span class="cp"></span></pre><p><strong>Step 2: Define <code>TOML_IMPLEMENTATION</code> before including <code>toml++</code> in one specific translation unit</strong></p><pre class="m-code"><span class="c1">// some_code_file.cpp</span>
|
|
|
|
<span class="cp">#define TOML_IMPLEMENTATION </span>
|
|
<span class="cp">#include</span> <span class="cpf">"global_header_that_includes_toml++.h"</span><span class="cp"></span></pre></section></section><section id="mainpage-contributing"><h2><a href="#mainpage-contributing">Contributing</a></h2><p>Contributions are very welcome! Either by <a href="https://github.com/marzer/tomlplusplus/issues">reporting issues</a> or submitting pull requests. If you wish to submit a pull request, please see <a href="https://github.com/marzer/tomlplusplus/blob/master/CONTRIBUTING.md">CONTRIBUTING</a> for all the details you need to get going.</p></section><section id="mainpage-license"><h2><a href="#mainpage-license">License</a></h2><p>toml++ is licensed under the terms of the MIT license - see <a href="https://github.com/marzer/tomlplusplus/blob/master/LICENSE">LICENSE</a>.</p><p class="m-note m-default">If you're using the single-header version of the library you don't need to explicitly distribute the license file; it is embedded in the preamble at the top of the header.</p></section><section id="mainpage-contact"><h2><a href="#mainpage-contact">Contacting the author</a></h2><p>For bug reports and feature requests please consider using the <a href="https://github.com/marzer/tomlplusplus/issues">GitHub issues</a> system. For anything else though you're welcome to reach out via other means. In order of likely response speed:</p><ul><li>Twitter: <a href="https://twitter.com/marzer8789">marzer8789</a></li><li>Email: <a href="mailto:mark.gillard@outlook.com.au">mark.gillard@outlook.com.au</a></li><li>Facebook: <a href="https://www.facebook.com/marzer">marzer</a></li><li>LinkedIn: <a href="https://www.linkedin.com/in/marzer/">marzer</a></li></ul></section>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</article></main>
|
|
<div class="m-doc-search" id="search">
|
|
<a href="#!" onclick="return hideSearch()"></a>
|
|
<div class="m-container">
|
|
<div class="m-row">
|
|
<div class="m-col-m-8 m-push-m-2">
|
|
<div class="m-doc-search-header m-text m-small">
|
|
<div><span class="m-label m-default">Tab</span> / <span class="m-label m-default">T</span> to search, <span class="m-label m-default">Esc</span> to close</div>
|
|
<div id="search-symbolcount">…</div>
|
|
</div>
|
|
<div class="m-doc-search-content">
|
|
<form>
|
|
<input autocomplete="off" autofocus="autofocus" disabled="disabled" id="search-input" name="q" placeholder="Loading …" spellcheck="false" type="search"/>
|
|
</form>
|
|
<noscript class="m-text m-danger m-text-center">Unlike everything else in the docs, the search functionality <em>requires</em> JavaScript.</noscript>
|
|
<div class="m-text m-dim m-text-center" id="search-help">
|
|
<p class="m-noindent">Search for symbols, directories, files, pages or
|
|
modules. You can omit any prefix from the symbol or file path; adding a
|
|
<code>:</code> or <code>/</code> suffix lists all members of given symbol or
|
|
directory.</p>
|
|
<p class="m-noindent">Use <span class="m-label m-dim">↓</span>
|
|
/ <span class="m-label m-dim">↑</span> to navigate through the list,
|
|
<span class="m-label m-dim">Enter</span> to go.
|
|
<span class="m-label m-dim">Tab</span> autocompletes common prefix, you can
|
|
copy a link to the result using <span class="m-label m-dim">⌘</span>
|
|
<span class="m-label m-dim">L</span> while <span class="m-label m-dim">⌘</span>
|
|
<span class="m-label m-dim">M</span> produces a Markdown link.</p>
|
|
</div>
|
|
<div class="m-text m-warning m-text-center" id="search-notfound">Sorry, nothing was found.</div>
|
|
<ul id="search-results"></ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<script src="search-v1.js"></script>
|
|
<script async="async" src="searchdata-v1.js"></script>
|
|
<footer><nav>
|
|
<div class="m-container">
|
|
<div class="m-row">
|
|
<div class="m-col-l-10 m-push-l-1">
|
|
<a href="https://github.com/marzer/tomlplusplus/" target="_blank">Github</a>
|
|
•
|
|
|
|
<a href="https://github.com/marzer/tomlplusplus/issues" target="_blank">Report
|
|
an
|
|
issue</a>
|
|
|
|
<br/><br/>Documentation
|
|
generated
|
|
using
|
|
<a href="https://mcss.mosra.cz/">m.css</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</nav></footer>
|
|
|
|
|
|
</body></html> |