OpendTect  6.3
objectset.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 / many others
8  Date: Apr 1995 / Feb 2009
9 ________________________________________________________________________
10 
11 -*/
12 
13 #ifndef odset_h
14 #include "odset.h"
15 #endif
16 #ifndef vectoraccess_h
17 #include "vectoraccess.h"
18 #endif
19 
20 #ifdef __debug__
21 # include "debug.h"
22 #endif
23 
24 
32 template <class T>
33 mClass(Basic) ObjectSet : public OD::Set
34 {
35 public:
36 
37  typedef int size_type;
38  typedef T object_type;
39 
40  inline ObjectSet();
41  inline ObjectSet(const ObjectSet<T>&);
42  inline virtual ~ObjectSet() {}
43  inline ObjectSet<T>& operator=(const ObjectSet<T>&);
44  virtual bool isManaged() const { return false; }
45 
46  inline bool nullAllowed() const { return allow0_; }
47  inline void allowNull(bool yn=true);
48  inline size_type size() const { return vec_.size(); }
49  inline virtual od_int64 nrItems() const { return size(); }
50 
51  inline virtual bool validIdx(od_int64) const;
52  inline virtual bool isPresent(const T*) const;
53  inline virtual size_type indexOf(const T*) const;
54  inline virtual T* get(size_type);
55  inline virtual const T* get(size_type) const;
56  inline virtual T* get(const T*) const;
57  inline T* first();
58  inline const T* first() const;
59  inline T* last();
60  inline const T* last() const;
61 
62  inline ObjectSet<T>& add( T* t ) { return doAdd(t); }
63  inline void push( T* t ) { doAdd( t ); }
64  inline bool addIfNew(T*);
65  inline virtual T* replace(size_type idx,T*);
66  inline virtual void insertAt(T* newptr,size_type);
67  inline virtual void insertAfter(T* newptr,size_type);
68 
69  inline virtual void copy(const ObjectSet<T>&);
70  inline virtual void append(const ObjectSet<T>&);
71  inline virtual void swap(od_int64,od_int64);
72  inline virtual void reverse();
73 
74 
75  inline virtual void erase() { plainErase(); }
76  inline virtual T* pop();
77  virtual inline T* removeSingle(size_type,bool keep_order=true);
79  virtual void removeRange(size_type from,size_type to);
80 
81  inline ObjectSet<T>& operator +=( T* t ) { return doAdd( t ); }
82  inline T* operator[]( size_type i ) {return get(i);}
83  inline const T* operator[]( size_type i ) const {return get(i);}
84  inline const T* operator[]( const T* t ) const {return get(t);}
85  virtual ObjectSet<T>& operator -=(T*);
86 
87 protected:
88 
90  bool allow0_;
91 
92  inline virtual ObjectSet<T>& doAdd(T*);
93 
94 public:
95 
96  inline void plainErase() { vec_.erase(); }
98 };
99 
100  // useful for iterating over any OD::Set
101 template <class T>
102 mGlobal(Basic) inline T& getRef( ObjectSet<T>& objset, int i )
103 { return *objset.get( i ); }
104 template <class T>
105 mGlobal(Basic) inline const T& getRef( const ObjectSet<T>& objset, int i )
106 { return *objset.get( i ); }
107 
108 
109 #define mObjectSetApplyToAll( os, op ) \
110  mODSetApplyToAll( ObjectSet<int>::size_type, os, op )
111 
112 #define mObjectSetApplyToAllFunc( fn, op, extra ) \
113 template <class T> \
114 inline void fn( ObjectSet<T>& os ) \
115 { \
116  mObjectSetApplyToAll( os, op ); \
117  extra; \
118 }
119 
120 
122 mObjectSetApplyToAllFunc( deepErase, delete os.removeSingle(idx), )
123 
124 
126 mObjectSetApplyToAllFunc( deepEraseArr, delete [] os.removeSingle(idx), )
127 
128 
130 template <class T,class S>
131 inline void deepAppend( ObjectSet<T>& to, const ObjectSet<S>& from )
132 {
133  const int sz = from.size();
134  for ( int idx=0; idx<sz; idx++ )
135  to.add( from[idx] ? new T( *from[idx] ) : 0 );
136 }
137 
138 
140 template <class T,class S>
141 inline void deepAppendClone( ObjectSet<T>& to, const ObjectSet<S>& from )
142 {
143  const int sz = from.size();
144  for ( int idx=0; idx<sz; idx++ )
145  to.add( from[idx] ? from[idx]->clone() : 0 );
146 }
147 
148 
150 template <class T,class S>
151 inline void deepCopy( ObjectSet<T>& to, const ObjectSet<S>& from )
152 {
153  if ( &to == &from ) return;
154  deepErase( to );
155  to.allowNull( from.nullAllowed() );
156  deepAppend( to, from );
157 }
158 
159 
161 template <class T,class S>
162 inline void deepCopyClone( ObjectSet<T>& to, const ObjectSet<S>& from )
163 {
164  if ( &to == &from ) return;
165  deepErase( to );
166  to.allowNull( from.nullAllowed() );
167  deepAppendClone( to, from );
168 }
169 
170 
172 template <class T,class S>
173 inline typename ObjectSet<T>::size_type indexOf( const ObjectSet<T>& os,
174  const S& val )
175 {
176  for ( int idx=0; idx<os.size(); idx++ )
177  {
178  if ( *os[idx] == val )
179  return idx;
180  }
181  return -1;
182 }
183 
184 
186 template <class T,class S>
187 inline const T* find( const ObjectSet<T>& os, const S& val )
188 {
189  const typename ObjectSet<T>::size_type idx = indexOf( os, val );
190  return idx == -1 ? 0 : os[idx];
191 }
192 
193 
195 template <class T,class S>
196 inline T* find( ObjectSet<T>& os, const S& val )
197 {
198  const typename ObjectSet<T>::size_type idx = indexOf( os, val );
199  return idx == -1 ? 0 : os[idx];
200 }
201 
203 template <class T>
205 {
206  const typename ObjectSet<T>::size_type sz = os.size();
207  for ( typename ObjectSet<T>::size_type d=sz/2; d>0; d=d/2 )
208  {
209  for ( typename ObjectSet<T>::size_type i=d; i<sz; i++ )
210  {
211  for ( typename ObjectSet<T>::size_type j=i-d; j>=0; j-=d )
212  {
213  T* o1 = os[j]; T* o2 = os[j+d];
214  if ( !o2 || o1 == o2 || (o1 && !(*o1 > *o2) ) )
215  break;
216  os.swap( j, j+d );
217  }
218  }
219  }
220 }
221 
223 template <class T>
224 inline void sort( ObjectSet<T>& os )
225 {
226  if ( os.nullAllowed() )
228  else
229  {
230  const typename ObjectSet<T>::size_type sz = os.size();
231  for ( typename ObjectSet<T>::size_type d=sz/2; d>0; d=d/2 )
232  {
233  for ( typename ObjectSet<T>::size_type i=d; i<sz; i++ )
234  {
235  for ( typename ObjectSet<T>::size_type j=i-d;
236  j>=0 && *os[j]>*os[j+d]; j-=d )
237  {
238  os.swap( j, j+d );
239  }
240  }
241  }
242  }
243 }
244 
245 
247 template <class T>
248 inline bool equalObjects( const ObjectSet<T>& os1, const ObjectSet<T>& os2 )
249 {
250  typedef typename ObjectSet<T>::size_type size_type;
251  const size_type sz = os1.size();
252  if ( os2.size() != sz )
253  return false;
254 
255  for ( size_type idx=0; idx<sz; idx++ )
256  if ( os1[idx] != os2[idx] )
257  return false;
258 
259  return true;
260 }
261 
262 
264 template <class T>
265 inline bool equalContents( const ObjectSet<T>& os1, const ObjectSet<T>& os2 )
266 {
267  typedef typename ObjectSet<T>::size_type size_type;
268  const size_type sz = os1.size();
269  if ( os2.size() != sz )
270  return false;
271 
272  for ( size_type idx=0; idx<sz; idx++ )
273  {
274  const T* o1 = os1[idx]; const T* o2 = os2[idx];
275  if ( !o1 && !o2 )
276  continue;
277  if ( !o1 || !o2 || (!(*o1 == *o2)) )
278  return false;
279  }
280  return true;
281 }
282 
283 
284 // Member function implementations
285 template <class T> inline
286 ObjectSet<T>::ObjectSet() : allow0_(false)
287 {}
288 
289 
290 template <class T> inline
292 { *this = t; }
293 
294 
295 template <class T> inline
297 { allow0_ = os.allow0_; copy(os); return *this; }
298 
299 
300 template <class T> inline
301 void ObjectSet<T>::allowNull( bool yn )
302 { allow0_ = yn; }
303 
304 
305 template <class T> inline
307 { return idx>=0 && idx<size(); }
308 
309 
310 template <class T> inline
312 {
313 #ifdef __debug__
314  if ( !validIdx(idx) )
315  DBG::forceCrash(true);
316 #endif
317  return static_cast<T*>( vec_[idx] );
318 }
319 
320 
321 template <class T> inline
322 const T* ObjectSet<T>::get( size_type idx ) const
323 {
324 #ifdef __debug__
325  if ( !validIdx(idx) )
326  DBG::forceCrash(true);
327 #endif
328  return static_cast<const T*>( vec_[idx] );
329 }
330 
331 
332 template <class T> inline
333 T* ObjectSet<T>::get( const T* t ) const
334 {
335  const size_type idx = indexOf(t);
336  return idx < 0 ? 0 : const_cast<T*>(t);
337 }
338 
339 
340 template <class T> inline
341 typename ObjectSet<T>::size_type ObjectSet<T>::indexOf( const T* ptr ) const
342 {
343  return vec_.indexOf( (void*) ptr, true );
344 }
345 
346 
347 template <class T> inline
348 bool ObjectSet<T>::isPresent( const T* ptr ) const
349 {
350  return vec_.isPresent( (void*) ptr );
351 }
352 
353 
354 template <class T> inline
356 {
357  if ( ptr || allow0_ )
358  vec_.push_back( (void*)ptr );
359  return *this;
360 }
361 
362 
363 template <class T> inline
365 {
366  if ( ptr || allow0_ )
367  vec_.erase( (void*)ptr );
368  return *this;
369 }
370 
371 
372 template <class T> inline
374 {
375 #ifdef __debug__
376  if ( !validIdx(idx0) || !validIdx(idx1) )
377  DBG::forceCrash(true);
378 #endif
379  vec_.swap( mCast(size_type,idx0), mCast(size_type,idx1) );
380 }
381 
382 
383 template <class T> inline
385 {
386  const size_type sz = size();
387  const size_type hsz = sz/2;
388  for ( size_type idx=0; idx<hsz; idx++ )
389  swap( idx, sz-1-idx );
390 }
391 
392 
393 template <class T> inline
394 T* ObjectSet<T>::replace( size_type idx, T* newptr )
395 {
396  if ( !validIdx(idx) )
397 #ifdef __debug__
398  DBG::forceCrash(true);
399 #else
400  return 0;
401 #endif
402  T* ptr = static_cast<T*>( vec_[idx] );
403  vec_[idx] = (void*)newptr;
404  return ptr;
405 }
406 
407 
408 template <class T> inline
409 void ObjectSet<T>::insertAt( T* newptr, size_type idx )
410 {
411  vec_.insert( idx, (void*)newptr );
412 }
413 
414 
415 template <class T> inline
416 void ObjectSet<T>::insertAfter( T* newptr, size_type idx )
417 {
418  add( newptr );
419  if ( idx < 0 )
420  vec_.moveToStart( (void*)newptr );
421  else
422  vec_.moveAfter( (void*)newptr, vec_[idx] );
423 }
424 
425 
426 template <class T> inline
428 {
429  if ( &os != this )
430  {
431  erase();
432  allow0_ = os.allow0_;
433  append( os );
434  }
435 }
436 
437 
438 template <class T> inline
440 {
441  const size_type sz = os.size();
442  vec_.setCapacity( size()+sz, true );
443  for ( size_type idx=0; idx<sz; idx++ )
444  add( const_cast<T*>( os[idx] ) );
445 }
446 
447 template <class T> inline
449 { return static_cast<T*>( vec_.pop_back() ); }
450 
451 
452 template <class T> inline
454 {
455  if ( isPresent(ptr) )
456  return false;
457 
458  add( ptr );
459  return true;
460 }
461 
462 
463 template <class T> inline
464 T* ObjectSet<T>::removeSingle( size_type idx, bool kporder )
465 {
466  T* res = static_cast<T*>(vec_[idx]);
467  if ( kporder )
468  vec_.remove( idx );
469  else
470  {
471  const size_type lastidx = size()-1;
472  if ( idx!=lastidx )
473  vec_[idx] = vec_[lastidx];
474  vec_.remove( lastidx );
475  }
476  return res;
477 }
478 
479 
480 template <class T> inline
482 { vec_.remove( i1, i2 ); }
483 template <class T> inline T* ObjectSet<T>::first()
484 { return isEmpty() ? 0 : (*this)[0]; }
485 template <class T> inline const T* ObjectSet<T>::first() const
486 { return isEmpty() ? 0 : (*this)[0]; }
487 template <class T> inline T* ObjectSet<T>::last()
488 { return isEmpty() ? 0 : (*this)[size()-1]; }
489 template <class T> inline const T* ObjectSet<T>::last() const
490 { return isEmpty() ? 0 : (*this)[size()-1]; }
T * last()
Definition: objectset.h:487
bool nullAllowed() const
Definition: objectset.h:46
T * operator[](size_type i)
Definition: objectset.h:82
bool push_back(const T &t)
Definition: vectoraccess.h:181
virtual void removeRange(size_type from, size_type to)
Definition: objectset.h:481
T to(const F &fr)
Definition: convert.h:31
bool equalContents(const ObjectSet< T > &os1, const ObjectSet< T > &os2)
See if all objects pointed to are equal.
Definition: objectset.h:265
I indexOf(const T &, bool forward, I start=-1) const
Definition: vectoraccess.h:244
#define mGlobal(module)
Definition: commondefs.h:160
#define mCast(tp, v)
Definition: commondefs.h:120
void push(T *t)
Definition: objectset.h:63
#define od_int64
Definition: plftypes.h:34
ObjectSet()
Definition: objectset.h:286
virtual T * replace(size_type idx, T *)
Definition: objectset.h:394
int size_type
Definition: objectset.h:37
virtual bool isPresent(const T *) const
Definition: objectset.h:348
void erase()
Definition: vectoraccess.h:76
void deepCopyClone(ObjectSet< T > &to, const ObjectSet< S > &from)
fill an ObjectSet with clones of the objects in the other set.
Definition: objectset.h:162
void insert(I pos, const T &val)
Definition: vectoraccess.h:74
T object_type
Definition: objectset.h:38
bool isEmpty() const
Definition: odset.h:43
ObjectSet< T >::size_type indexOf(const ObjectSet< T > &os, const S &val)
Locate object in set.
Definition: objectset.h:173
const T * operator[](const T *t) const
Definition: objectset.h:84
ObjectSet< T > & add(T *t)
Definition: objectset.h:62
void deepAppendClone(ObjectSet< T > &to, const ObjectSet< S > &from)
append clones of one set&#39;s objects to another ObjectSet.
Definition: objectset.h:141
virtual void swap(int64_t, int64_t)
Definition: objectset.h:373
virtual T * removeSingle(size_type, bool keep_order=true)
Definition: objectset.h:464
virtual int64_t nrItems() const
Definition: objectset.h:49
virtual ObjectSet< T > & doAdd(T *)
Definition: objectset.h:355
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
T & getRef(ObjectSet< T > &objset, int i)
Definition: objectset.h:102
void moveToStart(const T &t)
Definition: vectoraccess.h:128
virtual bool isManaged() const
Definition: objectset.h:44
bool allow0_
Definition: objectset.h:90
void remove(I idx)
Definition: vectoraccess.h:83
virtual T * pop()
Definition: objectset.h:448
void plainErase()
Definition: objectset.h:96
const T * operator[](size_type i) const
Definition: objectset.h:83
virtual void copy(const ObjectSet< T > &)
Definition: objectset.h:427
virtual ObjectSet< T > & operator-=(T *)
Definition: objectset.h:364
virtual ~ObjectSet()
Definition: objectset.h:42
void deepCopy(ObjectSet< T > &to, const ObjectSet< S > &from)
fill an ObjectSet with copies of the objects in the other set.
Definition: objectset.h:151
void removeRange(ODSET &inst, size_type start, size_type stop)
Removes a range from the set.
Definition: odset.h:55
const T * find(const ObjectSet< T > &os, const S &val)
Get const object in set.
Definition: objectset.h:187
bool setCapacity(I sz, bool withmargin)
Definition: vectoraccess.h:153
bool addIfNew(T *)
Definition: objectset.h:453
void moveAfter(const T &t, const T &aft)
Definition: vectoraccess.h:108
bool equalObjects(const ObjectSet< T > &os1, const ObjectSet< T > &os2)
See if all objects are equal.
Definition: objectset.h:248
ObjectSet< T > & operator=(const ObjectSet< T > &)
Definition: objectset.h:296
virtual void insertAt(T *newptr, size_type)
Definition: objectset.h:409
void sort(ObjectSet< T > &os)
Sort ObjectSet. Must have operator > defined for elements.
Definition: objectset.h:224
void deepAppend(ObjectSet< T > &to, const ObjectSet< S > &from)
append copies of one set&#39;s objects to another ObjectSet.
Definition: objectset.h:131
T * first()
Definition: objectset.h:483
void deepEraseArr(ObjectSet< T > &os)
empty the ObjectSet deleting all objects pointed to.
Definition: objectset.h:126
void forceCrash(bool withdump)
virtual bool validIdx(int64_t) const
Definition: objectset.h:306
OpendTect.
Definition: commontypes.h:25
#define mObjectSetApplyToAllFunc(fn, op, extra)
Definition: objectset.h:112
void _ObjectSet_sortWithNull(ObjectSet< T > &os)
Sort ObjectSet when nulls are allowed no need to call.
Definition: objectset.h:204
virtual void erase()
Definition: objectset.h:75
void copy(TypeSetBase< T, I > &to, const TypeSetBase< S, I > &from)
Definition: typeset.h:221
void swap(I i, I j)
Definition: vectoraccess.h:98
VectorAccess< void *, size_type > vec_
Definition: objectset.h:89
void allowNull(bool yn=true)
Definition: objectset.h:301
#define mClass(module)
Definition: commondefs.h:161
virtual size_type indexOf(const T *) const
Definition: objectset.h:341
virtual void reverse()
Definition: objectset.h:384
virtual void insertAfter(T *newptr, size_type)
Definition: objectset.h:416
T pop_back()
Definition: vectoraccess.h:193
bool isPresent(const T &) const
Definition: vectoraccess.h:286
virtual T * get(size_type)
Definition: objectset.h:311
void deepErase(ObjectSet< T > &os)
empty the ObjectSet deleting all objects pointed to.
Definition: objectset.h:122
virtual void append(const ObjectSet< T > &)
Definition: objectset.h:439

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