]> code.bitgloo.com Git - clyne/ini-config.git/commitdiff
documentation clean up; add make_ini_config
authorClyne Sullivan <clyne@bitgloo.com>
Wed, 10 Feb 2021 00:56:05 +0000 (19:56 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Wed, 10 Feb 2021 00:56:05 +0000 (19:56 -0500)
README.md
ini_config.hpp

index c83786d191a11e83f4b1f3c232628db9f227e477..2aae1280d311603c0aa463cb8761cdf988d80b87 100644 (file)
--- a/README.md
+++ b/README.md
@@ -2,14 +2,14 @@
 
 A single-header library that converts INI-formatted string literals to a key-value pair list at compile-time.
 
+Requires C++20; tested on gcc 10.1 and clang trunk. Passes `-Wall -Wextra -pedantic`.
+
 ## 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`.
+ * Run-time support includes key lookup, iteration through the key-value list, or key existance checking; all of which can be filtered by section.
 
-[Try it on Godbolt.](https://godbolt.org/z/WTPzE3)
+[Try it on Godbolt.](https://godbolt.org/z/Ys1o9G)
 
 ### INI format notes
  * Handles single-line `key=value` pairs (extra whitespace is okay)
@@ -31,6 +31,9 @@ color = gray
 lives = 9
 )"_ini;
 
+// Or, go for a more functional look:
+//constexpr auto config = make_ini_config<R"( ... )">;
+
 auto KVPcount = config.size();            // = 3
 for (auto kvp : config) {}                // Iterate through all KVPs
                                           // (or use begin()/end())
@@ -48,3 +51,4 @@ config.tryget(argv[2]);                   // Same interface and behavior as get(
 config.trycontains("color");              // Run-time evaluated to true
 ```
 See the header file for further documentation.
+
index e844b04b75ae454a8d65415dc5ddd64b3cc772bd..38ff9ebe3fd99f4edafd10cc4ab0392047ad36d2 100644 (file)
@@ -235,18 +235,20 @@ class ini_config
     }
 
 public:
+    // Stores a key-value pair, including a section identifier
     struct kvp {
         const char_type *section = nullptr;
         const char_type *first = nullptr;
         const char_type *second = nullptr;
     };
+
     class iterator {
         const char_type *m_pos = nullptr;
         kvp m_current = {};
 
         constexpr const auto& get_next() noexcept {
             if (*m_pos == '\0') {
-                // At the end
+                // Set first to nullptr to indicate that we're at the end
                 m_current.first = nullptr;
             } else {
                 // Enter new section(s) if necessary
@@ -266,7 +268,7 @@ public:
         using difference_type = long int;
         using value_type = kvp;
 
-        // Parameter is a location within kvp_buffer
+        // 'pos' is a location within kvp_buffer
         constexpr iterator(const char_type *pos) noexcept
             : m_pos(pos)
         {
@@ -330,12 +332,12 @@ public:
     constexpr auto begin() const noexcept {
         return iterator(kvp_buffer);
     }
-    constexpr auto cbegin() const noexcept {
-        return begin();
-    }
     constexpr auto end() const noexcept {
         return iterator(kvp_buffer + sizeof(kvp_buffer) / sizeof(char_type) - 1);
     }
+    constexpr auto cbegin() const noexcept {
+        return begin();
+    }
     constexpr auto cend() const noexcept {
         return end();
     }
@@ -376,7 +378,7 @@ public:
     };
 
     /**
-     * Creates a 'view' for the given section (use with ranged for).
+     * Creates a 'view' for the given section, for use with ranged for.
      */
     constexpr auto section(const char_type *s) const noexcept {
         return section_view(*this, s);
@@ -423,7 +425,8 @@ public:
     }
 
     /**
-     * Attempts to get the value for the given key.
+     * tryget() calls are for run-time use when 'sec' or 'key'
+     * is not known at compile-time.
      */
     auto tryget(const char_type *key) const noexcept {
         for (auto kvp : *this) {
@@ -432,16 +435,10 @@ public:
         }
         return "";
     }
-    /**
-     * Attempts to get the value for the given key, converted to the given type.
-     */
     template<typename T> requires(std::integral<T> || std::floating_point<T>)
     T tryget(const char_type *key) const noexcept {
         return from_string<T>(tryget(key));
     }
-    /**
-     * Attempts to get the value for the given key.
-     */
     auto tryget(const char_type *sec, const char_type *key) const noexcept {
         for (auto kvp : section(sec)) {
             if (stringmatch(kvp.first, key))
@@ -449,9 +446,6 @@ public:
         }
         return "";
     }
-    /**
-     * Attempts to get the value for the given key, converted to the given type.
-     */
     template<typename T> requires(std::integral<T> || std::floating_point<T>)
     T tryget(const char_type *sec, const char_type *key) const noexcept {
         return from_string<T>(tryget(sec, key));
@@ -484,7 +478,8 @@ consteval auto operator ""_ini()
 
 // For MSVC, the below alternative seems promising, though
 // MSVC v19.28 complains about running out of heap.
-//template <ini_config::string_container Input>
-//constexpr auto make_ini_config = ini_config::ini_config<Input>();
+template <ini_config::string_container Input>
+constexpr auto make_ini_config = ini_config::ini_config<Input>();
 
 #endif // TCSULLIVAN_INI_CONFIG_HPP
+