From e3c9ecf30fe1c84c3be178c0204ef8abd08e5f47 Mon Sep 17 00:00:00 2001 From: "Jonathan R. Madsen" Date: Thu, 30 May 2024 18:08:50 -0500 Subject: [PATCH] Settings updates - push_back -> emplace_back - settings::at - vsettings parse callback support --- source/timemory/settings/macros.hpp | 12 ++++++------ source/timemory/settings/settings.cpp | 2 +- source/timemory/settings/settings.hpp | 13 +++++++++++++ source/timemory/settings/tsettings.hpp | 7 +++++-- source/timemory/settings/vsettings.cpp | 16 ++++++++++++++++ source/timemory/settings/vsettings.hpp | 15 +++++++++++++++ 6 files changed, 56 insertions(+), 9 deletions(-) diff --git a/source/timemory/settings/macros.hpp b/source/timemory/settings/macros.hpp index ae93007c9..41dc171b1 100644 --- a/source/timemory/settings/macros.hpp +++ b/source/timemory/settings/macros.hpp @@ -173,7 +173,7 @@ INIT, std::string{ #FUNC }, std::string{ ENV_VAR }, \ std::string{ DESC }, CATEGORIES)) \ .second) \ - m_order.push_back(ENV_VAR); + m_order.emplace_back(ENV_VAR); #endif // //--------------------------------------------------------------------------------------// @@ -186,7 +186,7 @@ INIT, std::string{}, std::string{ ENV_VAR }, \ std::string{ DESC }, CATEGORIES)) \ .second) \ - m_order.push_back(ENV_VAR); + m_order.emplace_back(ENV_VAR); #endif // //--------------------------------------------------------------------------------------// @@ -199,7 +199,7 @@ INIT, std::string{ #FUNC }, std::string{ ENV_VAR }, \ std::string{ DESC }, __VA_ARGS__)) \ .second) \ - m_order.push_back(ENV_VAR); + m_order.emplace_back(ENV_VAR); #endif // //--------------------------------------------------------------------------------------// @@ -212,7 +212,7 @@ INIT, std::string{}, std::string{ ENV_VAR }, \ std::string{ DESC }, __VA_ARGS__)) \ .second) \ - m_order.push_back(ENV_VAR); + m_order.emplace_back(ENV_VAR); #endif // //--------------------------------------------------------------------------------------// @@ -226,7 +226,7 @@ INIT, std::string{ #FUNC }, std::string{ ENV_VAR }, \ std::string{ DESC }, CATEGORIES)) \ .second) \ - m_order.push_back(ENV_VAR); + m_order.emplace_back(ENV_VAR); #endif // //--------------------------------------------------------------------------------------// @@ -238,7 +238,7 @@ INIT, std::string{ #FUNC }, std::string{ ENV_VAR }, \ std::string{ DESC }, __VA_ARGS__)) \ .second) \ - m_order.push_back(ENV_VAR); + m_order.emplace_back(ENV_VAR); #endif // //--------------------------------------------------------------------------------------// diff --git a/source/timemory/settings/settings.cpp b/source/timemory/settings/settings.cpp index a743308e1..23928207b 100644 --- a/source/timemory/settings/settings.cpp +++ b/source/timemory/settings/settings.cpp @@ -2326,7 +2326,7 @@ settings::read(std::istream& ifs, std::string inp) return std::tie(key, val) == std::tie(itr.first, itr.second); })) - m_unknown_configs.emplace_back(strpair_t{ key, val }); + m_unknown_configs.emplace_back(key, val); } else { diff --git a/source/timemory/settings/settings.hpp b/source/timemory/settings/settings.hpp index 9cd86b346..cad8de075 100644 --- a/source/timemory/settings/settings.hpp +++ b/source/timemory/settings/settings.hpp @@ -514,6 +514,9 @@ struct TIMEMORY_VISIBILITY("default") settings template auto find(Sp&& _key, bool _exact = true, const std::string& _category = {}); + template + decltype(auto) at(Sp&& _key); + template Tp get(Sp&& _key, bool _exact = true); @@ -1010,6 +1013,16 @@ settings::find(Sp&& _key, bool _exact, const std::string& _category) // //--------------------------------------------------------------------------------------// // +template +inline decltype(auto) +settings::at(Sp&& _key) +{ + // exact match to map key + return m_data.at(std::forward(_key)); +} +// +//--------------------------------------------------------------------------------------// +// template Tp settings::get(Sp&& _key, bool _exact) diff --git a/source/timemory/settings/tsettings.hpp b/source/timemory/settings/tsettings.hpp index d4fcb89d7..337515e01 100644 --- a/source/timemory/settings/tsettings.hpp +++ b/source/timemory/settings/tsettings.hpp @@ -266,9 +266,12 @@ tsettings::parse() // template bool -tsettings::parse(const std::string& v, update_type _upd) +tsettings::parse(const std::string& val, update_type _upd) { - return set(std::move(get_value>(v)), _upd); + auto ret = set(get_value>(val), _upd); + if(ret && m_callback) + m_callback(this, val, _upd); + return ret; } // template diff --git a/source/timemory/settings/vsettings.cpp b/source/timemory/settings/vsettings.cpp index b354c1c6c..279aab848 100644 --- a/source/timemory/settings/vsettings.cpp +++ b/source/timemory/settings/vsettings.cpp @@ -67,6 +67,22 @@ vsettings::vsettings(std::string _name, std::string _env_name, std::string _desc {} // TIMEMORY_SETTINGS_INLINE +vsettings::vsettings(std::string _name, std::string _env_name, std::string _descript, + parse_callback_t&& _callback, std::set _categories, + std::vector _cmdline, int32_t _count, + int32_t _max_count, std::vector _choices) +: m_count{ _count } +, m_max_count{ _max_count } +, m_name{ std::move(_name) } +, m_env_name{ std::move(_env_name) } +, m_description{ std::move(_descript) } +, m_cmdline{ std::move(_cmdline) } +, m_choices{ std::move(_choices) } +, m_categories{ std::move(_categories) } +, m_callback{ std::move(_callback) } +{} +// +TIMEMORY_SETTINGS_INLINE vsettings::vsettings(std::string _name, std::string _env_name, std::string _descript, std::set _categories, std::vector _cmdline, int32_t _count, int32_t _max_count, diff --git a/source/timemory/settings/vsettings.hpp b/source/timemory/settings/vsettings.hpp index fcd07a7a9..3ebb8fa25 100644 --- a/source/timemory/settings/vsettings.hpp +++ b/source/timemory/settings/vsettings.hpp @@ -62,6 +62,8 @@ struct vsettings using display_map_t = std::map; using shared_pointer_t = std::shared_ptr; using update_type = setting_update_type; + using parse_callback_t = + std::function; struct noparse {}; @@ -80,6 +82,11 @@ struct vsettings int32_t _max_count = -1, std::vector _choices = {}, std::set _categories = {}); + vsettings(std::string _name, std::string _env_name, std::string _descript, + parse_callback_t&& _callback, std::set _categories, + std::vector _cmdline = {}, int32_t _count = -1, + int32_t _max_count = -1, std::vector _choices = {}); + virtual ~vsettings() = default; vsettings(const vsettings&) = default; @@ -125,6 +132,7 @@ struct vsettings auto get_type_index() const { return m_type_index; } auto get_value_index() const { return m_value_index; } auto get_updated() const { return (m_updated != update_type::default_value); } + auto get_updated_type() const { return m_updated; } auto get_user_updated() const { return (m_updated == update_type::user); } auto get_config_updated() const { return (m_updated == update_type::config); } auto get_environ_updated() const { return (m_updated == update_type::env); } @@ -167,6 +175,12 @@ struct vsettings return static_cast, Tp>*>(_val.get()); } + template + void set_parse_callback(FuncT&& _func) + { + m_callback = std::forward(_func); + } + protected: friend struct settings; @@ -199,6 +213,7 @@ struct vsettings std::vector m_cmdline = {}; std::vector m_choices = {}; std::set m_categories = {}; + parse_callback_t m_callback = {}; }; // template