[hard fork] the existing library is written by some orange site/reddit lurking midwit incapable of adding custom types. on the other hand, they have no problem filling the repo with ~70klocs of third party shit, tests, fuzzers that in all reality arent going to catch any real bugs, and autogenerated project files.
Go to file
Mark Gillard 9066ac7d01 fixed strong exception guarantee edge-cases
also:
- added `value` copy+move constructor overloads with flags override
`table::ref()` now supports explicit ref categories and cv-qualifiers
2021-11-14 19:24:19 +02:00
.circleci project-wide refactoring 2021-10-23 18:20:49 +03:00
.github removed final from value, array and table 2021-10-31 17:58:42 +02:00
cmake add cpp.hint to cmake install 2021-05-30 18:43:18 +03:00
docs added toml::key (closes #82) 2021-11-10 22:07:05 +02:00
examples refactoring 2021-11-11 17:54:40 +02:00
external added array::replace() (closes #109) 2021-11-06 18:59:47 +02:00
include/toml++ fixed strong exception guarantee edge-cases 2021-11-14 19:24:19 +02:00
tests fixed strong exception guarantee edge-cases 2021-11-14 19:24:19 +02:00
tools parser performance improvements 2021-11-09 13:08:36 +02:00
.clang-format added clang's enum annotation attributes to all enums 2021-11-07 16:36:31 +02:00
.editorconfig documentation fixes, redux 2021-05-09 19:27:08 +03:00
.gitattributes added clang's enum annotation attributes to all enums 2021-11-07 16:36:31 +02:00
.gitignore restructuring and minor refactoring 2021-04-18 22:58:41 +03:00
.gitmodules restructuring and minor refactoring 2021-04-18 22:58:41 +03:00
.runsettings minor config fixes [skip ci] 2021-05-19 23:22:43 +03:00
CHANGELOG.md fixed strong exception guarantee edge-cases 2021-11-14 19:24:19 +02:00
CMakeLists.txt greatly simplified project header structure 2021-10-25 01:04:23 +03:00
CODE_OF_CONDUCT.md Added code of conduct [skip ci] 2020-02-24 22:01:54 +02:00
CONTRIBUTING.md added clang's enum annotation attributes to all enums 2021-11-07 16:36:31 +02:00
cpp.hint added clang's enum annotation attributes to all enums 2021-11-07 16:36:31 +02:00
LICENSE update copyright year [skip ci] 2021-01-02 17:48:47 +02:00
meson_options.txt meson refactoring 2020-09-05 13:26:12 +03:00
meson.build added toml::yaml_formatter 2021-11-03 12:18:53 +02:00
README.md parser performance improvements 2021-11-09 13:08:36 +02:00
toml.hpp fixed strong exception guarantee edge-cases 2021-11-14 19:24:19 +02:00
toml++.natvis added toml::key (closes #82) 2021-11-10 22:07:05 +02:00
toml++.props fixed segfault JSON-formatting a failed parse_result (closes #96) 2021-05-06 14:28:29 +03:00
toml++.sln added parse_benchmark example 2021-11-04 11:56:03 +02:00
toml++.vcxproj added toml::key (closes #82) 2021-11-10 22:07:05 +02:00
toml++.vcxproj.filters added toml::key (closes #82) 2021-11-10 22:07:05 +02:00

banner
Releases C++17 C++20 TOML MIT license CircleCI Mentioned in Awesome C++

toml++ homepage

This README is fine, but the toml++ homepage is better.


Library features

  • Header-only
  • Supports the latest TOML release (v1.0.0), plus optional support for some unreleased TOML language features
  • C++17 (plus some C++20 features where available, e.g. experimental support for char8_t strings)
  • Proper UTF-8 handling (incl. BOM)
  • Works with or without exceptions
  • Doesn't require RTTI
  • Support for serializing to JSON and YAML
  • Tested on Clang (6+), GCC (7+) and MSVC (VS2019, VS2022)
  • Tested on x64, x86 and ARM

Basic usage

The following example favours brevity. If you'd prefer full API documentation and lots of specific code snippets instead, visit the project homepage

Given a TOML file configuration.toml containing the following:

[library]
name = "toml++"
authors = ["Mark Gillard <mark.gillard@outlook.com.au>"]

[dependencies]
cpp = 17

Reading it in C++ is easy with toml++:

#include <toml.hpp>

auto config = toml::parse_file( "configuration.toml" );

// get key-value pairs
std::string_view library_name = config["library"]["name"].value_or(""sv);
std::string_view library_author = config["library"]["authors"][0].value_or(""sv);
int64_t depends_on_cpp_version = config["dependencies"]["cpp"].value_or(0);

// modify the data
config.insert_or_assign("alternatives", toml::array{
    "cpptoml",
    "toml11",
    "Boost.TOML"
});

// iterate & visit over the data
for (auto&& [k, v] : config)
{
    v.visit([](auto& node) noexcept
    {
        std::cout << node << "\n";
        if constexpr (toml::is_string<decltype(node)>)
            do_something_with_string_values(node);
    });
}

// re-serialize as TOML
std::cout << config << "\n";

// re-serialize as JSON
std::cout << toml::json_formatter{ config } << "\n";

// re-serialize as YAML
std::cout << toml::yaml_formatter{ config } << "\n";

You'll find some more code examples in the examples directory, and plenty more as part of the API documentation.


Adding toml++ to your project

toml++ comes in two flavours: Single-header and Regular. The API is the same for both.

🍦 Single-header flavour

  1. Drop toml.hpp wherever you like in your source tree
  2. There is no step two

🍨 Regular flavour

  1. Add tomlplusplus/include to your include paths
  2. #include <toml++/toml.h>

Conan

Add tomlplusplus/3.0.0 to your conanfile.

DDS

Add tomlpp to your package.json5, e.g.:

depends: [
    'tomlpp^3.0.0',
]

What is DDS?

Vcpkg

vcpkg install tomlplusplus

CMake FetchContent

include(FetchContent)
FetchContent_Declare(
    tomlplusplus
    GIT_REPOSITORY https://github.com/marzer/tomlplusplus.git
    GIT_TAG        v3.0.0
)
FetchContent_MakeAvailable(tomlplusplus)

What is FetchContent?

Other environments and package managers

toml++ is a fairly new project and I'm not up-to-speed with all of the available packaging and integration options in the C++ ecosystem. I'm also a cmake novice, for better or worse. If there's an integration option missing be assured that I fully support it being added, and welcome pull requests!


Configuration

A number of configurable options are exposed in the form of preprocessor #defines Most likely you won't need to mess with these at all, but if you do, set them before including toml++.

Option Type Description Default
TOML_API define API annotation to add to public symbols (e.g. __declspec(dllexport) on Windows). undefined
TOML_ASSERT(expr) function macro Sets the assert function used by the library. assert()
TOML_CONFIG_HEADER string literal Includes the given header file before the rest of the library. undefined
TOML_ENABLE_FORMATTERS boolean Enables the formatters. Set to 0 if you don't need them to improve compile times and binary size. 1
TOML_ENABLE_PARSER boolean Enables the parser. Set to 0 if you don't need it to improve compile times and binary size. 1
TOML_ENABLE_UNRELEASED_FEATURES boolean Enables support for unreleased TOML language features. 0
TOML_ENABLE_WINDOWS_COMPAT boolean Enables support for transparent conversion between wide and narrow strings. 1 on Windows
TOML_EXCEPTIONS boolean Sets whether the library uses exceptions. per compiler settings
TOML_HEADER_ONLY boolean Disable this to explicitly control where toml++'s implementation is compiled (e.g. as part of a library). 1
TOML_IMPLEMENTATION define Define this to enable compilation of the library's implementation when TOML_HEADER_ONLY == 0. undefined
TOML_OPTIONAL_TYPE type name Overrides the optional<T> type used by the library if you need something better than std::optional. undefined
TOML_SMALL_FLOAT_TYPE type name If your codebase has a custom 'small float' type (e.g. half-precision), this tells toml++ about it. undefined
TOML_SMALL_INT_TYPE type name If your codebase has a custom 'small integer' type (e.g. 24-bits), this tells toml++ about it. undefined

A number of these have ABI implications; the library uses inline namespaces to prevent you from accidentally linking incompatible combinations together.


TOML Language Support

At any given time the library aims to support whatever the most recently-released version of TOML is, with opt-in support for a number of unreleased features from the TOML master and some sane cherry-picks from the TOML issues list where the discussion strongly indicates inclusion in a near-future release.

The library advertises the most recent numbered language version it fully supports via the preprocessor defines TOML_LANG_MAJOR, TOML_LANG_MINOR and TOML_LANG_PATCH.

Unreleased language features:

  • #516: Allow newlines and trailing commas in inline tables
  • #562: Allow hex floating-point values
  • #644: Support + in key names
  • #671: Local time of day format should support 09:30 as opposed to 09:30:00
  • #687: Relax bare key restrictions to allow additional unicode characters
  • #796: Include an \xHH escape code sequence

#define TOML_ENABLE_UNRELEASED_FEATURES 1 to enable these features (see Configuration).

🔹 TOML v1.0.0:

All features supported, including:

  • #356: Allow leading zeros in the exponent part of a float
  • #567: Control characters are not permitted in comments
  • #571: Allow raw tabs inside strings
  • #665: Make arrays heterogeneous
  • #766: Allow comments before commas in arrays

🔹 TOML v0.5.0:

All features supported.


Contributing

Contributions are very welcome! Either by reporting issues or submitting pull requests. If you wish to submit a pull request, please see CONTRIBUTING for all the details you need to get going.


License and Attribution

toml++ is licensed under the terms of the MIT license - see LICENSE.

UTF-8 decoding is performed using a state machine based on Bjoern Hoehrmann's 'Flexible and Economical UTF-8 Decoder'.

With thanks to:


Contact

For bug reports and feature requests please consider using the issues system here on GitHub. For anything else though you're welcome to reach out via other means. In order of likely response time: