]> code.bitgloo.com Git - clyne/ini-config.git/commitdiff
Update README.md
authorclyne <clyne@bitgloo.com>
Tue, 9 Feb 2021 16:22:44 +0000 (11:22 -0500)
committerGitHub <noreply@github.com>
Tue, 9 Feb 2021 16:22:44 +0000 (11:22 -0500)
README.md

index a8e23aaf6eae85ac4d4a90f8fac17f46ddaad2b9..c83786d191a11e83f4b1f3c232628db9f227e477 100644 (file)
--- 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.