aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorclyne <clyne@bitgloo.com>2021-02-09 11:22:44 -0500
committerGitHub <noreply@github.com>2021-02-09 11:22:44 -0500
commitd4f62d9d2d13e3e809a65d04cf67b58e4a38a4c8 (patch)
treedb691883aad5715fd1178568dda541f37bf785b1
parentf6bc63096b216ed8d670f31306f42bac61daec68 (diff)
Update README.md
-rw-r--r--README.md49
1 files changed, 26 insertions, 23 deletions
diff --git a/README.md b/README.md
index a8e23aa..c83786d 100644
--- a/README.md
+++ b/README.md
@@ -2,22 +2,28 @@
A single-header library that converts INI-formatted string literals to a key-value pair list at compile-time.
+## Features
+ * Direct accesses to values are compile-time evaluated, allowing an INI config to replace a list of macros or `constexpr` globals.
+ * Values can be accessed as strings, integers, or floating-point numbers.
+ * Run-time support: can iterate through the key-value list or check for a key's existance, both with optional filtering by section.
+
Requires C++20. Tested to work on gcc 10.1 and clang trunk. Passes `-Wall -Wextra -pedantic`.
[Try it on Godbolt.](https://godbolt.org/z/WTPzE3)
-## Features
- * Comments and whitespace removed during compilation
- * Handles single-line `key=value` pairs with very basic syntax error reporting
+### INI format notes
+ * Handles single-line `key=value` pairs (extra whitespace is okay)
* Supports sections
- * Supports comments (start line with ';' or '#', preceding whitespace is okay)
+ * Supports comments (start line with ';' or '#')
* Supports wide strings
+ * INI format is validated at compile-time, with future goal of clearly reporting syntax errors
## How to use
```cpp
#include "ini_config.hpp"
-auto config = R"(
+// Simply place the _ini suffix at the end of your config string:
+constexpr auto config = R"(
someflag = true
[Cat]
@@ -25,23 +31,20 @@ color = gray
lives = 9
)"_ini;
-// Returns count of key-value pairs (KVPs), 3 in this case
-config.size();
-// Iterate through all KVPs
-for (auto kvp : config) {}
-// Iterate through all KVPs under [Cat] section
-for (auto kvp : config.section("Cat")) {}
-// Access specific values
-config.get("someflag"); // Returns "true"
-config.get("lives"); // Searches all KVPs, returns "9"
-config["lives"]; // Same as above
-config.get("Cat", "color"); // Only searches [Cat] section, Returns "gray"
-config.get("Dog", "color"); // No match, returns ""
+auto KVPcount = config.size(); // = 3
+for (auto kvp : config) {} // Iterate through all KVPs
+ // (or use begin()/end())
+for (auto kvp : config.section("Cat")) {} // Iterate through all KVPs under [Cat] section
+ // (or use begin("Cat")/end("Cat"))
+config.get("someflag"); // Searches entire config for "someflag", picks first match
+ // This call gets compile-time evaluated to "true"
+config.get("Cat", "lives"); // Searches "Cat" section, compile-time evaluated to "9"
+config.get<int>("Cat", "lives"); // Compile-time evaluated to 9
+config.get("Dog", "lives"); // Does not exist, compile-time evaluated to ""
+config.contains("Dog", "lives"); // Compile-time evaluated to false
+
+config.tryget(argv[2]); // Same interface and behavior as get(),
+ // use this when run-time evaluation is necessary
+config.trycontains("color"); // Run-time evaluated to true
```
See the header file for further documentation.
-
-## How it works (brief)
-1. `_ini` prefix constructs an `ini_config` object with the given string.
-2. Syntax is validated, and a character array is sized to fit all section names, keys, and values.
-3. The array is populated with values.
-4. Compiled result is the minimized array, with efficient functions for iteration and access.