OpendTect  6.3
manobjectset.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: Feb 2009
9 ________________________________________________________________________
10 
11 -*/
12 
13 #include "objectset.h"
14 
16 template <class T>
18 {
19 public:
20  virtual bool isManaged() const { return true; }
21  inline virtual T* removeSingle(int idx,bool kporder=true );
23  inline virtual void removeRange(int,int);
24  inline virtual T* replace(int idx, T*);
26  inline virtual T* removeAndTake(int idx, bool kporder=true );
28  inline virtual void erase();
29 
30  inline virtual ManagedObjectSetBase<T>& operator-=(T*);
31 
32 protected:
33  typedef void (*PtrFunc)(T*ptr);
34  ManagedObjectSetBase(PtrFunc delfunc)
35  : ObjectSet<T>()
36  , delfunc_( delfunc )
37  {}
39 private:
40  PtrFunc delfunc_;
41 };
42 
43 
48 template <class T>
50 {
51 public:
52  inline ManagedObjectSet();
53 
55  //Must be implemented as default
56  //copy constructor will call
57  //operator= before class is fully setup and
58  //append is not in virtual table
59 
60  inline ManagedObjectSet(const ObjectSet<T>&);
61 
62  ManagedObjectSet<T>& operator=(const ObjectSet<T>& os);
63 
64  inline virtual void append(const ObjectSet<T>&);
65 
66 private:
67 
68  static void delFunc(T* ptr) { delete ptr; }
69 };
70 
71 
77 template <class T>
79 {
80 public:
81  RefObjectSet();
83  RefObjectSet(const ObjectSet<T>&);
84 
85  RefObjectSet<T>& operator=(const ObjectSet<T>& os);
86  inline virtual T* replace(int idx, T*);
87  inline virtual void insertAt(T*,int idx);
88 
89 private:
90  virtual ObjectSet<T>& doAdd(T* ptr);
91  static void unRef(T* ptr) { unRefPtr(ptr); }
92 
93 };
94 
95 
96 template <class T> inline
98 { erase(); }
99 
100 
101 template <class T> inline
103 {
104  if ( ptr )
105  {
106  this->vec_.erase( (void*)ptr );
107  delfunc_( ptr );
108  }
109 
110  return *this;
111 }
112 
113 
114 template <class T> inline
115 T* ManagedObjectSetBase<T>::removeSingle( int idx, bool kporder )
116 {
117  delfunc_( ObjectSet<T>::removeSingle( idx, kporder ) );
118  return 0; //Don't give anyone a chance to play with the deleted object
119 }
120 
121 
122 template <class T> inline
123 T* ManagedObjectSetBase<T>::replace( int idx , T* ptr )
124 {
125  delfunc_( ObjectSet<T>::replace( idx, ptr ) );
126  return 0; //Don't give anyone a chance to play with the deleted object
127 }
128 
129 
130 template <class T> inline
132 {
133  for ( int idx=(int)i1; idx<=i2; idx++ )
134  delfunc_((*this)[idx]);
135 
136  ObjectSet<T>::removeRange( i1, i2 );
137 }
138 
139 
140 template <class T> inline
142 {
143  for ( int idx=ObjectSet<T>::size()-1; idx>=0; idx-- )
144  delfunc_((*this)[idx]);
145 
147 }
148 
149 
150 template <class T> inline
151 T* ManagedObjectSetBase<T>::removeAndTake(int idx, bool kporder )
152 {
153  return ObjectSet<T>::removeSingle( idx, kporder );
154 }
155 
156 
157 //ManagedObjectSet implementation
158 
159 template <class T> inline
161  : ManagedObjectSetBase<T>(delFunc)
162 {}
163 
164 
165 template <class T> inline
168 { *this = t; }
169 
170 
171 template <class T> inline
174 { *this = t; }
175 
176 
177 template <class T> inline
179 { ObjectSet<T>::operator=(os); return *this; }
180 
181 
182 
183 template <class T> inline
185 {
186  const int sz = os.size();
187  this->vec_.setCapacity( this->size()+sz, true );
188  if ( !os.isManaged() )
189  ObjectSet<T>::append( os );
190  else
191  for ( int idx=0; idx<sz; idx++ )
192  ObjectSet<T>::add( os[idx] ? new T( *os[idx] ) : 0 );
193 }
194 
195 
196 template <class T> inline
198  : ManagedObjectSetBase<T>( unRef )
199 {}
200 
201 
202 template <class T> inline
205 { *this = os; }
206 
207 
208 template <class T> inline
211 { *this = os; }
212 
213 
214 template <class T> inline
216 { ObjectSet<T>::operator=(os); return *this; }
217 
218 
219 template <class T> inline
220 T* RefObjectSet<T>::replace( int idx, T *ptr )
221 {
222  refPtr( ptr );
223  return ManagedObjectSetBase<T>::replace(idx, ptr );
224 }
225 
226 
227 template <class T> inline
228 void RefObjectSet<T>::insertAt( T *ptr, int idx )
229 {
230  refPtr( ptr );
232 }
233 
234 
235 template <class T> inline
237 { refPtr( ptr ); return ObjectSet<T>::doAdd(ptr); }
virtual void removeRange(size_type from, size_type to)
Definition: objectset.h:481
ManagedObjectSet< T > & operator=(const ObjectSet< T > &os)
Definition: manobjectset.h:178
RefObjectSet()
Definition: manobjectset.h:197
ManagedObjectSetBase(PtrFunc delfunc)
Definition: manobjectset.h:34
virtual bool isManaged() const
Definition: manobjectset.h:20
virtual T * removeSingle(size_type, bool keep_order=true)
Definition: objectset.h:464
virtual ObjectSet< T > & doAdd(T *)
Definition: objectset.h:355
virtual ObjectSet< T > & doAdd(T *ptr)
Definition: manobjectset.h:236
size_type size() const
Definition: objectset.h:48
bool append(TypeSetBase< T, I > &to, const TypeSetBase< S, J > &from)
append allowing a different type to be merged into set
Definition: typeset.h:205
Set of pointers to objects.
Definition: commontypes.h:28
ManagedObjectSet()
Definition: manobjectset.h:160
virtual T * removeSingle(int idx, bool kporder=true)
Definition: manobjectset.h:115
virtual bool isManaged() const
Definition: objectset.h:44
~ManagedObjectSetBase()
Definition: manobjectset.h:97
PtrFunc delfunc_
Definition: manobjectset.h:40
virtual void append(const ObjectSet< T > &)
Definition: manobjectset.h:184
virtual void removeRange(int, int)
Definition: manobjectset.h:131
static void delFunc(T *ptr)
Definition: manobjectset.h:68
RefObjectSet< T > & operator=(const ObjectSet< T > &os)
Definition: manobjectset.h:215
virtual T * replace(int idx, T *)
Definition: manobjectset.h:220
void removeRange(ODSET &inst, size_type start, size_type stop)
Removes a range from the set.
Definition: odset.h:55
bool setCapacity(I sz, bool withmargin)
Definition: vectoraccess.h:153
virtual void erase()
Definition: manobjectset.h:141
virtual void insertAt(T *, int idx)
Definition: manobjectset.h:228
Helper class to RefObjectSet and ManagedObjectSet.
Definition: manobjectset.h:17
ObjectSet< T > & operator=(const ObjectSet< T > &)
Definition: objectset.h:296
virtual void insertAt(T *newptr, size_type)
Definition: objectset.h:409
virtual T * replace(int idx, T *)
Definition: manobjectset.h:123
Definition: manobjectset.h:78
static void unRef(T *ptr)
Definition: manobjectset.h:91
virtual T * removeAndTake(int idx, bool kporder=true)
Definition: manobjectset.h:151
virtual void erase()
Definition: objectset.h:75
VectorAccess< void *, size_type > vec_
Definition: objectset.h:89
#define mClass(module)
Definition: commondefs.h:161
virtual ManagedObjectSetBase< T > & operator-=(T *)
Definition: manobjectset.h:102
ObjectSet where the objects contained are owned by this set.
Definition: manobjectset.h:49

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