2021-04-18 12:04:46 +00:00
[![banner ](docs/images/banner_small.png )][homepage]
2020-04-02 21:39:21 +00:00
[![Releases ](https://img.shields.io/github/v/release/marzer/tomlplusplus?style=flat-square )](https://github.com/marzer/tomlplusplus/releases)
2021-04-18 12:04:46 +00:00
[![C++17 ](docs/images/badge-C++17.svg )][cpp_compilers]
[![C++20 ](docs/images/badge-C++20.svg )][cpp_compilers]
[![TOML ](docs/images/badge-TOML.svg )][v1.0.0]
[![MIT license ](docs/images/badge-license-MIT.svg )](./LICENSE)
2020-04-02 21:39:21 +00:00
[![CircleCI ](https://img.shields.io/circleci/build/github/marzer/tomlplusplus?label=circle%20ci&logo=circleci&logoColor=white&style=flat-square )](https://circleci.com/gh/marzer/tomlplusplus)
2021-04-18 12:04:46 +00:00
[![Mentioned in Awesome C++ ](docs/images/badge-awesome.svg )](https://github.com/fffaraz/awesome-cpp)
2020-04-02 21:39:21 +00:00
====
2020-07-02 17:17:23 +00:00
# toml++ homepage
< p align = "center" >
2021-04-18 12:04:46 +00:00
< strong > ✨️ This README is fine, but the < a href = "https://marzer.github.io/tomlplusplus/" > toml++ homepage< / a > is better. ✨️ < / strong >
2020-07-02 17:17:23 +00:00
< / p >
< br >
# Library features
2020-02-25 22:09:02 +00:00
- Header-only
2021-01-13 08:59:15 +00:00
- Supports the latest [TOML] release ([v1.0.0]), plus optional support for some [unreleased TOML language features]
2020-02-23 11:13:18 +00:00
- C++17 (plus some C++20 features where available, e.g. experimental support for char8_t strings)
2020-02-22 14:10:32 +00:00
- Proper UTF-8 handling (incl. BOM)
- Works with or without exceptions
- Doesn't require RTTI
- First-class support for serializing to JSON
2020-07-30 20:31:08 +00:00
- Tested on Clang (6+), GCC (7+) and MSVC (VS2019)
2020-03-28 16:56:59 +00:00
- Tested on x64, x86 and ARM
2020-01-13 06:31:49 +00:00
< br >
2020-04-01 12:53:10 +00:00
# Basic usage
2020-01-13 06:31:49 +00:00
2021-04-18 12:04:46 +00:00
> ℹ ️ _The following example favours brevity. If you'd prefer full API documentation and lots of specific code snippets
2020-08-11 15:29:40 +00:00
instead, visit the project [homepage]_
2020-04-03 13:49:33 +00:00
2020-06-24 11:28:20 +00:00
Given a [TOML] file `configuration.toml` containing the following:
2020-02-03 09:12:43 +00:00
```toml
[library]
name = "toml++"
2020-04-02 21:39:21 +00:00
authors = ["Mark Gillard < mark.gillard @ outlook . com . au > "]
2020-02-03 09:12:43 +00:00
[dependencies]
cpp = 17
```
2020-06-24 11:28:20 +00:00
Reading it in C++ is easy with toml++:
2020-01-13 06:31:49 +00:00
```cpp
2020-04-03 13:33:02 +00:00
#include <toml.hpp>
2020-02-03 09:12:43 +00:00
auto config = toml::parse_file( "configuration.toml" );
// get key-value pairs
2020-02-22 14:10:32 +00:00
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);
2020-02-03 09:12:43 +00:00
2020-02-16 13:11:57 +00:00
// modify the data
config.insert_or_assign("alternatives", toml::array{
2020-02-18 21:29:59 +00:00
"cpptoml",
"toml11",
"Boost.TOML"
2020-02-16 13:11:57 +00:00
});
// iterate & visit over the data
2020-04-03 13:33:02 +00:00
for (auto& & [k, v] : config)
2020-02-16 13:11:57 +00:00
{
2020-02-18 21:29:59 +00:00
v.visit([](auto& node) noexcept
{
2020-08-11 13:34:03 +00:00
std::cout < < node << " \n";
2020-02-18 21:29:59 +00:00
if constexpr (toml::is_string< decltype ( node ) > )
do_something_with_string_values(node);
});
2020-02-16 13:11:57 +00:00
}
// re-serialize as TOML
2020-08-11 13:34:03 +00:00
std::cout < < config << " \n";
2020-02-16 13:11:57 +00:00
2020-02-03 09:12:43 +00:00
// re-serialize as JSON
2020-08-11 13:34:03 +00:00
std::cout < < toml::json_formatter { config } << " \n";
2020-02-03 09:12:43 +00:00
2020-01-13 06:31:49 +00:00
```
2020-02-03 09:12:43 +00:00
You'll find some more code examples in the `examples` directory, and plenty more as part of the [API documentation].
2020-01-04 14:21:38 +00:00
< br >
2020-01-13 06:31:49 +00:00
# Adding toml++ to your project
2020-04-02 21:39:21 +00:00
`toml++` comes in two flavours: Single-header and Regular. The API is the same for both.
2021-04-18 12:04:46 +00:00
### 🍦️ Single-header flavour
2020-04-02 21:39:21 +00:00
1. Drop `toml.hpp` wherever you like in your source tree
2. There is no step two
2020-01-04 14:21:38 +00:00
2021-04-18 12:04:46 +00:00
### 🍨️ Regular flavour
2020-01-04 14:21:38 +00:00
1. Add `tomlplusplus/include` to your include paths
2. `#include <toml++/toml.h>`
2020-06-08 15:32:25 +00:00
### Conan
2021-08-11 15:42:00 +00:00
Add `tomlplusplus/2.5.0` to your conanfile.
2020-08-11 15:29:40 +00:00
### DDS
Add `tomlpp` to your `package.json5` , e.g.:
```
depends: [
2021-08-11 15:42:00 +00:00
'tomlpp^2.5.0',
2020-08-11 15:29:40 +00:00
]
```
2021-04-18 12:04:46 +00:00
> ℹ ️ _[What is DDS?](https://dds.pizza/)_
2020-08-11 15:29:40 +00:00
### Vcpkg
```
vcpkg install tomlplusplus
```
2021-05-19 10:24:25 +00:00
### CMake FetchContent
```
include(FetchContent)
FetchContent_Declare(
tomlplusplus
GIT_REPOSITORY https://github.com/marzer/tomlplusplus.git
2021-08-11 15:42:00 +00:00
GIT_TAG v2.5.0
2021-05-19 10:24:25 +00:00
)
FetchContent_MakeAvailable(tomlplusplus)
```
> ℹ ️ _[What is FetchContent?](https://cmake.org/cmake/help/latest/module/FetchContent.html)_
2020-08-11 15:29:40 +00:00
### 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 modern 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 ](./CONTRIBUTING.md )!
2020-01-04 14:21:38 +00:00
2020-04-02 21:39:21 +00:00
< br >
2020-01-04 14:21:38 +00:00
2020-04-02 21:39:21 +00:00
# Configuration
2020-02-03 09:12:43 +00:00
A number of configurable options are exposed in the form of preprocessor `#defines` . Most likely you
2020-02-27 17:52:10 +00:00
won't need to mess with these at all, but if you do, set them before including toml++.
2020-01-04 14:21:38 +00:00
2020-07-13 18:18:04 +00:00
| Option | Type | Default | Description |
|----------------------------|:--------------:|-----------------------------------|----------------------------------------------------------------------------------------------------------------------|
2020-07-25 17:37:30 +00:00
| `TOML_HEADER_ONLY` | boolean | `1` | Disable this to explicitly control where toml++'s implementation is compiled (e.g. as part of a library). |
2020-07-13 18:18:04 +00:00
| `TOML_API` | define | undefined | API annotation to add to public symbols (e.g. `__declspec(dllexport)` on Windows). |
| `TOML_ASSERT(expr)` | function macro | `assert(expr)` < br > (or undefined) | Sets the assert function used by the library. |
| `TOML_CONFIG_HEADER` | string literal | undefined | Includes the given header file before the rest of the library. |
| `TOML_EXCEPTIONS` | boolean | per your compiler's settings | Sets whether the library uses exceptions. |
2020-07-25 17:37:30 +00:00
| `TOML_IMPLEMENTATION` | define | undefined | Define this to enable compilation of the library's implementation. Meaningless if `TOML_HEADER_ONLY` is `1` . |
2020-07-13 18:18:04 +00:00
| `TOML_LARGE_FILES` | boolean | `0` | Uses 32-bit integers for line and column indices (instead of 16-bit). |
| `TOML_OPTIONAL_TYPE` | type name | undefined | Overrides the `optional<T>` type used by the library if you need [something better than std::optional]. |
| `TOML_PARSER` | boolean | `1` | Disable this to prevent inclusion of the parser-related parts of the library if you don't need them. |
| `TOML_SMALL_FLOAT_TYPE` | type name | undefined | If your codebase has an additional 'small' float type (e.g. half-precision), this tells toml++ about it. |
| `TOML_SMALL_INT_TYPE` | type name | undefined | If your codebase has an additional 'small' integer type (e.g. 24-bits), this tells toml++ about it. |
| `TOML_UNRELEASED_FEATURES` | boolean | `0` | Enables support for [unreleased TOML language features] not yet part of a [numbered version]. |
| `TOML_WINDOWS_COMPAT` | boolean | `1` on Windows | Enables support for transparent conversion between wide and narrow strings in some places when building for Windows. |
2020-01-04 14:21:38 +00:00
2021-04-18 12:04:46 +00:00
> ℹ ️ _A number of these have ABI implications; the library uses inline namespaces to prevent you from accidentally
2020-04-02 21:39:21 +00:00
linking incompatible combinations together._
2020-03-28 16:56:59 +00:00
2020-01-04 14:21:38 +00:00
< br >
# TOML Language Support
2020-06-24 11:28:20 +00:00
At any given time the library aims to support whatever the [most recently-released version] of TOML is, with opt-in
2020-04-10 16:46:00 +00:00
support for a number of unreleased features from the [TOML master] and some sane cherry-picks from the
2020-01-04 14:21:38 +00:00
[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
2020-02-20 21:08:20 +00:00
defines `TOML_LANG_MAJOR` , `TOML_LANG_MINOR` and `TOML_LANG_PATCH` .
2020-01-04 14:21:38 +00:00
2021-04-18 12:04:46 +00:00
### 🔸️ **Unreleased language features:**
2020-01-04 14:21:38 +00:00
- [#516]: Allow newlines and trailing commas in inline tables
2020-04-02 21:39:21 +00:00
- [#562]: Allow hex floating-point values
2020-01-04 14:21:38 +00:00
- [#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
2020-03-12 15:23:25 +00:00
- [#709]: Include an \xHH escape code sequence
2020-01-04 14:21:38 +00:00
2021-04-18 12:04:46 +00:00
> ℹ ️ _`#define TOML_UNRELEASED_FEATURES 1` to enable these features (see [Configuration](#Configuration))._
2020-01-04 14:21:38 +00:00
2021-04-18 12:04:46 +00:00
### 🔹️ **TOML v1.0.0:**
2020-04-02 21:39:21 +00:00
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
2020-10-09 05:50:15 +00:00
- [#766]: Allow comments before commas in arrays
2020-04-02 21:39:21 +00:00
2021-04-18 12:04:46 +00:00
### 🔹️ **TOML v0.5.0:**
2020-04-02 21:39:21 +00:00
All features supported.
2020-01-04 14:21:38 +00:00
< br >
# Contributing
2020-02-24 20:47:00 +00:00
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.
2020-01-04 14:21:38 +00:00
< br >
# License and Attribution
2020-06-24 11:28:20 +00:00
toml++ is licensed under the terms of the MIT license - see [LICENSE].
2020-01-04 14:21:38 +00:00
2020-03-12 15:23:25 +00:00
UTF-8 decoding is performed using a state machine based on Bjoern Hoehrmann's '[Flexible and Economical UTF-8 Decoder]'.
2020-01-04 14:21:38 +00:00
2020-06-08 18:47:31 +00:00
### With thanks to:
2021-05-11 21:48:53 +00:00
- **[@beastle9end](https://github.com/beastle9end)** - Made Windows.h include bypass
2020-06-22 22:32:25 +00:00
- **[@bjadamson](https://github.com/bjadamson)** - Reported some bugs and helped design a new feature
- **[@bobfang1992](https://github.com/bobfang1992)** - Reported a bug and created a [wrapper in python ](https://github.com/bobfang1992/pytomlpp )
- **[@GiulioRomualdi](https://github.com/GiulioRomualdi)** - Added cmake+meson support
2020-07-13 18:18:04 +00:00
- **[@levicki](https://github.com/levicki)** - Helped design some new features
2020-06-22 22:32:25 +00:00
- **[@mosra](https://github.com/mosra)** - Created the awesome [m.css] used to generate the API docs
- **[@ned14](https://github.com/ned14)** - Reported a bunch of bugs and helped design some new features
- **[@okureta](https://github.com/okureta)** - Reported a bug
2020-06-24 11:28:20 +00:00
- **[@prince-chrismc](https://github.com/prince-chrismc)** - Added toml++ to ConanCenter, and fixed some typos
2020-06-22 22:32:25 +00:00
- **[@rbrugo](https://github.com/rbrugo)** - Helped design a new feature
2020-08-11 15:29:40 +00:00
- **[@Reedbeta](https://github.com/Reedbeta)** - Fixed a bug and added additional Visual Studio debugger native visualizers
2021-05-24 06:53:34 +00:00
- **[@Ryan-rsm-McKenzie](https://github.com/Ryan-rsm-McKenzie)** - Add natvis file to cmake install script
2020-06-22 22:32:25 +00:00
- **[@shdnx](https://github.com/shdnx)** - Fixed a bug on GCC 8.2.0 and some meson config issues
2020-09-01 11:09:29 +00:00
- **[@sobczyk](https://github.com/sobczyk)** - Reported some bugs
2020-10-10 08:45:53 +00:00
- **[@sneves](https://github.com/sneves)** - Helped fix a number of parser bugs
2020-10-22 13:25:26 +00:00
- **[@std-any-emplace](https://github.com/std-any-emplace)** - Reported some bugs
2020-06-22 22:32:25 +00:00
- **[@traversaro](https://github.com/traversaro)** - Added vcpkg support and reported a bunch of bugs
- **[@ximion](https://github.com/ximion)** - Added support for installation with meson
2020-07-30 17:41:28 +00:00
- **[@whiterabbit963](https://github.com/whiterabbit963)** - Fixed a bug with value_or conversions
2021-05-11 21:48:53 +00:00
2020-04-01 12:53:10 +00:00
< br >
# 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:
- Twitter: [marzer8789 ](https://twitter.com/marzer8789 )
- Email: [mark.gillard@outlook.com.au ](mailto:mark.gillard@outlook.com.au )
- Facebook: [marzer ](https://www.facebook.com/marzer )
- LinkedIn: [marzer ](https://www.linkedin.com/in/marzer/ )
2020-02-20 21:08:20 +00:00
[API documentation]: https://marzer.github.io/tomlplusplus/
2020-04-02 21:39:21 +00:00
[homepage]: https://marzer.github.io/tomlplusplus/
2020-06-24 18:05:23 +00:00
[unreleased TOML language features]: #-unreleased-language-features
2020-04-02 21:39:21 +00:00
[most recently-released version]: https://github.com/toml-lang/toml/releases
2020-04-10 16:46:00 +00:00
[numbered version]: https://github.com/toml-lang/toml/releases
2020-01-04 14:21:38 +00:00
[char8_t]: https://en.cppreference.com/w/cpp/keyword/char8_t
2020-06-24 11:28:20 +00:00
[TOML]: https://toml.io/
2020-01-04 14:21:38 +00:00
[TOML master]: https://github.com/toml-lang/toml/blob/master/README.md
[TOML issues list]: https://github.com/toml-lang/toml/issues
2021-01-13 08:59:15 +00:00
[v1.0.0]: https://toml.io/en/v1.0.0
2020-02-25 22:09:02 +00:00
[CONTRIBUTING]: ./CONTRIBUTING.md
[LICENSE]: ./LICENSE
2020-01-04 14:21:38 +00:00
[Flexible and Economical UTF-8 Decoder]: http://bjoern.hoehrmann.de/utf-8/decoder/dfa/
2020-02-03 09:12:43 +00:00
[cpp_compilers]: https://en.cppreference.com/w/cpp/compiler_support
2020-04-02 21:39:21 +00:00
[reporting issues]: https://github.com/marzer/tomlplusplus/issues/new/choose
[feature request]: https://github.com/marzer/tomlplusplus/issues/new/choose
2020-04-01 12:53:10 +00:00
[issues]: https://github.com/marzer/tomlplusplus/issues
2020-01-04 14:21:38 +00:00
[#356]: https://github.com/toml-lang/toml/issues/356
[#516]: https://github.com/toml-lang/toml/issues/516
[#562]: https://github.com/toml-lang/toml/issues/562
[#567]: https://github.com/toml-lang/toml/issues/567
[#571]: https://github.com/toml-lang/toml/issues/571
[#622]: https://github.com/toml-lang/toml/issues/622
[#644]: https://github.com/toml-lang/toml/issues/644
[#665]: https://github.com/toml-lang/toml/issues/665
[#671]: https://github.com/toml-lang/toml/issues/671
[#687]: https://github.com/toml-lang/toml/issues/687
2020-03-12 15:23:25 +00:00
[#709]: https://github.com/toml-lang/toml/pull/709
2020-10-09 05:50:15 +00:00
[#766]: https://github.com/toml-lang/toml/issues/766
2020-02-25 22:09:02 +00:00
[LICENSE-utf8-decoder]: ./LICENSE-utf8-decoder
2020-03-03 21:28:24 +00:00
[something better than std::optional]: https://github.com/TartanLlama/optional
2020-06-08 18:47:31 +00:00
[m.css]: https://mcss.mosra.cz/documentation/doxygen