Scroom  0.14
progressinterfacehelpers.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 <set>
11 
12 #include <boost/thread.hpp>
13 
15 #include <scroom/stuff.hh>
16 #include <scroom/utilities.hh>
17 
18 namespace Scroom::Utils
19 {
24  {
25  public:
26  using Ptr = boost::shared_ptr<ProgressStateInterface>;
27  using WeakPtr = boost::weak_ptr<ProgressStateInterface>;
28 
29  enum State
30  {
35  };
36 
37  virtual void setProgress(State s, double progress = 0.0) = 0;
38  };
39 
41  : public ProgressInterface
42  , protected ProgressStateInterface
43  {
44  public:
45  // ProgressInterface ///////////////////////////////////////////////////
46 
47  void setIdle() override;
48  void setWaiting(double progress = 0.0) override;
49  void setWorking(double progress) override;
50  void setFinished() override;
51  };
52 
54  {
55  public:
56  using Ptr = boost::shared_ptr<ProgressInterfaceFromProgressStateInterfaceForwarder>;
57 
58  private:
60 
61  private:
63 
64  public:
66 
67  protected:
68  // ProgressStateInterface //////////////////////////////////////////////
69  void setProgress(State s, double progress = 0.0) override;
70  };
71 
73  : public ProgressStateInterface
74  , protected ProgressInterface
75  {
76  public:
77  void setProgress(State s, double progress = 0.0) override;
78  };
79 
81  {
82  public:
83  using Ptr = boost::shared_ptr<ProgressStateInterfaceFromProgressInterfaceForwarder>;
84 
85  private:
87 
88  private:
90 
91  public:
93 
94  protected:
95  void setIdle() override;
96  void setWaiting(double progress = 0.0) override;
97  void setWorking(double progress) override;
98  void setFinished() override;
99  };
100 
101  namespace Detail
102  {
104  {
105  public:
106  using Ptr = boost::shared_ptr<ProgressStore>;
107 
108  private:
110  double progress{0.0};
111 
112  private:
113  ProgressStore() = default;
114 
115  public:
116  static Ptr create();
117 
118  void init(ProgressInterface::Ptr const& i);
119 
120  protected:
121  // ProgressStateInterface //////////////////////////////////////////////
122  void setProgress(State s, double progress = 0.0) override;
123  };
124  } // namespace Detail
125 
127  : virtual public Base
128  , public ProgressInterface
129  {
130  public:
131  using Ptr = boost::shared_ptr<ProgressInterfaceBroadcaster>;
132 
133  private:
135  {
136  public:
137  using Ptr = boost::shared_ptr<Unsubscriber>;
138 
139  private:
142 
143  private:
145  Unsubscriber(const Unsubscriber&) = delete;
146  Unsubscriber(Unsubscriber&&) = delete;
147  Unsubscriber& operator=(const Unsubscriber&) = delete;
148  Unsubscriber& operator=(Unsubscriber&&) = delete;
149 
150  public:
152  ~Unsubscriber();
153  };
154 
155  friend class Unsubscriber;
156 
157  private:
158  boost::mutex mut;
159  std::set<ProgressInterface::Ptr> children;
161 
162  public:
163  static Ptr create();
164 
165  private:
167 
168  void unsubscribe(ProgressInterface::Ptr const& child);
169 
170  public:
171  Stuff subscribe(ProgressInterface::Ptr const& child);
172 
173  // ProgressInterface ///////////////////////////////////////////////////
174 
175  void setIdle() override;
176  void setWaiting(double progress = 0.0) override;
177  void setWorking(double progress) override;
178  void setFinished() override;
179  };
180 
181  class ProgressInterfaceMultiplexer : public virtual Base
182  {
183  public:
184  using Ptr = boost::shared_ptr<ProgressInterfaceMultiplexer>;
185 
186  private:
188  {
189  public:
190  using Ptr = boost::shared_ptr<ChildData>;
191 
192  public:
193  boost::mutex mut;
195  double progress{0.0};
196 
197  private:
198  ChildData() = default;
199 
200  public:
201  static Ptr create();
202 
203  void clearFinished();
204 
205  // ProgressStateInterface ///////////////////////////////////////////////////
206  void setProgress(State s, double progress = 0.0) override;
207  };
208 
210  {
211  public:
212  using Ptr = boost::shared_ptr<Child>;
213 
214  private:
217 
218  private:
220 
221  public:
223 
224  Child(const Child&) = delete;
225  Child(Child&&) = delete;
226  Child& operator=(const Child&) = delete;
227  Child& operator=(Child&&) = delete;
228  ~Child() override;
229 
230  // ProgressStateInterface ///////////////////////////////////////////////////
231  void setProgress(State s, double progress = 0.0) override;
232  };
233 
234  friend class Child;
235 
236  private:
237  boost::mutex mut;
239  std::set<ChildData::Ptr> children;
240 
241  private:
243 
244  public:
246 
248 
249  private:
250  void updateProgressState();
251  void unsubscribe(const ChildData::Ptr& data);
252  };
253 } // namespace Scroom::Utils
Scroom::Utils::ProgressInterfaceFromProgressStateInterface::setWaiting
void setWaiting(double progress=0.0) override
Definition: progressinterfacehelpers.cc:21
Scroom::Utils::ProgressInterfaceMultiplexer::Child::~Child
~Child() override
Definition: progressinterfacehelpers.cc:227
Scroom::Utils
Definition: assertions.hh:14
Scroom::Utils::ProgressStateInterface::Ptr
boost::shared_ptr< ProgressStateInterface > Ptr
Definition: progressinterfacehelpers.hh:26
Scroom::Utils::ProgressStateInterfaceFromProgressInterfaceForwarder::create
static Ptr create(ProgressInterface::Ptr child)
Definition: progressinterfacehelpers.cc:76
Scroom::Utils::ProgressInterfaceMultiplexer::ChildData::create
static Ptr create()
Definition: progressinterfacehelpers.cc:200
Scroom::Utils::ProgressInterfaceMultiplexer::ChildData::mut
boost::mutex mut
Definition: progressinterfacehelpers.hh:193
Scroom::Utils::ProgressInterfaceBroadcaster::Unsubscriber::create
static Ptr create(ProgressInterfaceBroadcaster::Ptr const &parent, ProgressInterface::Ptr const &child)
Definition: progressinterfacehelpers.cc:183
Scroom::Utils::ProgressInterfaceFromProgressStateInterface::setWorking
void setWorking(double progress) override
Definition: progressinterfacehelpers.cc:23
Scroom::Utils::ProgressInterfaceMultiplexer::unsubscribe
void unsubscribe(const ChildData::Ptr &data)
Definition: progressinterfacehelpers.cc:268
Scroom::Utils::Detail::ProgressStore::progress
double progress
Definition: progressinterfacehelpers.hh:110
Scroom::Utils::ProgressInterfaceMultiplexer::Child::parent
ProgressInterfaceMultiplexer::Ptr parent
Definition: progressinterfacehelpers.hh:215
Scroom::Utils::ProgressInterfaceBroadcaster::Unsubscriber
Definition: progressinterfacehelpers.hh:134
Scroom::Utils::ProgressInterfaceFromProgressStateInterface::setIdle
void setIdle() override
Definition: progressinterfacehelpers.cc:19
Scroom::Utils::ProgressStateInterfaceFromProgressInterfaceForwarder::setFinished
void setFinished() override
Definition: progressinterfacehelpers.cc:87
utilities.hh
Scroom::Utils::ProgressStateInterface::FINISHED
@ FINISHED
Definition: progressinterfacehelpers.hh:34
Scroom::Utils::ProgressInterfaceMultiplexer::ChildData
Definition: progressinterfacehelpers.hh:187
Scroom::Utils::ProgressInterfaceMultiplexer::ProgressInterfaceMultiplexer
ProgressInterfaceMultiplexer(ProgressInterface::Ptr parent)
Definition: progressinterfacehelpers.cc:247
ProgressInterface::Ptr
boost::shared_ptr< ProgressInterface > Ptr
Definition: progressinterface.hh:20
Scroom::Utils::ProgressInterfaceBroadcaster::children
std::set< ProgressInterface::Ptr > children
Definition: progressinterfacehelpers.hh:159
Scroom::Utils::ProgressStateInterfaceFromProgressInterface
Definition: progressinterfacehelpers.hh:72
ProgressInterface
Definition: progressinterface.hh:17
Scroom::Utils::ProgressInterfaceBroadcaster::Unsubscriber::operator=
Unsubscriber & operator=(const Unsubscriber &)=delete
Scroom::Utils::ProgressInterfaceMultiplexer::Ptr
boost::shared_ptr< ProgressInterfaceMultiplexer > Ptr
Definition: progressinterfacehelpers.hh:184
Scroom::Utils::Detail::ProgressStore::Ptr
boost::shared_ptr< ProgressStore > Ptr
Definition: progressinterfacehelpers.hh:106
Scroom::Utils::ProgressInterfaceMultiplexer::ChildData::ChildData
ChildData()=default
Scroom::Utils::ProgressInterfaceMultiplexer::Child::setProgress
void setProgress(State s, double progress=0.0) override
Definition: progressinterfacehelpers.cc:239
Scroom::Utils::ProgressInterfaceFromProgressStateInterface
Definition: progressinterfacehelpers.hh:40
Scroom::Utils::Detail::ProgressStore::ProgressStore
ProgressStore()=default
Scroom::Utils::ProgressInterfaceBroadcaster::setFinished
void setFinished() override
Definition: progressinterfacehelpers.cc:171
Scroom::Utils::ProgressInterfaceMultiplexer::ChildData::setProgress
void setProgress(State s, double progress=0.0) override
Definition: progressinterfacehelpers.cc:202
Scroom::Utils::ProgressInterfaceBroadcaster::subscribe
Stuff subscribe(ProgressInterface::Ptr const &child)
Definition: progressinterfacehelpers.cc:130
Scroom::Utils::Detail::ProgressStore::setProgress
void setProgress(State s, double progress=0.0) override
Definition: progressinterfacehelpers.cc:114
Scroom::Utils::ProgressInterfaceBroadcaster::ProgressInterfaceBroadcaster
ProgressInterfaceBroadcaster()
Definition: progressinterfacehelpers.cc:124
Scroom::Utils::ProgressInterfaceBroadcaster::create
static Ptr create()
Definition: progressinterfacehelpers.cc:122
Scroom::Utils::ProgressInterfaceBroadcaster::Unsubscriber::Ptr
boost::shared_ptr< Unsubscriber > Ptr
Definition: progressinterfacehelpers.hh:137
Scroom::Utils::ProgressStateInterfaceFromProgressInterfaceForwarder::setWaiting
void setWaiting(double progress=0.0) override
Definition: progressinterfacehelpers.cc:83
Scroom::Utils::ProgressInterfaceFromProgressStateInterface::setFinished
void setFinished() override
Definition: progressinterfacehelpers.cc:25
Scroom::Utils::ProgressStateInterface::WAITING
@ WAITING
Definition: progressinterfacehelpers.hh:32
Scroom::Utils::ProgressInterfaceMultiplexer::children
std::set< ChildData::Ptr > children
Definition: progressinterfacehelpers.hh:239
Scroom::Utils::ProgressInterfaceMultiplexer::mut
boost::mutex mut
Definition: progressinterfacehelpers.hh:237
Scroom::Utils::Detail::ProgressStore::init
void init(ProgressInterface::Ptr const &i)
Definition: progressinterfacehelpers.cc:95
Scroom::Utils::ProgressInterfaceMultiplexer::parent
ProgressStateInterface::Ptr parent
Definition: progressinterfacehelpers.hh:238
Scroom::Utils::ProgressInterfaceMultiplexer
Definition: progressinterfacehelpers.hh:181
Scroom::Utils::ProgressInterfaceBroadcaster::mut
boost::mutex mut
Definition: progressinterfacehelpers.hh:158
Scroom::Utils::ProgressStateInterface::State
State
Definition: progressinterfacehelpers.hh:29
Scroom::Utils::ProgressInterfaceBroadcaster::unsubscribe
void unsubscribe(ProgressInterface::Ptr const &child)
Definition: progressinterfacehelpers.cc:138
Scroom::Utils::ProgressInterfaceBroadcaster::setWorking
void setWorking(double progress) override
Definition: progressinterfacehelpers.cc:162
Scroom::Utils::ProgressStateInterfaceFromProgressInterfaceForwarder::ProgressStateInterfaceFromProgressInterfaceForwarder
ProgressStateInterfaceFromProgressInterfaceForwarder(ProgressInterface::Ptr child)
Definition: progressinterfacehelpers.cc:69
Scroom::Utils::ProgressInterfaceMultiplexer::ChildData::state
ProgressStateInterface::State state
Definition: progressinterfacehelpers.hh:194
Scroom::Utils::ProgressStateInterface::setProgress
virtual void setProgress(State s, double progress=0.0)=0
progressinterface.hh
Scroom::Utils::ProgressStateInterfaceFromProgressInterface::setProgress
void setProgress(State s, double progress=0.0) override
Definition: progressinterfacehelpers.cc:48
Scroom::Utils::ProgressStateInterfaceFromProgressInterfaceForwarder::setWorking
void setWorking(double progress) override
Definition: progressinterfacehelpers.cc:85
Scroom::Utils::Base
Definition: utilities.hh:30
Scroom::Utils::ProgressInterfaceBroadcaster::setIdle
void setIdle() override
Definition: progressinterfacehelpers.cc:144
stuff.hh
Scroom::Utils::ProgressInterfaceMultiplexer::Child::operator=
Child & operator=(const Child &)=delete
Scroom::Utils::ProgressInterfaceFromProgressStateInterfaceForwarder::setProgress
void setProgress(State s, double progress=0.0) override
Definition: progressinterfacehelpers.cc:41
Scroom::Utils::Stuff
boost::shared_ptr< void > Stuff
Definition: stuff.hh:18
Scroom::Utils::ProgressInterfaceMultiplexer::Child
Definition: progressinterfacehelpers.hh:209
Scroom::Utils::ProgressStateInterfaceFromProgressInterfaceForwarder::child
ProgressInterface::Ptr child
Definition: progressinterfacehelpers.hh:86
Scroom::Utils::Detail::ProgressStore::state
State state
Definition: progressinterfacehelpers.hh:109
Scroom::Utils::ProgressInterfaceBroadcaster::Unsubscriber::~Unsubscriber
~Unsubscriber()
Definition: progressinterfacehelpers.cc:196
Interface
Definition: interface.hh:10
Scroom::Utils::ProgressStateInterfaceFromProgressInterfaceForwarder
Definition: progressinterfacehelpers.hh:80
Scroom::Utils::ProgressStateInterface::WeakPtr
boost::weak_ptr< ProgressStateInterface > WeakPtr
Definition: progressinterfacehelpers.hh:27
Scroom::Utils::ProgressInterfaceBroadcaster::store
Detail::ProgressStore::Ptr store
Definition: progressinterfacehelpers.hh:160
Scroom::Utils::Detail::ProgressStore
Definition: progressinterfacehelpers.hh:103
Scroom::Utils::ProgressInterfaceMultiplexer::ChildData::clearFinished
void clearFinished()
Definition: progressinterfacehelpers.cc:209
Scroom::Utils::ProgressInterfaceBroadcaster::Unsubscriber::parent
ProgressInterfaceBroadcaster::Ptr parent
Definition: progressinterfacehelpers.hh:140
Scroom::Utils::ProgressInterfaceFromProgressStateInterfaceForwarder::ProgressInterfaceFromProgressStateInterfaceForwarder
ProgressInterfaceFromProgressStateInterfaceForwarder(ProgressStateInterface::Ptr child)
Definition: progressinterfacehelpers.cc:29
Scroom::Utils::ProgressInterfaceMultiplexer::ChildData::progress
double progress
Definition: progressinterfacehelpers.hh:195
Scroom::Utils::ProgressInterfaceMultiplexer::Child::create
static Ptr create(ProgressInterfaceMultiplexer::Ptr parent, ChildData::Ptr data)
Definition: progressinterfacehelpers.cc:233
Scroom::Utils::ProgressInterfaceBroadcaster::setWaiting
void setWaiting(double progress=0.0) override
Definition: progressinterfacehelpers.cc:153
Scroom::Utils::ProgressInterfaceFromProgressStateInterfaceForwarder
Definition: progressinterfacehelpers.hh:53
Detail
Definition: async-deleter.hh:12
Scroom::Utils::ProgressStateInterface::IDLE
@ IDLE
Definition: progressinterfacehelpers.hh:31
Scroom::Utils::ProgressInterfaceMultiplexer::Child::data
ChildData::Ptr data
Definition: progressinterfacehelpers.hh:216
Scroom::Utils::Detail::ProgressStore::create
static Ptr create()
Definition: progressinterfacehelpers.cc:93
Scroom::Utils::ProgressInterfaceMultiplexer::createProgressInterface
ProgressInterface::Ptr createProgressInterface()
Definition: progressinterfacehelpers.cc:257
Scroom::Utils::ProgressInterfaceBroadcaster::Ptr
boost::shared_ptr< ProgressInterfaceBroadcaster > Ptr
Definition: progressinterfacehelpers.hh:131
Scroom::Utils::ProgressInterfaceMultiplexer::ChildData::Ptr
boost::shared_ptr< ChildData > Ptr
Definition: progressinterfacehelpers.hh:190
Scroom::Utils::ProgressInterfaceBroadcaster
Definition: progressinterfacehelpers.hh:126
Scroom::Utils::ProgressInterfaceFromProgressStateInterfaceForwarder::child
ProgressStateInterface::Ptr child
Definition: progressinterfacehelpers.hh:59
Scroom::Utils::ProgressStateInterface
Definition: progressinterfacehelpers.hh:23
Scroom::Utils::ProgressInterfaceMultiplexer::Child::Child
Child(ProgressInterfaceMultiplexer::Ptr parent, ChildData::Ptr data)
Definition: progressinterfacehelpers.cc:221
Scroom::Utils::ProgressInterfaceBroadcaster::Unsubscriber::Unsubscriber
Unsubscriber(ProgressInterfaceBroadcaster::Ptr parent, ProgressInterface::Ptr child)
Definition: progressinterfacehelpers.cc:189
Scroom::Utils::ProgressInterfaceMultiplexer::updateProgressState
void updateProgressState()
Definition: progressinterfacehelpers.cc:274
Scroom::Utils::ProgressInterfaceMultiplexer::create
static Ptr create(ProgressInterface::Ptr parent)
Definition: progressinterfacehelpers.cc:252
Scroom::Utils::ProgressInterfaceFromProgressStateInterfaceForwarder::create
static Ptr create(ProgressStateInterface::Ptr child)
Definition: progressinterfacehelpers.cc:36
Scroom::Utils::ProgressStateInterface::WORKING
@ WORKING
Definition: progressinterfacehelpers.hh:33
Scroom::Utils::ProgressStateInterfaceFromProgressInterfaceForwarder::setIdle
void setIdle() override
Definition: progressinterfacehelpers.cc:81
Scroom::Utils::ProgressInterfaceBroadcaster::Unsubscriber::child
ProgressInterface::Ptr child
Definition: progressinterfacehelpers.hh:141