OpendTect  6.6
datapack.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: A.H.Bril
8  Date: Jan 2007
9  RCS: $Id$
10 ________________________________________________________________________
11 
12 -*/
13 
14 #include "basicmod.h"
15 #include "namedobj.h"
16 #include "manobjectset.h"
17 #include "multiid.h"
18 #include "threadlock.h"
19 #include "od_iosfwd.h"
20 
21 class DataPackMgr;
22 
23 
34 {
35 public:
36 
37  typedef int ID;
38  typedef MultiID FullID;
39  inline static ID getID( const FullID& fid ) { return fid.ID(1); }
40 
41  DataPack(const char* categry);
42  DataPack(const DataPack&);
43  virtual ~DataPack();
44 
45  ID id() const { return id_; }
46  FullID fullID( int mgrid ) const { return FullID(mgrid,id()); }
47  virtual const char* category() const { return category_.buf(); }
48 
49  virtual float nrKBytes() const = 0;
50  virtual void dumpInfo(IOPar&) const;
51 
52  static const char* sKeyCategory();
53  static ID cNoID() { return 0; }
54  static ID cUdfID() { return -1; }
55 
56  virtual bool isOK() const { return true; }
57 
58  Threads::Lock& updateLock() const { return updatelock_; }
59 
60  void release();
62 
64 
65 protected:
66 
67  void setManager(const DataPackMgr*);
68  const ID id_;
70  mutable int nrusers_;
74 
75  static ID getNewID();
76  static float sKb2MbFac();
77 
78  void setCategory( const char* c )
79  { *const_cast<BufferString*>(&category_) = c; }
80 
81  friend class DataPackMgr;
82 };
83 
84 
90 {
91 public:
92 
93  BufferDataPack( char* b=0, od_int64 s=0,
94  const char* catgry="Buffer" )
95  : DataPack(catgry)
96  , buf_(b)
97  , sz_(s) {}
98  ~BufferDataPack() { delete [] buf_; }
99 
100  char* buf() { return buf_; }
101  char const* buf() const { return buf_; }
102  od_int64 size() const { return sz_; }
103  void setBuf( char* b, od_int64 s )
104  { delete [] buf_; sz_ = s; buf_ = b; }
105 
106  virtual float nrKBytes() const { return sz_*sKb2MbFac(); }
107 
108 protected:
109 
110  char* buf_;
112 
113 };
114 
115 
134 {
135 public:
136  // You can, but normally should not, construct
137  // a manager. In general, leave it to DPM() - see below.
138 
139  typedef int ID;
140  inline static ID getID( const DataPack::FullID& fid )
141  { return fid.ID(0); }
142 
143  bool haveID(DataPack::ID) const;
144  inline bool haveID( const DataPack::FullID& fid ) const
145  { return id() == fid.ID(0) && haveID( fid.ID(1) ); }
146 
147  void add(DataPack*);
153  inline DataPack* obtain( DataPack::ID dpid )
154  { return doObtain(dpid,false); }
155  inline const DataPack* obtain( DataPack::ID dpid ) const
156  { return doObtain(dpid,false); }
157  inline DataPack* observe( DataPack::ID dpid )
158  { return doObtain(dpid,true); }
159  inline const DataPack* observe( DataPack::ID dpid ) const
160  { return doObtain(dpid,true); }
161 
163  void release( const DataPack* dp )
164  { if ( dp ) release( dp->id() ); }
165  void releaseAll(bool donotify);
166 
169 
170  // Standard mgr IDs take the low integer numbers
171  static ID BufID();
172  static ID PointID();
173  static ID SeisID();
174  static ID FlatID();
175  static ID SurfID();
176 
177  // Convenience to get info without any obtain()
178  const char* nameOf(DataPack::ID) const;
179  static const char* nameOf(const DataPack::FullID&);
180  const char* categoryOf(DataPack::ID) const;
181  static const char* categoryOf(const DataPack::FullID&);
182  virtual float nrKBytesOf(DataPack::ID) const;
183  virtual void dumpInfoFor(DataPack::ID,IOPar&) const;
184 
185  ID id() const { return id_; }
186  void dumpInfo(od_ostream&) const;
187  float nrKBytes() const;
188 
189  const ObjectSet<const DataPack>& packs() const { return packs_; }
190 
191 protected:
192 
195 
196  DataPack* doObtain(ID,bool) const;
197  int indexOf(ID) const;
200 
203 
204 public:
205 
212 
213  static DataPackMgr& DPM(ID);
214  static DataPackMgr* gtDPM(ID,bool);
215  static void dumpDPMs(od_ostream&);
216 
217 };
218 
219 template <class T>
221 {
222 public:
226  virtual ~ConstDataPackRef() { releaseNow();}
227 
229 
230  void releaseNow();
231 
232  operator bool() const { return ptr_; }
233  const T* operator->() const { return ptr_; }
234  const T& operator*() const { return *ptr_;}
235  const T* ptr() const { return ptr_; }
236  const DataPack* dataPack() const { return dp_; }
237 
238 protected:
239 
241  T* ptr_;
242 };
243 
276 template <class T>
278 {
279 public:
280  DataPackRef(DataPack* p);
282  DataPackRef(const DataPackRef<T>&);
283 
284  DataPackRef<T>& operator=(const DataPackRef<T>&);
285 
286  void releaseNow();
287 
288  T* operator->() { return this->ptr_; }
289  T& operator*() { return *this->ptr_;}
290  T* ptr() { return this->ptr_; }
291  DataPack* dataPack() { return this->dp_; }
292 };
293 
294 
299 
300 #define mObtainDataPack( var, type, mgrid, newid ) \
301 { \
302  if ( var ) \
303  { \
304  DPM( mgrid ).release( var->id() ); \
305  var = 0; \
306  } \
307  \
308  DataPack* __dp = DPM( mgrid ).obtain( newid ); \
309  mDynamicCastGet( type, __dummy, __dp ); \
310  if ( !__dummy && __dp ) \
311  DPM( mgrid ).release( __dp->id() ); \
312  else \
313  var = __dummy; \
314 }
315 
316 
317 #define mObtainDataPackToLocalVar( var, type, mgrid, newid ) \
318 type var = 0; \
319 mObtainDataPack( var, type, mgrid, newid ); \
320 
321 //Implementations
322 template <class T> inline
324  : dp_(const_cast<DataPack*>(p) )
325  , ptr_( 0 )
326 {
327  mDynamicCast(T*, ptr_, dp_ );
328 }
329 
330 
331 template <class T> inline
333  : ptr_( dpr.ptr_ )
334  , dp_( dpr.dp_ )
335 {
336  if ( dp_ ) dp_->obtain();
337 }
338 
339 
340 template <class T> inline
343 {
344  releaseNow();
345  ptr_ = dpr.ptr_;
346  dp_ = dpr.dp_;
347 
348  if ( dp_ ) dp_->obtain();
349  return *this;
350 }
351 
352 
353 template <class T> inline
355 {
356  ptr_ = 0;
357  if ( dp_ )
358  {
359  dp_->release();
360  dp_ = 0;
361  }
362 }
363 
364 
365 template <class T> inline
367  : ConstDataPackRef<T>( p )
368 { }
369 
370 
371 template <class T> inline
373  : ConstDataPackRef<T>( dpr )
374 { }
375 
376 
377 template <class T> inline
379 {
381  return *this;
382 }
383 
384 
DataPackMgr::nameOf
const char * nameOf(DataPack::ID) const
BufferDataPack::buf
char * buf()
Definition: datapack.h:100
ConstDataPackRef::ptr
const T * ptr() const
Definition: datapack.h:235
MultiID::ID
int ID(int idx) const
Definition: multiid.h:57
ConstDataPackRef::ConstDataPackRef
ConstDataPackRef(const DataPack *p)
Assumes p is obtained.
Definition: datapack.h:323
DataPackRef::operator=
DataPackRef< T > & operator=(const DataPackRef< T > &)
Definition: datapack.h:378
DataPack::id
ID id() const
Definition: datapack.h:45
DataPack::nrKBytes
virtual float nrKBytes() const =0
NamedCallBacker
CallBacker object with a name. Use if you want your object to be able to send and receive CallBack's,...
Definition: namedobj.h:72
DataPack::getID
static ID getID(const FullID &fid)
Definition: datapack.h:39
DataPackMgr::gtDPM
static DataPackMgr * gtDPM(ID, bool)
DataPackMgr::id
ID id() const
Definition: datapack.h:185
DataPack::setManager
void setManager(const DataPackMgr *)
mGlobal
#define mGlobal(module)
Definition: commondefs.h:180
DataPackMgr::observe
const DataPack * observe(DataPack::ID dpid) const
Definition: datapack.h:159
mDeclInstanceCreatedNotifierAccess
#define mDeclInstanceCreatedNotifierAccess(clss)
Definition: notify.h:248
DataPackMgr::obtain
const DataPack * obtain(DataPack::ID dpid) const
Definition: datapack.h:155
ObjectSet< const DataPack >
ConstDataPackRef::operator=
ConstDataPackRef< T > & operator=(const ConstDataPackRef< T > &)
Definition: datapack.h:342
DataPackMgr::packs
const ObjectSet< const DataPack > & packs() const
Definition: datapack.h:189
ConstDataPackRef::ConstDataPackRef
ConstDataPackRef(const ConstDataPackRef< T > &)
Definition: datapack.h:332
od_int64
#define od_int64
Definition: plftypes.h:35
DataPack::sKb2MbFac
static float sKb2MbFac()
1 / 1024
DataPack::nrusers_
int nrusers_
Definition: datapack.h:70
mExpClass
#define mExpClass(module)
Definition: commondefs.h:177
BufferDataPack::~BufferDataPack
~BufferDataPack()
Definition: datapack.h:98
BufferDataPack::setBuf
void setBuf(char *b, int64_t s)
Definition: datapack.h:103
namedobj.h
DataPack::nruserslock_
Threads::Lock nruserslock_
Definition: datapack.h:71
DataPackMgr::ID
int ID
Each Mgr has its own ID.
Definition: datapack.h:139
DataPackMgr::add
void add(DataPack *)
The pack becomes mine.
DataPackRef::operator->
T * operator->()
Definition: datapack.h:288
DataPack::fullID
FullID fullID(int mgrid) const
Definition: datapack.h:46
DataPackMgr::dumpDPMs
static void dumpDPMs(od_ostream &)
ConstDataPackRef::operator*
const T & operator*() const
Definition: datapack.h:234
DataPackMgr::categoryOf
static const char * categoryOf(const DataPack::FullID &)
DataPack::cNoID
static ID cNoID()
Definition: datapack.h:53
CallBacker
Inherit from this class to be able to send and/or receive CallBacks.
Definition: callback.h:185
DataPack::dumpInfo
virtual void dumpInfo(IOPar &) const
DataPackMgr::rwlock_
Threads::Lock rwlock_
Definition: datapack.h:199
DataPackRef::operator*
T & operator*()
Definition: datapack.h:289
DataPackMgr::BufID
static ID BufID()
Simple data buffer: 1.
ManagedObjectSet< DataPackMgr >
BufferDataPack::buf
char const * buf() const
Definition: datapack.h:101
DataPackMgr::haveID
bool haveID(const DataPack::FullID &fid) const
Definition: datapack.h:144
DataPackMgr::DataPackMgr
DataPackMgr(ID)
DataPackMgr::nrKBytes
float nrKBytes() const
DataPackRef::dataPack
DataPack * dataPack()
Definition: datapack.h:291
DataPackMgr::packToBeRemoved
Notifier< DataPackMgr > packToBeRemoved
Passed CallBacker* = Pack.
Definition: datapack.h:168
DataPackMgr::FlatID
static ID FlatID()
Flat (N1xN2) data: 4.
multiid.h
ConstDataPackRef
Definition: datapack.h:221
DataPackMgr::doObtain
DataPack * doObtain(ID, bool) const
DataPack::isOK
virtual bool isOK() const
Definition: datapack.h:56
DataPack::setCategory
void setCategory(const char *c)
Definition: datapack.h:78
DataPack::sKeyCategory
static const char * sKeyCategory()
DataPackMgr::SeisID
static ID SeisID()
Cube/Block (N1xN2xN3) data: 3.
BufferDataPack::size
int64_t size() const
Definition: datapack.h:102
DataPack::updateLock
Threads::Lock & updateLock() const
Definition: datapack.h:58
ConstDataPackRef::ptr_
T * ptr_
Definition: datapack.h:241
DataPackMgr::indexOf
int indexOf(ID) const
Object should be readlocked.
DataPackMgr::DPM
static DataPackMgr & DPM(ID)
ConstDataPackRef::operator->
const T * operator->() const
Definition: datapack.h:233
DataPackMgr::release
void release(const DataPack *dp)
Definition: datapack.h:163
DataPack::release
void release()
mClass
#define mClass(module)
Definition: commondefs.h:181
DataPackMgr::id_
ID id_
Definition: datapack.h:193
DataPackRef::DataPackRef
DataPackRef(DataPack *p)
Assumes p is obtained.
Definition: datapack.h:366
DataPack::FullID
MultiID FullID
Definition: datapack.h:38
DataPackMgr::getID
static ID getID(const DataPack::FullID &fid)
Definition: datapack.h:140
DataPackMgr::addAndObtain
DataPack * addAndObtain(DataPack *)
BufferDataPack::nrKBytes
virtual float nrKBytes() const
Definition: datapack.h:106
DataPackMgr::haveID
bool haveID(DataPack::ID) const
Notifier< DataPackMgr >
DataPack::manager_
const DataPackMgr * manager_
Definition: datapack.h:73
DPM
DataPackMgr & DPM(DataPackMgr::ID)
will create a new mgr if needed
ConstDataPackRef::~ConstDataPackRef
virtual ~ConstDataPackRef()
Definition: datapack.h:226
DataPackMgr::packs_
ObjectSet< const DataPack > packs_
Definition: datapack.h:194
DataPackMgr::observe
DataPack * observe(DataPack::ID dpid)
Definition: datapack.h:157
DataPackMgr::mgrlistlock_
static Threads::Lock mgrlistlock_
Definition: datapack.h:201
DataPackMgr::categoryOf
const char * categoryOf(DataPack::ID) const
MultiID
Compound key consisting of ints.
Definition: multiid.h:24
DataPack::cUdfID
static ID cUdfID()
Definition: datapack.h:54
DataPackMgr::~DataPackMgr
~DataPackMgr()
BufferDataPack
Simple DataPack based on an unstructured char array buffer.
Definition: datapack.h:90
BufferString
OD::String with its own variable length buffer. The buffer has a guaranteed minimum size.
Definition: bufstring.h:40
DataPack::category_
const BufferString category_
Definition: datapack.h:69
DataPack::category
virtual const char * category() const
Definition: datapack.h:47
DataPackMgr::dumpInfo
void dumpInfo(od_ostream &) const
DataPackMgr
Manages DataPacks.
Definition: datapack.h:134
DataPackMgr::obtain
DataPack * obtain(DataPack::ID dpid)
Definition: datapack.h:153
DataPack::ID
int ID
Definition: datapack.h:37
DataPack::DataPack
DataPack(const DataPack &)
ConstDataPackRef::releaseNow
void releaseNow()
Definition: datapack.h:354
DataPack::DataPack
DataPack(const char *categry)
od_iosfwd.h
DataPack::updatelock_
Threads::Lock updatelock_
Definition: datapack.h:72
BufferDataPack::sz_
int64_t sz_
Definition: datapack.h:111
threadlock.h
BufferDataPack::BufferDataPack
BufferDataPack(char *b=0, int64_t s=0, const char *catgry="Buffer")
Definition: datapack.h:93
manobjectset.h
DataPackRef::releaseNow
void releaseNow()
DataPackMgr::dumpInfoFor
virtual void dumpInfoFor(DataPack::ID, IOPar &) const
DataPack
A data packet: data+positioning and more that needs to be shared.
Definition: datapack.h:34
DataPackMgr::SurfID
static ID SurfID()
Surface (triangulated) data: 5.
DataPackMgr::nrKBytesOf
virtual float nrKBytesOf(DataPack::ID) const
ConstDataPackRef::dataPack
const DataPack * dataPack() const
Definition: datapack.h:236
DataPackMgr::newPack
Notifier< DataPackMgr > newPack
Passed CallBacker* = Pack.
Definition: datapack.h:167
DataPackMgr::mgrs_
static ManagedObjectSet< DataPackMgr > mgrs_
Definition: datapack.h:202
mDynamicCast
#define mDynamicCast(typ, out, in)
Definition: commondefs.h:147
DataPack::obtain
DataPack * obtain()
DataPack::getNewID
static ID getNewID()
ensures a global data pack ID
BufferDataPack::buf_
char * buf_
Definition: datapack.h:110
DataPackMgr::nameOf
static const char * nameOf(const DataPack::FullID &)
DataPackMgr::release
void release(DataPack::ID)
od_ostream
OD class for stream write common access to the user log file, or std::cout in other than od_main.
Definition: od_ostream.h:26
Threads::Lock
A lock of a type that (hopefully) suits your needs. To use it, you need the Locker class.
Definition: threadlock.h:53
DataPackRef::ptr
T * ptr()
Definition: datapack.h:290
IOPar
Generalized set of parameters of the keyword-value type.
Definition: iopar.h:55
DataPackMgr::PointID
static ID PointID()
Sets of 'unconnected' points: 2.
DataPackMgr::releaseAll
void releaseAll(bool donotify)
ConstDataPackRef::dp_
DataPack * dp_
Definition: datapack.h:240
DataPack::id_
const ID id_
Definition: datapack.h:68
DataPackRef
Definition: datapack.h:278
DataPack::~DataPack
virtual ~DataPack()

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