OpendTect  6.6
monitoriter.h
Go to the documentation of this file.
1 #pragma once
2 
3 /*+
4 ________________________________________________________________________
5 
6  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
7  Author: Bert
8  Date: May 2001 / Mar 2016
9  Contents: PickSet base classes
10 ________________________________________________________________________
11 
12 -*/
13 
14 #include "monitoredobject.h"
15 
16 
30 template <class ITyp>
32 {
33 public:
34 
35  typedef ITyp idx_type;
37  enum Direction { Forward, Backward };
38 
39  inline MonitorableIterBase(const MonitoredObject&,idx_type start,
40  idx_type stop);
42  inline virtual ~MonitorableIterBase() { retire(); }
43  inline const MonitoredObject& monitored() const { return obj_; }
44 
45  inline bool isEmpty() const { return size() < 1; }
46  inline size_type size() const;
47 
48  inline bool next();
49  inline bool isForward() const { return dir_ == Forward; }
50 
51  inline bool isValid() const { return isPresent(curidx_); }
52  inline bool atFirst() const { return curidx_ == startidx_; }
53  inline bool atLast() const { return curidx_ == stopidx_; }
54  inline idx_type curIdx() const { return curidx_; }
55  inline bool isPresent(idx_type) const;
56 
57  virtual void retire() {}
58  virtual void reInit();
59 
60 protected:
61 
63  const Direction dir_;
66 
68 
70 
71 };
72 
73 
74 
82 template <class ITyp>
84 {
85 public:
86 
88  ITyp startidx,ITyp stopidx);
90 
91  virtual void reInit();
92  virtual void retire();
93 
94 protected:
95 
97 
99 
100 };
101 
102 
110 template <class ITyp>
112 {
113 public:
114 
116  ITyp startidx,ITyp stopidx);
118 
120  { return mNonConst( mSelf().monitored() ); }
121 
122 protected:
123 
124  inline void insertedAtCurrent();
125  inline void currentRemoved();
126 
128 
129 };
130 
131 
132 template <class ITyp> inline
134  ITyp startidx, ITyp stopidx )
135  : obj_(obj)
136  , startidx_(startidx)
137  , stopidx_(stopidx)
138  , dir_(startidx<=stopidx ? Forward : Backward)
139 {
140  if ( startidx_ < 0 || stopidx_ < 0 )
141  {
142  // empty. make this a standard situation:
143  mNonConst( startidx_ ) = 0;
144  mNonConst( stopidx_ ) = -1;
145  mNonConst( dir_ ) = Forward;
146  }
147  reInit();
148 }
149 
150 
151 template <class ITyp> inline
153  : obj_(oth.monitored())
154  , startidx_(oth.startidx_)
155  , stopidx_(oth.stopidx_)
156  , dir_(oth.dir_)
157  , curidx_(oth.curidx_)
158 {
159 }
160 
161 
162 template <class ITyp> inline
164 {
165  if ( dir_ == Forward )
166  { curidx_++; return curidx_ <= stopidx_; }
167  else
168  { curidx_--; return curidx_ >= stopidx_; }
169 }
170 
171 
172 template <class ITyp> inline
174 {
175  if ( dir_ == Forward )
176  return idx >= startidx_ && idx <= stopidx_;
177  else
178  return idx <= startidx_ && idx >= stopidx_;
179 }
180 
181 
182 template <class ITyp> inline typename
184 {
185  return dir_ == Forward ? stopidx_-startidx_+1 : startidx_-stopidx_+1;
186 }
187 
188 
189 template <class ITyp> inline
191 {
192  curidx_ = dir_ == Forward ? startidx_ - 1 : startidx_ + 1;
193 }
194 
195 
196 template <class ITyp> inline
198  ITyp startidx, ITyp stopidx )
199  : MonitorableIterBase<ITyp>(obj,startidx,stopidx)
200  , ml_(obj)
201 {
202 }
203 
204 
205 template <class ITyp> inline
207  const MonitorableIter4Read& oth )
208  : MonitorableIterBase<ITyp>(oth)
209  , ml_(oth.obj_)
210 {
211 }
212 
213 
214 template <class ITyp> inline
216 {
217  ml_.unlockNow();
218 }
219 
220 
221 template <class ITyp> inline
223 {
224  ml_.reLock();
226 }
227 
228 
229 template <class ITyp> inline
231  ITyp startidx, ITyp stopidx )
232  : MonitorableIterBase<ITyp>(obj,startidx,stopidx)
233 {
234 }
235 
236 
237 template <class ITyp> inline
239  const MonitorableIter4Write& oth )
240  : MonitorableIterBase<ITyp>(oth)
241 {
242 }
243 
244 
245 template <class ITyp> inline
247 {
248  if ( this->dir_ == MonitorableIterBase<ITyp>::Backward )
249  mNonConst(this->startidx_)++;
250  else
251  {
252  mNonConst(this->stopidx_)++;
253  this->curidx_++;
254  }
255 }
256 
257 
258 template <class ITyp> inline
260 {
261  if ( this->dir_ == MonitorableIterBase<ITyp>::Backward )
262  mNonConst(this->startidx_)--;
263  else
264  {
265  mNonConst(this->stopidx_)--;
266  this->curidx_--;
267  }
268 }
MonitorableIter4Write::MonitorableIter4Write
MonitorableIter4Write(MonitoredObject &, ITyp startidx, ITyp stopidx)
Definition: monitoriter.h:230
MonitorableIter4Write
base class for non-const MonitoredObject iterator.
Definition: monitoriter.h:112
MonitorableIter4Read::retire
virtual void retire()
Definition: monitoriter.h:215
MonitorableIterBase::next
bool next()
Definition: monitoriter.h:163
MonitorableIterBase::startidx_
const idx_type startidx_
Definition: monitoriter.h:64
MonitorableIterBase::operator=
MonitorableIterBase & operator=(const MonitorableIterBase &)=delete
MonitorableIterBase::size
size_type size() const
Definition: monitoriter.h:183
monitoredobject.h
MonitorableIterBase::curidx_
idx_type curidx_
Definition: monitoriter.h:67
MonitorLock
protects a MonitoredObject against change.
Definition: monitoredobject.h:275
MonitorableIter4Read::reInit
virtual void reInit()
Definition: monitoriter.h:222
MonitorableIterBase::atFirst
bool atFirst() const
Definition: monitoriter.h:52
MonitorableIterBase::isPresent
bool isPresent(idx_type) const
Definition: monitoriter.h:173
MonitorableIterBase::retire
virtual void retire()
Definition: monitoriter.h:57
ChangeNotifyBlocker::obj_
const MonitoredObject & obj_
Definition: monitoredobject.h:311
MonitorableIterBase::isValid
bool isValid() const
Definition: monitoriter.h:51
MonitorableIterBase::size_type
idx_type size_type
Definition: monitoriter.h:36
MonitorableIter4Read::ml_
MonitorLock ml_
Definition: monitoriter.h:96
MonitorableIterBase::MonitorableIterBase
MonitorableIterBase(const MonitoredObject &, idx_type start, idx_type stop)
Definition: monitoriter.h:133
MonitorableIterBase
base class for MonitoredObject iterators. Inherit from one of its subclasses.
Definition: monitoriter.h:32
MonitorableIter4Read::MonitorableIter4Read
MonitorableIter4Read(const MonitoredObject &, ITyp startidx, ITyp stopidx)
Definition: monitoriter.h:197
MonitorableIterBase::stopidx_
const idx_type stopidx_
Definition: monitoriter.h:65
MonitorableIterBase::obj_
const MonitoredObject & obj_
Definition: monitoriter.h:62
MonitorableIterBase::Forward
@ Forward
Definition: monitoriter.h:37
MonitorableIter4Write::operator=
MonitorableIter4Write & operator=(const MonitorableIter4Write &)=delete
MonitorableIterBase::~MonitorableIterBase
virtual ~MonitorableIterBase()
Definition: monitoriter.h:42
mClass
#define mClass(module)
Definition: commondefs.h:181
MonitorableIterBase::idx_type
ITyp idx_type
Definition: monitoriter.h:35
MonitorableIterBase::dir_
const Direction dir_
Definition: monitoriter.h:63
MonitorableIterBase::reInit
virtual void reInit()
Definition: monitoriter.h:190
MonitorableIterBase::atLast
bool atLast() const
Definition: monitoriter.h:53
MonitorableIter4Write::insertedAtCurrent
void insertedAtCurrent()
Definition: monitoriter.h:246
MonitorableIter4Write::edited
MonitoredObject & edited()
Definition: monitoriter.h:119
mSelf
#define mSelf()
Definition: commondefs.h:144
MonitorableIterBase::isForward
bool isForward() const
Definition: monitoriter.h:49
MonitorableIterBase::monitored
const MonitoredObject & monitored() const
Definition: monitoriter.h:43
MonitorableIterBase::curIdx
idx_type curIdx() const
Definition: monitoriter.h:54
mNonConst
#define mNonConst(x)
Definition: commondefs.h:143
MonitorableIter4Read
base class for const MonitoredObject iterator.
Definition: monitoriter.h:84
MonitorableIterBase::Direction
Direction
Definition: monitoriter.h:37
MonitorableIterBase::isEmpty
bool isEmpty() const
Definition: monitoriter.h:45
MonitorableIter4Write::currentRemoved
void currentRemoved()
Definition: monitoriter.h:259
MonitorableIter4Read::operator=
MonitorableIter4Read & operator=(const MonitorableIter4Read &)=delete
MonitoredObject
Object that can be MT-safely monitored from cradle to grave.
Definition: monitoredobject.h:77

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B.V. 1995-2021