OpendTect  6.3
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 ________________________________________________________________________
10 
11 -*/
12 
13 #include "sets.h"
14 #include "threadlock.h"
15 
16 #include <iostream>
17 
51 template <class O, class V>
53 {
54 public:
55  HiddenParam( const V& undefval )
56  : lock_(true)
57  , undef_(undefval) {}
58  ~HiddenParam();
59 
60  void setParam(O* obj,const V& val);
61  bool setParamIfValueIs(O* obj,const V& curval, const V& newval );
65  const V& getParam(const O* obj) const;
66  bool hasParam(const O* obj) const;
67  void removeParam(O* obj);
68 
69 protected:
70 
74  V undef_;
75 
76 };
77 
78 
79 template <class O, class V>
81 {
82 #ifdef __debug__
83  Threads::Locker locker( lock_ );
84  if ( objects_.size() )
85  { //Using std C++ function because we cannot use pErrMsg or BufferString
86  std::cerr << "(PE) HiddenParam | Deleting a HiddenParam prematurely\n";
87  }
88 #endif
89 }
90 
91 
92 template <class O, class V>
93 void HiddenParam<O,V>::setParam( O* obj, const V& val )
94 {
95  Threads::Locker locker( lock_ );
96  const int idx = objects_.indexOf( obj );
97  if ( idx==-1 )
98  {
99  objects_ += obj;
100  params_ += val;
101  return;
102  }
103 
104  params_[idx] = val;
105 }
106 
107 
108 template <class O, class V>
109 bool HiddenParam<O,V>::setParamIfValueIs( O* obj, const V& curval,
110  const V& newval )
111 {
112  Threads::Locker locker( lock_ );
113  const int idx = objects_.indexOf( obj );
114  if ( idx==-1 )
115  {
116  objects_ += obj;
117  params_ += newval;
118  return true;
119  }
120 
121  if ( params_[idx]==curval )
122  {
123  params_[idx] = newval;
124  return true;
125  }
126 
127  return false;
128 }
129 
130 
131 template <class O, class V>
132 const V& HiddenParam<O,V>::getParam( const O* obj ) const
133 {
134  Threads::Locker locker( lock_ );
135  const int idx = objects_.indexOf( obj );
136  if ( !objects_.validIdx(idx) )
137  {
138  pErrMsg("Object not found");
139  return undef_;
140  }
141 
142  return params_[idx];
143 }
144 
145 
146 template <class O, class V>
147 bool HiddenParam<O,V>::hasParam( const O* obj ) const
148 {
149  Threads::Locker locker( lock_ );
150  return objects_.isPresent( obj );
151 }
152 
153 
154 
155 template <class O, class V>
157 {
158  Threads::Locker locker( lock_ );
159  const int idx = objects_.indexOf( obj );
160  if ( idx==-1 )
161  return;
162 
163  params_.removeSingle( idx );
164  objects_.removeSingle( idx );
165 }
~HiddenParam()
Definition: hiddenparam.h:80
Locks the lock, shutting out access from other threads if needed.
Definition: threadlock.h:83
A lock of a type that (hopefully) suits your needs. To use it, you need the Locker class...
Definition: threadlock.h:51
Workaround manager when you cannot add class members to a class due to binary compability issues...
Definition: hiddenparam.h:52
TypeSet< V > params_
Definition: hiddenparam.h:72
void removeParam(O *obj)
Definition: hiddenparam.h:156
const V & getParam(const O *obj) const
Definition: hiddenparam.h:132
V undef_
Definition: hiddenparam.h:74
Threads::Lock lock_
Definition: hiddenparam.h:73
ObjectSet< O > objects_
Definition: hiddenparam.h:71
bool hasParam(const O *obj) const
Definition: hiddenparam.h:147
#define mClass(module)
Definition: commondefs.h:161
void setParam(O *obj, const V &val)
Definition: hiddenparam.h:93
#define pErrMsg(msg)
Usual access point for programmer error messages.
Definition: errmsg.h:34
HiddenParam(const V &undefval)
Definition: hiddenparam.h:55
bool setParamIfValueIs(O *obj, const V &curval, const V &newval)
Definition: hiddenparam.h:109

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