31#include "timemory/tpls/cereal/cereal.hpp"
76 template <
typename Tp>
99 template <
typename Archive>
100 void serialize(Archive& ar,
unsigned int);
102 template <
typename Archive>
110 static std::atomic_bool& lock_flag()
112 static std::atomic_bool _instance(
false);
121 std::vector<env_uomap_t*> m_env_other;
126template <
typename Tp>
130#if !defined(TIMEMORY_DISABLE_STORE_ENVIRONMENT)
131 std::stringstream ss;
132 ss << std::boolalpha << val;
134 auto_lock_t lk(type_mutex<env_settings>(), std::defer_lock);
135 if(lock_flag().
load() && !lk.owns_lock())
139 (m_env->find(env_id) == m_env->end() || m_env->find(env_id)->second != ss.str()))
140 (*m_env)[env_id] = ss.str();
148template <
typename Archive>
158 auto_lock_t lk(type_mutex<env_settings>(), std::defer_lock);
159 lock_flag().store(
true);
164 ar(cereal::make_nvp(
"environment", *m_env));
169 lock_flag().store(
false);
174template <
typename Tp>
182 char* env_var = std::getenv(env_id.c_str());
186 std::stringstream iss{ str_var };
189 if(_env_settings && _store)
190 _env_settings->insert<Tp>(env_id, var);
194 if(_env_settings && _store)
195 _env_settings->insert<Tp>(env_id, _default);
203template <
typename Tp>
207 assert(!_choices.empty());
208 auto _choice = get_env<Tp>(env_id, _default, _store);
211 if(_choices.find(_choice) == _choices.end())
213 std::ostringstream _msg{};
214 _msg <<
"Error! Invalid value \"" << _choice <<
"\" for " << env_id
215 <<
". Valid choices are: ";
216 std::ostringstream _opts{};
217 for(
const auto& itr : _choices)
218 _opts <<
", \"" << itr <<
"\"";
219 _msg << _opts.str().substr(2);
220 throw std::runtime_error(_msg.str());
228template <
typename Tp>
239 auto itr = _env_settings->get(env_id);
240 if(itr != _env_settings->end())
242 std::stringstream iss{ itr->second };
254template <
typename Tp>
258 std::stringstream ss_val;
260#if defined(TIMEMORY_MACOS) || (defined(TIMEMORY_LINUX) && (_POSIX_C_SOURCE >= 200112L))
261 setenv(env_var.c_str(), ss_val.str().c_str(),
override);
262#elif defined(TIMEMORY_WINDOWS)
263 auto _curr = get_env<std::string>(env_var,
"");
264 if(_curr.empty() ||
override > 0)
265 _putenv_s(env_var.c_str(), ss_val.str().c_str());
273template <
typename FuncT>
278 std::is_same<bool, decltype(_filter(std::declval<std::string>()))>::value,
279 "Error! filter must accept string and return bool");
typename env_map_t::const_iterator const_iterator
std::map< string_t, string_t > env_uomap_t
std::function< bool(const std::string &)> filter_func_t
const_iterator end() const
iterator get(const string_t &_entry)
static void serialize_environment(Archive &ar)
std::map< string_t, string_t > env_map_t
void serialize(Archive &ar, unsigned int)
static env_settings * instance()
const_iterator get(const string_t &_entry) const
typename env_map_t::iterator iterator
void print(std::ostream &, filter_func_t &&_filter=[](const std::string &) { return true;}) const
friend std::ostream & operator<<(std::ostream &os, const env_settings &env)
std::pair< string_t, string_t > env_pair_t
void insert(const std::string &env_id, Tp val)
const_iterator begin() const
void load(Archive &ar, tim::node::graph< Tp > &d)
Tp get_env_choice(const std::string &env_id, Tp _default, std::set< Tp > _choices, bool _store)
void set_env(const std::string &env_var, const Tp &_val, int override)
std::unique_lock< mutex_t > auto_lock_t
Unique lock type around mutex_t.
void print_env(std::ostream &os, FuncT &&_filter)
Print all environment queries and their values which satisfy the filter conditions.
Tp get_env(const std::string &env_id, Tp _default, bool _store)
Tp load_env(const std::string &env_id, Tp _default)
tim::mpl::apply< std::string > string
const std::string std::ostream * os
void consume_parameters(ArgsT &&...)
#define TIMEMORY_GET_CLASS_VERSION(...)