From 7dacc3086296089ce2cd57281f23e49c1e393406 Mon Sep 17 00:00:00 2001 From: Stephen Shelton Date: Tue, 17 Mar 2020 14:21:38 -0600 Subject: [PATCH] Conveience and clarity around config definiton maps --- llarp/config/definition.cpp | 33 +++++++++++++++++++++++---------- llarp/config/definition.hpp | 9 +++++++-- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/llarp/config/definition.cpp b/llarp/config/definition.cpp index 5e45dee6c..d1b8eb59a 100644 --- a/llarp/config/definition.cpp +++ b/llarp/config/definition.cpp @@ -5,6 +5,25 @@ namespace llarp { +/// utility functions for visiting each section/definition +/// +using SectionVisitor = std::function; +void visitSections(const SectionMap& sections, SectionVisitor visitor) +{ + for (const auto& pair : sections) + { + visitor(pair.first, pair.second); + } +}; +using DefVisitor = std::function; +void visitDefinitions(const DefinitionMap& defs, DefVisitor visitor) +{ + for (const auto& pair : defs) + { + visitor(pair.first, pair.second); + } +}; + ConfigDefinitionBase::ConfigDefinitionBase(std::string section_, std::string name_, bool required_, @@ -63,14 +82,8 @@ Configuration::lookupDefinitionOrThrow(string_view section, string_view name) void Configuration::validate() { - for (const auto& pair : m_definitions) - { - const std::string& section = pair.first; - - const auto& sectionDefinitions = pair.second; - for (const auto& defPair : sectionDefinitions) - { - const auto& def = defPair.second; + visitSections(m_definitions, [&](const std::string& section, const DefinitionMap& defs) { + visitDefinitions(defs, [&](const std::string&, const ConfigDefinition_ptr& def) { if (def->required and def->numFound < 1) { throw std::invalid_argument(stringify( @@ -79,8 +92,8 @@ Configuration::validate() // should be handled earlier in ConfigDefinition::parseValue() assert(def->numFound == 1 or def->multiValued); - } - } + }); + }); } std::string diff --git a/llarp/config/definition.hpp b/llarp/config/definition.hpp index 4d6351159..d765a16c3 100644 --- a/llarp/config/definition.hpp +++ b/llarp/config/definition.hpp @@ -119,12 +119,17 @@ namespace llarp using ConfigDefinition_ptr = std::unique_ptr; + // map of k:v pairs + using DefinitionMap = std::unordered_map; + + // map of section-name to map-of-definitions + using SectionMap = std::unordered_map; + /// A configuration holds an ordered set of ConfigDefinitions defining the allowable values and /// their constraints and an optional set defining overrides of those values (e.g. the results /// of a parsed config file). struct Configuration { - // the first std::string template parameter is the section - std::unordered_map> m_definitions; + SectionMap m_definitions; Configuration& addDefinition(ConfigDefinition_ptr def);