OpendTect  6.6
monitor.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: April 2016
9 ________________________________________________________________________
10 
11 -*/
12 
13 #include "monitoredobject.h"
14 
15 
16 // Tools for implementation of subclasses of MonitoredObject
17 
18 
19 
20 #define mImplSimpleMonitoredGet_impl(fnnm,typ,memb,ovrspec) \
21  typ fnnm() const ovrspec { return getMemberSimple( memb ); }
22 
23 #define mImplSimpleMonitoredSet_impl(fnnm,typ,memb,chgtyp,ovrspec) \
24  void fnnm( typ _set_to_ ) ovrspec \
25  { setMemberSimple( memb, _set_to_, chgtyp, cUnspecChgID() ); }
26 
28 #define mImplSimpleMonitoredGet( fnnm, typ, memb ) \
29  mImplSimpleMonitoredGet_impl(fnnm,typ,memb,)
30 #define mImplSimpleMonitoredGetOverride( fnnm, typ, memb ) \
31  mImplSimpleMonitoredGet_impl(fnnm,typ,memb,override)
32 
34 #define mImplSimpleMonitoredSet(fnnm,typ,memb,chgtyp) \
35  mImplSimpleMonitoredSet_impl(fnnm,typ,memb,chgtyp,)
36 #define mImplSimpleMonitoredSetOverride(fnnm,typ,memb,chgtyp) \
37  mImplSimpleMonitoredSet_impl(fnnm,typ,memb,chgtyp,override)
38 
48 #define mImplSimpleMonitoredGetSet(pfx,fnnmget,fnnmset,typ,memb,chgtyp) \
49  pfx mImplSimpleMonitoredGet(fnnmget,typ,memb) \
50  pfx mImplSimpleMonitoredSet(fnnmset,const typ&,memb,chgtyp)
51 
52 
53 // Generalised; also available for friend classes
54 #define mLockMonitorable4Read(obj) \
55  MonitoredObject::AccessLocker accesslocker_( obj )
56 #define mLockMonitorable4Write(obj) \
57  MonitoredObject::AccessLocker accesslocker_( obj, false )
58 #define mMonitorableLock2Write(obj) accesslocker_.convertToWrite()
59 #define mMonitorableReLock(obj) accesslocker_.reLock()
60 #define mMonitorableUnlockAllAccess(obj) accesslocker_.unlockNow()
61 #define mMonitorableAccessLocker(obj) accesslocker_
62 #define mSendMonitorableChgNotif(obj,typ,id) \
63  (obj).sendChgNotif(accesslocker_,typ,id)
64 #define mSendMonitorableEntireObjChgNotif(obj) \
65  mSendMonitorableChgNotif(obj,MonitoredObject::cEntireObjectChange(), \
66  MonitoredObject::cEntireObjectChgID())
67 
68 // Shorthands for class implementation
69 #define mLock4Read() mLockMonitorable4Read(*this)
70 #define mLock4Write() mLockMonitorable4Write(*this)
71 #define mLock2Write() mMonitorableLock2Write(*this)
72 #define mReLock() mMonitorableReLock(*this)
73 #define mUnlockAllAccess() mMonitorableUnlockAllAccess(*this)
74 #define mAccessLocker() mMonitorableAccessLocker(*this)
75 #define mSendChgNotif(typ,id) mSendMonitorableChgNotif(*this,typ,id)
76 #define mSendEntireObjChgNotif() mSendMonitorableEntireObjChgNotif(*this)
77 
78 
79 
80 #define mDeclGenMonitorableAssignment(clss) \
81  private: \
82  void copyClassData(const clss&); \
83  ChangeType compareClassData(const clss&) const; \
84  protected: \
85  void copyAll(const clss&); \
86  public: \
87  clss(const clss&); \
88  clss& operator =(const clss&); \
89  bool operator ==(const clss&) const; \
90  inline bool operator !=( const clss& oth ) const \
91  { return !(*this == oth); } \
92  clss* clone() const override { return (clss*)getClone(); } \
93  ChangeType compareWith(const MonitoredObject&) const override
94 
95 
114 #define mDeclAbstractMonitorableAssignment(clss) \
115  mDeclGenMonitorableAssignment(clss)
116 
120 #define mDeclMonitorableAssignment(clss) \
121  mDeclGenMonitorableAssignment(clss); \
122  clss* getClone() const override { return new clss( *this ); }
123 
124 
125 #define mImplEmptyMonitorableCopyClassData( clssnm ) \
126 void clssnm::copyClassData( const clssnm& oth ) \
127 { \
128 }
129 
130 #define mImplAlwaysDifferentMonitorableCompareClassData( clssnm ) \
131 MonitoredObject::ChangeType clssnm::compareClassData( const clssnm& oth ) const \
132 { \
133  return cEntireObjectChange(); \
134 }
135 
136 #define mImplEmptyMonitorableCompare( clssnm ) \
137 MonitoredObject::ChangeType clssnm::compareClassData( const clssnm& oth ) const \
138 { \
139  return cNoChange(); \
140 }
141 
142 
170 #define mGenImplMonitorableAssignment(pfx,clss,baseclss) \
171 pfx clss& clss::operator =( const clss& oth ) \
172 { \
173  const ChangeType chgtyp = compareWith( oth ); \
174  if ( chgtyp != cNoChange() ) \
175  { \
176  mLock4Write(); \
177  AccessLocker lckr( oth ); \
178  copyAll( oth ); \
179  mSendChgNotif( chgtyp, cUnspecChgID() ); \
180  } \
181  return *this; \
182 } \
183 \
184 pfx bool clss::operator ==( const clss& oth ) const \
185 \
186 { \
187  return compareWith( oth ) == cNoChange(); \
188 } \
189 \
190 pfx void clss::copyAll( const clss& oth ) \
191 { \
192  baseclss::copyAll( oth ); \
193  AccessLocker lckr( oth ); \
194  copyClassData( oth ); \
195 } \
196 \
197 pfx MonitoredObject::ChangeType clss::compareWith( const MonitoredObject& mon ) const \
198 { \
199  if ( this == &mon ) \
200  return cNoChange(); \
201  mDynamicCastGet( const clss*, oth, &mon ); \
202  if ( !oth ) \
203  return cEntireObjectChange(); \
204 \
205  mLock4Read(); \
206  AccessLocker lckr( *oth ); \
207  const ChangeType ct = compareClassData( *oth ); \
208  mUnlockAllAccess(); \
209 \
210  return ct != cNoChange() ? ct : baseclss::compareWith( *oth ); \
211 }
212 
213 
214 #define mImplMonitorableAssignment(clss,baseclss) \
215  mGenImplMonitorableAssignment(,clss,baseclss)
216 
217 
218 #define mImplMonitorableAssignmentWithNoMembers( clss, baseclss ) \
219  mImplMonitorableAssignment(clss,baseclss) \
220  mImplEmptyMonitorableCopyClassData( clss ) \
221  mImplEmptyMonitorableCompare( clss )
222 
223 
224 
244 #define mStartMonitorableCompare() ChangeType chgtype = cNoChange()
245 
246 #define mHandleMonitorableCompare( memb, val ) \
247  if ( !(memb == oth.memb) ) \
248  { \
249  if ( chgtype == cNoChange() || chgtype == val ) \
250  chgtype = val; \
251  else \
252  return cEntireObjectChange(); \
253  }
254 
255 #define mHandleMonitorableComparePtrContents( memb, val ) \
256  if ( (memb && !oth.memb) || (!memb && oth.memb) || !(*memb == *oth.memb) ) \
257  { \
258  if ( chgtype == cNoChange() || chgtype == val ) \
259  chgtype = val; \
260  else \
261  return cEntireObjectChange(); \
262  }
263 
264 #define mDeliverMonitorableCompare() return chgtype;
265 
266 
269 #define mDeliverSingCondMonitorableCompare(nochgcond,chgtype) \
270  return (nochgcond) ? cNoChange() : chgtype
271 
272 
275 #define mDeliverYesNoMonitorableCompare(nochgcond) \
276  mDeliverSingCondMonitorableCompare( nochgcond, cEntireObjectChange() )
277 
278 
281 template <class T>
282 inline T MonitoredObject::getMemberSimple( const T& memb ) const
283 {
284  mLock4Read();
285  return memb;
286 }
287 
288 
291 template <class TMember,class TSetTo>
292 inline void MonitoredObject::setMemberSimple( TMember& memb, TSetTo setto,
293  ChangeType typ, IDType id )
294 {
295  mLock4Read();
296  if ( memb == setto )
297  return; // common
298 
299  if ( mLock2Write() || !(memb == setto) )
300  {
301  memb = setto;
302  mSendChgNotif( typ, id );
303  }
304 }
monitoredobject.h
MonitoredObject::IDType
int64_t IDType
Definition: monitoredobject.h:85
MonitoredObject::ChangeType
int ChangeType
Definition: monitoredobject.h:84
mLock2Write
#define mLock2Write()
Definition: monitor.h:71
mSendChgNotif
#define mSendChgNotif(typ, id)
Definition: monitor.h:75
MonitoredObject::getMemberSimple
T getMemberSimple(const T &) const
the get function used by mImplSimpleMonitoredGet
Definition: monitor.h:282
MonitoredObject::setMemberSimple
void setMemberSimple(TMember &, TSetTo, ChangeType, IDType)
the set function used by mImplSimpleMonitoredSet
Definition: monitor.h:292
mLock4Read
#define mLock4Read()
Definition: monitor.h:69

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