56 class singleton_instance_base {
58 virtual ~singleton_instance_base() {};
59 virtual int level()
const = 0;
62 class singletons_manager {
65 static singletons_manager& manager();
68 static void register_new_singleton(singleton_instance_base *p);
69 static void register_new_singleton(singleton_instance_base *p,
71 static void on_partitions_change();
74 ~singletons_manager();
80 template <
typename T,
int LEV>
81 class singleton_instance :
public singleton_instance_base {
90 static T*& instance_pointer() {
91 return pointer()->thrd_cast();
94 static T*& instance_pointer(
size_t ithread) {
95 return (*pointer())(ithread);
101 inline static T& instance(
size_t ithread) {
102 pointer()->on_thread_update();
103 T*& tinstance_ = instance_pointer(ithread);
105 tinstance_ =
new T();
106 singletons_manager::register_new_singleton(
107 new singleton_instance<T,LEV>(), ithread);
109 return *instance_pointer(ithread);
113 inline static T& instance() {
114 return instance(this_thread());
118 return pointer()->num_threads();
122 return pointer()->this_thread();
125 int level()
const override {
129 ~singleton_instance() {
130 if (!pointer())
return;
131 for(
size_t i = 0; i != pointer()->num_threads(); ++i) {
132 auto &p_singleton = (*pointer())(i);
135 p_singleton =
nullptr;
140 if (initializing_pointer) initializing_pointer =
nullptr;
145 singleton_instance<T, LEV>::initializing_pointer = singleton_instance<T, LEV>::pointer();
166 return singleton_instance<T,LEV>::instance();
169 inline static const T& const_instance() {
173 inline static T&
instance(
size_t ithread) {
174 return singleton_instance<T,LEV>::instance(ithread);
177 inline static const T& const_instance(
size_t ithread){
183 return singleton_instance<T,LEV>::num_threads();
188 return singleton_instance<T, LEV>::this_thread();