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

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