1 #ifndef PROFILER_SRC_MOLPRO_PROFILER_TREE_SINGLE_H
2 #define PROFILER_SRC_MOLPRO_PROFILER_TREE_SINGLE_H
20 template <
class Object>
23 using key_t = std::tuple<std::string, std::weak_ptr<Object>, Object*>;
29 template <
typename... T>
30 static std::shared_ptr<Object>
single(
const std::string& key, T&&... constructor_args) {
31 std::lock_guard<decltype(WeakSingleton::s_reg_lock)> lock(s_reg_lock);
32 std::shared_ptr<Object> result =
nullptr;
33 auto& reg = registry();
34 auto it = std::find_if(begin(reg), end(reg), [&key](
const key_t& el) {
return std::get<0>(el) == key; });
36 result = std::get<1>(*it).lock();
38 result = std::make_shared<Object>(std::forward<T>(constructor_args)...);
39 reg.emplace_back(
key_t{key, result, result.get()});
45 static std::shared_ptr<Object>
single() {
46 std::lock_guard<decltype(WeakSingleton::s_reg_lock)> lock(s_reg_lock);
47 auto& reg = registry();
48 std::shared_ptr<Object> instance = reg.empty() ? nullptr : std::get<1>(reg.back()).lock();
51 result->set_max_depth(0);
54 default_instance_saver() = result;
61 static void erase(Object* obj) {
62 std::lock_guard<decltype(WeakSingleton::s_reg_lock)> lock(s_reg_lock);
63 auto& reg = registry();
64 auto it = std::find_if(begin(reg), end(reg), [obj](
const key_t& el) {
return std::get<2>(el) == obj; });
70 static void erase(
const std::string& key) {
71 std::lock_guard<decltype(WeakSingleton::s_reg_lock)> lock(s_reg_lock);
72 auto& reg = registry();
73 auto it = std::find_if(begin(reg), end(reg), [&key](
const key_t& el) {
return std::get<0>(el) == key; });
80 std::lock_guard<decltype(WeakSingleton::s_reg_lock)> lock(s_reg_lock);
85 static std::recursive_mutex s_reg_lock;
89 static std::list<key_t>& registry() {
90 static std::list<key_t> reg;
95 static std::shared_ptr<Object>& default_instance_saver() {
96 static std::shared_ptr<Object> saver;
101 template <
class Object>
102 std::recursive_mutex WeakSingleton<Object>::s_reg_lock;
static std::shared_ptr< Profiler > single()
Access the last registered Profiler.
Definition: Profiler.cpp:27
Implements the mechanism for the weak singleton pattern.
Definition: WeakSingleton.h:21
static void erase(Object *obj)
Remove object from the register. This should be called in the destructor of class that exposes this p...
Definition: WeakSingleton.h:61
static void erase(const std::string &key)
Remove object registered under the name key.
Definition: WeakSingleton.h:70
std::tuple< std::string, std::weak_ptr< Object >, Object * > key_t
Definition: WeakSingleton.h:23
static std::shared_ptr< Object > single(const std::string &key, T &&... constructor_args)
Creates an instance of Object or returns an already registered instance.
Definition: WeakSingleton.h:30
static void clear()
Remove all registered objects.
Definition: WeakSingleton.h:79
static std::shared_ptr< Object > single()
Access the last registered object.
Definition: WeakSingleton.h:45