31#include "timemory/tpls/cereal/cereal.hpp"
54template <
typename Tp,
typename Vp>
58 template <
typename Up>
59 static constexpr bool is_bool_type()
61 return std::is_same<decay_t<Up>,
bool>::value;
64 template <
typename Up>
65 static constexpr bool is_string_type()
67 return std::is_same<decay_t<Up>,
std::string>::value;
70 template <
typename Up>
71 static constexpr bool is_else_type()
73 return !is_bool_type<Up>() && !is_string_type<Up>();
85 template <typename Up = Vp, enable_if_t<!std::is_reference<Up>::value> = 0>
88 template <
typename... Args>
91 template <
typename... Args>
103 const Tp&
get() const;
110 void parse(const
std::
string& v) final;
117 int _p = -1)
override;
119 template <
typename Archive,
typename Up = Vp>
120 void save(Archive& ar,
const unsigned int,
121 enable_if_t<!std::is_reference<Up>::value,
int> = 0)
const;
123 template <
typename Archive>
124 void load(Archive& ar,
const unsigned int);
127 template <
typename Up>
129 TIMEMORY_VISIBILITY("hidden");
133 TIMEMORY_VISIBILITY("hidden");
137 TIMEMORY_VISIBILITY("hidden");
141 TIMEMORY_VISIBILITY("hidden");
146 TIMEMORY_VISIBILITY("hidden");
150 enable_if_t<is_else_type<Up>(),
long long> = 0) const
151 TIMEMORY_VISIBILITY("hidden");
164template <
typename Tp,
typename Vp>
165template <typename Up, enable_if_t<!std::is_reference<Up>::value,
int>>
174template <
typename Tp,
typename Vp>
175template <
typename... Args>
182 m_type_index = std::type_index(
typeid(
type));
186template <
typename Tp,
typename Vp>
187template <
typename... Args>
193 m_type_index = std::type_index(
typeid(
type));
197template <
typename Tp,
typename Vp>
204template <
typename Tp,
typename Vp>
211template <
typename Tp,
typename Vp>
215 return get_value<Tp>(val);
218template <
typename Tp,
typename Vp>
223 m_value = std::move(_value);
224 report_change(std::move(_old), m_value);
227template <
typename Tp,
typename Vp>
231 std::stringstream ss;
232 ss << std::boolalpha;
237template <
typename Tp,
typename Vp>
244template <
typename Tp,
typename Vp>
248 if(!m_env_name.empty())
250 char* c_env_val = std::getenv(m_env_name.c_str());
256template <
typename Tp,
typename Vp>
263template <
typename Tp,
typename Vp>
267 if(!m_cmdline.empty())
269 if(std::is_same<Tp, bool>::value)
279template <
typename Tp,
typename Vp>
294template <
typename Tp,
typename Vp>
295std::shared_ptr<vsettings>
299 return std::make_shared<tsettings<Up>>(
301 std::string{ m_description }, std::vector<std::string>{ m_cmdline },
302 int32_t{ m_count }, int32_t{ m_max_count },
303 std::vector<std::string>{ m_choices });
306template <
typename Tp,
typename Vp>
309 return get_action<Tp>();
312template <
typename Tp,
typename Vp>
317 auto _as_str = [&](
auto _val) {
318 std::stringstream _ss;
321 _ss << std::setw(_w);
323 _ss << std::setprecision(_p);
324 _ss << std::boolalpha << _val;
327 _data[
"value"] = _as_str(m_value);
328 _data[
"type"] = _as_str(demangle<Tp>());
332template <
typename Tp,
typename Vp>
333template <
typename Archive,
typename Up>
336 enable_if_t<!std::is_reference<Up>::value,
int>)
const
339 (std::is_same<Tp, std::string>::value) ?
"string" : demangle<Tp>();
340 ar(cereal::make_nvp(
"name", m_name));
341 ar(cereal::make_nvp(
"environ", m_env_name));
342 ar(cereal::make_nvp(
"description", m_description));
343 ar(cereal::make_nvp(
"count", m_count));
344 ar(cereal::make_nvp(
"max_count", m_max_count));
345 ar(cereal::make_nvp(
"cmdline", m_cmdline));
346 ar(cereal::make_nvp(
"data_type", _dtype));
347 ar(cereal::make_nvp(
"initial", m_init));
348 ar(cereal::make_nvp(
"value", m_value));
351template <
typename Tp,
typename Vp>
352template <
typename Archive>
359 ar(cereal::make_nvp(
"name", m_name));
360 ar(cereal::make_nvp(
"environ", m_env_name));
361 ar(cereal::make_nvp(
"description", m_description));
362 ar(cereal::make_nvp(
"count", m_count));
363 ar(cereal::make_nvp(
"max_count", m_max_count));
364 ar(cereal::make_nvp(
"cmdline", m_cmdline));
365 ar(cereal::make_nvp(
"data_type", _dtype));
366 ar(cereal::make_nvp(
"initial", m_init));
369 ar(cereal::make_nvp(
"value", m_value));
372template <
typename Tp,
typename Vp>
373template <
typename Up>
378 auto pos = m_cmdline.back().find_first_not_of(
'-');
379 if(
pos != std::string::npos)
393template <
typename Tp,
typename Vp>
394template <
typename Up>
399 auto pos = m_cmdline.back().find_first_not_of(
'-');
400 if(
pos != std::string::npos)
402 auto _vec = p.get<std::vector<std::string>>(id);
409 std::stringstream ss;
410 for(
auto& itr : _vec)
412 set(ss.str().substr(2));
417template <
typename Tp,
typename Vp>
418template <
typename Up>
423 auto pos = m_cmdline.back().find_first_not_of(
'-');
424 if(
pos != std::string::npos)
426 set(p.get<decay_t<Up>>(
id));
430template <
typename Tp,
typename Vp>
431template <
typename Up>
441template <
typename Tp,
typename Vp>
442template <
typename Up>
450template <
typename Tp,
typename Vp>
451template <
typename Up>
456 std::stringstream ss;
469template <
typename Archive,
typename Tp>
473 auto _obj = obj->clone();
void save(Archive &ar, std::shared_ptr< tim::tsettings< Tp, Tp & > > obj)
std::array< char *, 4 > _args
bool get_bool(const std::string &strbool, bool _default) noexcept
typename std::decay< T >::type decay_t
Alias template for decay.
typename std::enable_if< B, T >::type enable_if_t
Alias template for enable_if.
argparse::argument_parser parser_t
tim::mpl::apply< std::string > string
argument & max_count(int count)
argument & count(int count)
argument & action(ActionFuncT &&_func)
argument & choices(const std::initializer_list< T > &_choices)
argument & add_argument()
Implements a specific setting.
parser_func_t get_action(TIMEMORY_API) override
display_map_t get_display(std::ios::fmtflags fmt={}, int _w=-1, int _p=-1) override
tsettings(const tsettings &)=default
base_type::parser_func_t parser_func_t
void save(Archive &ar, const unsigned int, enable_if_t<!std::is_reference< Up >::value, int >=0) const
void add_argument(argparse::argument_parser &p) final
std::shared_ptr< vsettings > vpointer_t
tsettings(Vp, Args &&...)
tsettings(tsettings &&) noexcept=default
~tsettings() override=default
std::string as_string() const override
tsettings(noparse, Vp, Args &&...)
Tp get_value(const std::string &val) const
void load(Archive &ar, const unsigned int)
Virtual base class for storing settings.
virtual display_map_t get_display(std::ios::fmtflags fmt={}, int _w=-1, int _p=-1)
vsettings(std::string _name="", std::string _env_name="", std::string _descript="", std::vector< std::string > _cmdline={}, int32_t _count=-1, int32_t _max_count=-1, std::vector< std::string > _choices={})
std::type_index m_value_index
argparse::argument_parser parser_t
std::map< std::string, std::string > display_map_t
virtual std::shared_ptr< vsettings > clone()=0
std::function< void(parser_t &)> parser_func_t
typename typename typename