Scroom  0.14
utilities.hh
Go to the documentation of this file.
1 /*
2  * Scroom - Generic viewer for 2D data
3  * Copyright (C) 2009-2022 Kees-Jan Dijkzeul
4  *
5  * SPDX-License-Identifier: LGPL-2.1
6  */
7 
8 #pragma once
9 
10 #include <boost/enable_shared_from_this.hpp>
11 #include <boost/thread.hpp>
12 
13 namespace Scroom::Utils
14 {
30  class Base : public boost::enable_shared_from_this<Base>
31  {
32  public:
33  Base() = default;
34  Base(const Base&) = delete;
35  Base(Base&&) = delete;
36  Base& operator=(const Base&) = delete;
37  Base& operator=(Base&&) = delete;
38  virtual ~Base() = default;
39 
44  template <typename R>
45  boost::shared_ptr<R> shared_from_this();
46 
51  template <typename R>
52  boost::shared_ptr<R const> shared_from_this() const;
53  };
54 
55  template <typename F>
57  {
58  public:
59  explicit on_scope_exit(F f_)
60  : f(std::move(f_))
61  {
62  }
63  on_scope_exit(const on_scope_exit&) = delete;
64  on_scope_exit(on_scope_exit&&) = delete;
65  on_scope_exit& operator=(const on_scope_exit&) = delete;
67 
68  ~on_scope_exit() { f(); }
69 
70  private:
71  F f;
72  };
73 
74  template <typename F>
75  boost::shared_ptr<void> on_destruction(F f)
76  {
77  return boost::make_shared<on_scope_exit<F>>(std::move(f));
78  }
79 
80  template <typename F>
82  {
83  public:
84  explicit optional_cleanup(F f_)
85  : f(std::move(f_))
86  {
87  }
88  optional_cleanup(const optional_cleanup&) = delete;
92 
94  {
95  if(cleanup)
96  {
97  f();
98  }
99  }
100 
101  void cancel() { cleanup = false; }
102 
103  private:
104  bool cleanup{true};
105  F f;
106  };
107 
108  template <typename R>
109  boost::shared_ptr<R> Base::shared_from_this()
110  {
111  return boost::dynamic_pointer_cast<R, Base>(boost::enable_shared_from_this<Base>::shared_from_this());
112  }
113 
114  template <typename R>
115  boost::shared_ptr<R const> Base::shared_from_this() const
116  {
117  return boost::dynamic_pointer_cast<R const, Base const>(boost::enable_shared_from_this<Base>::shared_from_this());
118  }
119 
121 
122  void dumpCounts();
123 
125 
126  class Count
127  {
128  public:
129  using Ptr = boost::shared_ptr<Count>;
130 
131  public:
132  const std::string name;
133  boost::mutex mut;
134  long count{0};
135 
136  public:
137  static Ptr create(const std::string& name);
138  void ping()
139  { /* dumpCounts(); */
140  }
141  void inc()
142  {
143  boost::unique_lock<boost::mutex> const lock(mut);
144  ++count;
145  ping();
146  }
147  void dec()
148  {
149  boost::unique_lock<boost::mutex> const lock(mut);
150  --count;
151  ping();
152  }
153 
154  private:
155  explicit Count(std::string name);
156  };
157 
159 
160  class Counter
161  {
162  public:
163  private:
164  std::list<Count::Ptr> counts;
165  boost::mutex mut;
166 
167  private:
168  Counter();
169 
170  public:
171  static Counter* instance();
172  void registerCount(const Count::Ptr& count);
173  void unregisterCount(const Count::Ptr& count);
174  void dump();
175  std::list<Count::Ptr> getCounts();
176  };
177 
179 
180  template <class C>
181  class Counted
182  {
183  private:
185 
186  public:
188  {
189  static Count::Ptr const instance = Count::create(typeid(C).name());
190  return instance;
191  }
192 
194  : data(count_instance())
195  {
196  data->inc();
197  }
198 
199  Counted(const Counted& /*unused*/)
200  : data(count_instance())
201  {
202  data->inc();
203  }
204 
205  Counted(Counted&& /*unused*/)
206  : data(count_instance())
207  {
208  data->inc();
209  }
210 
211  Counted& operator=(const Counted&) = default;
212  Counted& operator=(Counted&&) = default;
213 
214  virtual ~Counted() { data->dec(); }
215  };
216 } // namespace Scroom::Utils
Scroom::Utils::on_scope_exit
Definition: utilities.hh:56
Scroom::Utils::Counter::mut
boost::mutex mut
Definition: utilities.hh:165
Scroom::Utils
Definition: assertions.hh:14
Scroom::Utils::Counter::Counter
Counter()
Definition: counter.cc:54
Scroom::Utils::Base::shared_from_this
boost::shared_ptr< R > shared_from_this()
Definition: utilities.hh:109
Scroom::Utils::Counter::getCounts
std::list< Count::Ptr > getCounts()
Definition: counter.cc:81
Scroom::Utils::on_scope_exit::f
F f
Definition: utilities.hh:71
Scroom::Utils::Counted::~Counted
virtual ~Counted()
Definition: utilities.hh:214
Scroom::Utils::Count::Ptr
boost::shared_ptr< Count > Ptr
Definition: utilities.hh:129
Scroom::Utils::Counted::Counted
Counted()
Definition: utilities.hh:193
Scroom::Utils::Counted
Definition: utilities.hh:181
Scroom::Utils::optional_cleanup::f
F f
Definition: utilities.hh:105
Scroom::Utils::Counted::Counted
Counted(Counted &&)
Definition: utilities.hh:205
Scroom::Utils::on_scope_exit::operator=
on_scope_exit & operator=(const on_scope_exit &)=delete
Scroom::Utils::Counter::registerCount
void registerCount(const Count::Ptr &count)
Definition: counter.cc:56
Scroom::Utils::Counter::instance
static Counter * instance()
Definition: counter.cc:48
Scroom::Utils::Counter::counts
std::list< Count::Ptr > counts
Definition: utilities.hh:164
Scroom::Utils::Counted::operator=
Counted & operator=(const Counted &)=default
Scroom::Utils::Counted::count_instance
static Count::Ptr count_instance()
Definition: utilities.hh:187
Scroom::Utils::optional_cleanup::optional_cleanup
optional_cleanup(F f_)
Definition: utilities.hh:84
Scroom::Utils::Counted::Counted
Counted(const Counted &)
Definition: utilities.hh:199
Scroom::Utils::Count::ping
void ping()
Definition: utilities.hh:138
Scroom::Utils::Base::Base
Base()=default
Scroom::Utils::Counted::data
Count::Ptr data
Definition: utilities.hh:184
Scroom::Utils::dumpCounts
void dumpCounts()
Definition: counter.cc:23
Scroom::Utils::Counter
Definition: utilities.hh:160
Scroom::Utils::on_scope_exit::on_scope_exit
on_scope_exit(F f_)
Definition: utilities.hh:59
Scroom::Utils::Count::inc
void inc()
Definition: utilities.hh:141
Scroom::Utils::Base
Definition: utilities.hh:30
Scroom::Utils::optional_cleanup::cleanup
bool cleanup
Definition: utilities.hh:104
Scroom::Utils::on_destruction
boost::shared_ptr< void > on_destruction(F f)
Definition: utilities.hh:75
Scroom::Utils::Base::operator=
Base & operator=(const Base &)=delete
anonymous_namespace{progressbarmanager.cc}::instance
ProgressBarPulser::Ptr instance()
Definition: progressbarmanager.cc:43
Scroom::Utils::on_scope_exit::~on_scope_exit
~on_scope_exit()
Definition: utilities.hh:68
Scroom::Utils::Count::name
const std::string name
Definition: utilities.hh:132
Scroom::Utils::Count::count
long count
Definition: utilities.hh:134
Scroom::Utils::optional_cleanup::operator=
optional_cleanup & operator=(const optional_cleanup &)=delete
Scroom::Utils::optional_cleanup
Definition: utilities.hh:81
Scroom::Utils::Counter::dump
void dump()
Definition: counter.cc:68
Scroom::Utils::Counter::unregisterCount
void unregisterCount(const Count::Ptr &count)
Definition: counter.cc:62
Scroom::Utils::optional_cleanup::cancel
void cancel()
Definition: utilities.hh:101
Scroom::Utils::Count::create
static Ptr create(const std::string &name)
Definition: counter.cc:39
Scroom::Utils::Count
Definition: utilities.hh:126
Scroom::Utils::Count::Count
Count(std::string name)
Definition: counter.cc:33
Scroom::Utils::optional_cleanup::~optional_cleanup
~optional_cleanup()
Definition: utilities.hh:93
Scroom::Utils::Count::mut
boost::mutex mut
Definition: utilities.hh:133
Scroom::Utils::Count::dec
void dec()
Definition: utilities.hh:147
Scroom::Utils::Base::~Base
virtual ~Base()=default