From d4f62d9d2d13e3e809a65d04cf67b58e4a38a4c8 Mon Sep 17 00:00:00 2001 From: clyne Date: Tue, 9 Feb 2021 11:22:44 -0500 Subject: [PATCH] Update README.md --- README.md | 49 ++++++++++++++++++++++++++----------------------- 1 file 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("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.