OpendTect  6.6
hiddenparam.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: K. Tingdahl
8  Date: April 2011
9  RCS: $Id$
10 ________________________________________________________________________
11 
12 -*/
13 
14 #include "sets.h"
15 #include "threadlock.h"
16 
17 #include <iostream>
18 
52 template <class O, class V>
54 {
55 public:
56  HiddenParam( const V& undefval )
57  : lock_(true)
58  , undef_(undefval) {}
59  ~HiddenParam();
60 
61  void setParam(O* obj,const V& val);
62  bool setParamIfValueIs(O* obj,const V& curval, const V& newval );
66  const V& getParam(const O* obj) const;
67  bool hasParam(const O* obj) const;
68  void removeParam(O* obj);
69  void removeAndDeleteParam(O* obj);
70  void deleteAndZeroPtrParam(O* obj);
71 
72 protected:
73 
77  V undef_;
78 
79 };
80 
81 
82 template <class O, class V>
84 {
85 #ifdef __debug__
86  Threads::Locker locker( lock_ );
87  if ( objects_.size() )
88  { //Using std C++ function because we cannot use pErrMsg or BufferString
89  const char* nm = className( *objects_[0] );
90  const int sz = objects_.size();
91  std::cerr << "(PE) HiddenParam in " << nm << " (" << sz
92  << " counts) | Deleting a HiddenParam prematurely\n";
93  }
94 #endif
95 }
96 
97 
98 template <class O, class V>
99 void HiddenParam<O,V>::setParam( O* obj, const V& val )
100 {
101  Threads::Locker locker( lock_ );
102  const int idx = objects_.indexOf( obj );
103  if ( idx==-1 )
104  {
105  objects_ += obj;
106  params_ += val;
107  return;
108  }
109 
110  params_[idx] = val;
111 }
112 
113 
114 template <class O, class V>
115 bool HiddenParam<O,V>::setParamIfValueIs( O* obj, const V& curval,
116  const V& newval )
117 {
118  Threads::Locker locker( lock_ );
119  const int idx = objects_.indexOf( obj );
120  if ( idx==-1 )
121  {
122  objects_ += obj;
123  params_ += newval;
124  return true;
125  }
126 
127  if ( params_[idx]==curval )
128  {
129  params_[idx] = newval;
130  return true;
131  }
132 
133  return false;
134 }
135 
136 
137 template <class O, class V>
138 const V& HiddenParam<O,V>::getParam( const O* obj ) const
139 {
140  Threads::Locker locker( lock_ );
141  const int idx = objects_.indexOf( obj );
142  if ( !objects_.validIdx(idx) )
143  {
144  pErrMsg("Object not found");
145  return undef_;
146  }
147 
148  return params_[idx];
149 }
150 
151 
152 template <class O, class V>
153 bool HiddenParam<O,V>::hasParam( const O* obj ) const
154 {
155  Threads::Locker locker( lock_ );
156  return objects_.isPresent( obj );
157 }
158 
159 
160 template <class O, class V>
162 {
163  Threads::Locker locker( lock_ );
164  const int idx = objects_.indexOf( obj );
165  if ( idx==-1 )
166  return;
167 
168  params_.removeSingle( idx );
169  objects_.removeSingle( idx );
170 }
171 
172 
173 template <class O, class V>
175 {
176  Threads::Locker locker( lock_ );
177  const int idx = objects_.indexOf( obj );
178  if ( idx==-1 )
179  {
180  pErrMsg("Object not found");
181  return;
182  }
183 
184  delete params_[idx];
185  params_.removeSingle( idx );
186  objects_.removeSingle( idx );
187 }
188 
189 
190 template <class O, class V>
192 {
193  Threads::Locker locker( lock_ );
194  const int idx = objects_.indexOf( obj );
195  if ( idx==-1 )
196  {
197  pErrMsg("Object not found");
198  return;
199  }
200 
201  delete params_[idx];
202  params_[idx] = 0;
203 }
204 
HiddenParam::~HiddenParam
~HiddenParam()
Definition: hiddenparam.h:83
Threads::Locker
Locks the lock, shutting out access from other threads if needed.
Definition: threadlock.h:85
HiddenParam
Workaround manager when you cannot add class members to a class due to binary compability issues.
Definition: hiddenparam.h:54
ObjectSet< O >
HiddenParam::getParam
const V & getParam(const O *obj) const
Definition: hiddenparam.h:138
HiddenParam::params_
TypeSet< V > params_
Definition: hiddenparam.h:75
HiddenParam::undef_
V undef_
Definition: hiddenparam.h:77
HiddenParam::lock_
Threads::Lock lock_
Definition: hiddenparam.h:76
mClass
#define mClass(module)
Definition: commondefs.h:181
HiddenParam::removeParam
void removeParam(O *obj)
Definition: hiddenparam.h:161
pErrMsg
#define pErrMsg(msg)
Usual access point for programmer error messages.
Definition: errmsg.h:37
HiddenParam::objects_
ObjectSet< O > objects_
Definition: hiddenparam.h:74
HiddenParam::deleteAndZeroPtrParam
void deleteAndZeroPtrParam(O *obj)
Definition: hiddenparam.h:191
HiddenParam::removeAndDeleteParam
void removeAndDeleteParam(O *obj)
Definition: hiddenparam.h:174
HiddenParam::HiddenParam
HiddenParam(const V &undefval)
Definition: hiddenparam.h:56
threadlock.h
HiddenParam::setParam
void setParam(O *obj, const V &val)
Definition: hiddenparam.h:99
className
const char * className(const T &t)
Definition: errmsg.h:23
sets.h
HiddenParam::setParamIfValueIs
bool setParamIfValueIs(O *obj, const V &curval, const V &newval)
Definition: hiddenparam.h:115
Threads::Lock
A lock of a type that (hopefully) suits your needs. To use it, you need the Locker class.
Definition: threadlock.h:53
HiddenParam::hasParam
bool hasParam(const O *obj) const
Definition: hiddenparam.h:153
TypeSet< V >

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