OpendTect  6.6
posidxpairdataset.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: July 2004/Oct 2013/Mar 2016
9 ________________________________________________________________________
10 
11 -*/
12 
13 #include "generalmod.h"
14 #include "posidxpair.h"
15 #include "sets.h"
16 #include "ranges.h"
17 #include "od_iosfwd.h"
18 namespace PosInfo { class CubeData; }
19 class TrcKeySampling;
20 
21 
22 namespace Pos
23 {
24 
25 class IdxPairDataSet;
26 typedef void (*EntryCreatedFn)(IdxPairDataSet&,int spos_i,int spos_j);
27 
61 {
62 public:
63 
68 
69 
75  struct SPos
76  {
77  SPos( ArrIdxType ii=-1, ArrIdxType jj=-1 )
78  : i(ii), j(jj) {}
79  void reset() { i = j = -1; }
80  inline bool operator ==( const SPos& oth ) const
81  { return i == oth.i && j == oth.j; }
82  inline bool operator !=( const SPos& oth ) const
83  { return i != oth.i || j != oth.j; }
84  inline bool operator>(const SPos&) const;
85  inline bool operator<(const SPos&) const;
86  inline bool isValid() const { return i > -1 && j > -1; }
87 
89  };
90 
91 
92  IdxPairDataSet(ObjSzType,bool allow_duplicate_idxs,
93  bool manage_data=true);
95  virtual ~IdxPairDataSet();
96  IdxPairDataSet& operator =(const IdxPairDataSet&);
97 
98  inline bool isEmpty() const { return frsts_.isEmpty(); }
99  void setEmpty();
102 
103  ObjSzType objSize() const { return objsz_; }
104  bool managesData() const { return mandata_; };
105  bool allowsDuplicateIdxPairs() const { return allowdup_; }
107  bool append(const IdxPairDataSet&);
108  void remove(const IdxPairDataSet&);
109  void remove(const TrcKeySampling& hrg,bool inside);
110  void remove(SPos);
111  void remove(const TypeSet<SPos>&);
114 
115  inline SPos find( const IdxPair& ip ) const
116  { return findFirst(ip); }
117  inline SPos findFirst( const IdxPair& ip ) const
118  { return findOccurrence(ip,0); }
119  SPos findOccurrence(const IdxPair&,int occ=0) const;
120  bool next(SPos&,bool skip_duplicate_idxpairs=false) const;
121  bool prev(SPos&,bool skip_duplicate_idxpairs=false) const;
122  bool isValid(const IdxPair&) const;
123 
125  const void* getObj(SPos) const;
126  const void* get(SPos,IdxPair&) const;
128  SPos add(const IdxPair&,const void* obj=0);
130  void set(SPos,const void* obj=0);
134  void set( const IdxPair& ip, const void* obj=0 )
135  { set( findFirst(ip), obj ); }
137  SPos update(const IdxPair&,const void* obj=0);
141 
142  inline ArrIdxType nrFirst() const { return frsts_.size(); }
143  ArrIdxType nrSecond(IdxType firstidx) const;
144  inline bool includes( const IdxPair& ip ) const
145  { return find(ip).j > -1; }
146  bool hasFirst(IdxType) const;
147  bool hasSecond(IdxType) const;
152 
153  bool hasDuplicateIdxPairs() const;
156  ArrIdxType nrPos(ArrIdxType lineidx) const;
157 
158  void extend(const IdxPairDelta& stepout,const IdxPairStep&,
159  EntryCreatedFn fn=0);
164 
165  // I/O
166  bool dump(od_ostream&,bool binary) const;
167  bool slurp(od_istream&,bool binary);
168 
169  // aliases
170  inline ArrIdxType nrInls() const { return nrFirst(); }
171  inline ArrIdxType nrCrls( IdxType inl ) const { return nrSecond(inl); }
172  inline ArrIdxType nrRows() const { return nrFirst(); }
173  inline ArrIdxType nrCols( IdxType row ) const { return nrSecond(row); }
174  bool hasInl( IdxType inl ) const { return hasFirst(inl); }
175  bool hasCrl( IdxType crl ) const { return hasSecond(crl); }
176  inline bool hasRow( IdxType row ) const { return hasFirst(row); }
177  inline bool hasCol( IdxType col ) const { return hasSecond(col); }
178  Interval<IdxType> inlRange() const { return firstRange(); }
179  Interval<IdxType> rowRange() const { return firstRange(); }
181  { return secondRange(inl); }
183  { return secondRange(row); }
184 
185  // Maybe messing with managed objects in buf.
186  bool setObjSize(ObjSzType sz,ObjSzType offs_in_objs=-1,
187  const void* initwith=0);
188  // offs_in_objs < 0: operate at end
190  bool incrObjSize(ObjSzType,ObjSzType offs=-1,const void* =0);
191 
192 protected:
193 
196 
197  class ObjData
198  {
199  public:
200 
201  typedef unsigned char BufType;
202 
203  ObjData() : buf_(0), bufsz_(0)
204  { objs_.allowNull(true); }
205  ObjData(const ObjData&);
206  ~ObjData() { delete [] buf_; }
207 
208  const void* getObj(bool,ArrIdxType,ObjSzType) const;
209  void putObj(bool,ArrIdxType,ObjSzType,const void*);
212  void decrObjSize(ObjSzType orgsz,ObjSzType newsz,
213  ObjSzType at_offs);
215  const void*);
216 
217  private:
218 
219  ObjectSet<const void> objs_; // contains const bool* when mandata
220 
224 
225  };
226 
228  const bool mandata_;
229  bool allowdup_;
230 
234 
235  static ArrIdxType findIndexFor(const IdxSet&,IdxType,bool* found=0);
236  const void* gtObj(const SPos&) const;
237  bool addObj(SPos&,IdxType,const void*);
238  void putObj(const SPos&,const void*);
239  void addEntry(const Pos::IdxPair&,const void*,SPos&);
240 
241  // All 'gt' functions return unchecked
242  inline IdxType gtFrst( const SPos& pos ) const
243  { return frsts_[pos.i]; }
244  inline IdxType gtScnd( const SPos& pos ) const
245  { return gtScndSet(pos)[pos.j]; }
246  inline IdxPair gtIdxPair( const SPos& pos ) const
247  { return IdxPair( gtFrst(pos), gtScnd(pos) ); }
248  inline IdxSet& gtScndSet( const SPos& pos )
249  { return *scndsets_[pos.i]; }
250  inline const IdxSet& gtScndSet( const SPos& pos ) const
251  { return *scndsets_[pos.i]; }
252  inline ObjData& gtObjData( const SPos& pos )
253  { return *objdatas_[pos.i]; }
254  inline const ObjData& gtObjData( const SPos& pos ) const
255  { return *objdatas_[pos.i]; }
256  inline IdxSet& gtScndSet( ArrIdxType idx )
257  { return *scndsets_[idx]; }
258  inline const IdxSet& gtScndSet( ArrIdxType idx ) const
259  { return *scndsets_[idx]; }
260  inline ObjData& gtObjData( ArrIdxType idx )
261  { return *objdatas_[idx]; }
262  inline const ObjData& gtObjData( ArrIdxType idx ) const
263  { return *objdatas_[idx]; }
264 
265 };
266 
267 
268 inline bool IdxPairDataSet::SPos::operator >( const SPos& oth ) const
269 {
270  if ( i > oth.i )
271  return true;
272  return i == oth.i && j > oth.j;
273 }
274 
275 
276 inline bool IdxPairDataSet::SPos::operator <( const SPos& oth ) const
277 {
278  if ( i < oth.i )
279  return true;
280  return i == oth.i && j < oth.j;
281 }
282 
283 
284 } // namespace Pos
285 
286 
Pos::IdxPairDataSet::gtObjData
const ObjData & gtObjData(const SPos &pos) const
Definition: posidxpairdataset.h:254
Pos::IdxPairDataSet::objSize
ObjSzType objSize() const
Definition: posidxpairdataset.h:103
Pos::IdxPairDataSet::ObjData
Definition: posidxpairdataset.h:198
PosInfo::CubeData
Position info for an entire 3D cube. The LineData's are not sorted.
Definition: posinfo.h:95
Pos::IdxPairDataSet::getPos
SPos getPos(GlobIdxType) const
Very slow.
TrcKeySampling
Horizontal sampling (inline and crossline range and steps).
Definition: trckeysampling.h:35
Pos::IdxPairDataSet::nrCrls
ArrIdxType nrCrls(IdxType inl) const
Definition: posidxpairdataset.h:171
Pos::IdxPairDataSet::getObj
const void * getObj(SPos) const
Pos::IdxPairDataSet::ObjData::putObj
void putObj(bool, ArrIdxType, ObjSzType, const void *)
Pos::IdxPairDataSet::hasInl
bool hasInl(IdxType inl) const
Definition: posidxpairdataset.h:174
Pos::IdxPairDataSet::setObjSize
bool setObjSize(ObjSzType sz, ObjSzType offs_in_objs=-1, const void *initwith=0)
Pos::IdxPairDataSet::hasCrl
bool hasCrl(IdxType crl) const
Definition: posidxpairdataset.h:175
Pos::IdxPairDataSet::frsts_
IdxSet frsts_
Definition: posidxpairdataset.h:231
Pos::IdxPairDataSet::randomSubselect
void randomSubselect(GlobIdxType maxsz)
Pos::IdxPairDataSet::ObjData::decrObjSize
void decrObjSize(ObjSzType orgsz, ObjSzType newsz, ObjSzType at_offs)
Pos::IdxPairDataSet::hasCol
bool hasCol(IdxType col) const
Definition: posidxpairdataset.h:177
Pos::IdxPairDataSet::update
SPos update(const IdxPair &, const void *obj=0)
Pos::IdxPairDataSet::includes
bool includes(const IdxPair &ip) const
Definition: posidxpairdataset.h:144
Pos
Position.
Definition: commontypes.h:78
Pos::IdxPairDataSet::get
const void * get(SPos, IdxPair &) const
Pos::IdxPairDataSet::managesData
bool managesData() const
Definition: posidxpairdataset.h:104
ObjectSet< const void >
Pos::IdxPairDataSet::firstRange
Interval< IdxType > firstRange() const
Pos::IdxPairDataSet::SPos::operator<
bool operator<(const SPos &) const
Definition: posidxpairdataset.h:276
Pos::IdxPairDataSet::IdxPairDataSet
IdxPairDataSet(const IdxPairDataSet &)
Pos::IdxPairDataSet::remove
void remove(SPos)
afterwards, input SPos may be invalid
Pos::IdxPairDataSet::ObjData::removeObj
void removeObj(bool, ArrIdxType, ObjSzType)
Pos::IdxPairDataSet::gtObjData
const ObjData & gtObjData(ArrIdxType idx) const
Definition: posidxpairdataset.h:262
od_int64
#define od_int64
Definition: plftypes.h:35
mExpClass
#define mExpClass(module)
Definition: commondefs.h:177
Pos::IdxPairDataSet::extend
void extend(const IdxPairDelta &stepout, const IdxPairStep &, EntryCreatedFn fn=0)
Adds only IdxPair postions not yet in set.
Pos::IdxPairDataSet::ObjData::incrObjSize
bool incrObjSize(ObjSzType, ObjSzType, ObjSzType, const void *)
od_istream
OD class for stream read common access to the std::cin.
Definition: od_istream.h:24
Pos::IdxPairDataSet::gtScndSet
IdxSet & gtScndSet(ArrIdxType idx)
Definition: posidxpairdataset.h:256
Pos::IdxPairDataSet::set
void set(SPos, const void *obj=0)
Pos::IdxPairDataSet::nrFirst
ArrIdxType nrFirst() const
Definition: posidxpairdataset.h:142
Pos::IdxPairDataSet::hasSecond
bool hasSecond(IdxType) const
Pos::IdxPairDataSet::inlRange
Interval< IdxType > inlRange() const
Definition: posidxpairdataset.h:178
Pos::IdxPairDataSet::findOccurrence
SPos findOccurrence(const IdxPair &, int occ=0) const
Pos::IdxPairDataSet::colRange
Interval< IdxType > colRange(IdxType row=-1) const
Definition: posidxpairdataset.h:182
Pos::IdxPairDataSet::hasRow
bool hasRow(IdxType row) const
Definition: posidxpairdataset.h:176
Pos::IdxPairDataSet::isValid
bool isValid(const IdxPair &) const
Pos::IdxPairDataSet::nrSecond
ArrIdxType nrSecond(IdxType firstidx) const
Pos::IdxPairDataSet::SPos::reset
void reset()
Definition: posidxpairdataset.h:79
Pos::IdxPairDataSet::incrObjSize
bool incrObjSize(ObjSzType, ObjSzType offs=-1, const void *=0)
operator==
bool operator==(const ArrayNDInfo &a1, const ArrayNDInfo &a2)
Definition: arrayndinfo.h:81
IdxPair::IdxType
Index_Type IdxType
Definition: idxpair.h:33
Pos::IdxPairDataSet
A sorted set of IdxPairs and associated data buffer.
Definition: posidxpairdataset.h:61
Pos::IdxPairDataSet::objsz_
const ObjSzType objsz_
Definition: posidxpairdataset.h:227
Pos::IdxPairDataSet::remove
void remove(const IdxPairDataSet &)
Pos::IdxPairDataSet::findIndexFor
static ArrIdxType findIndexFor(const IdxSet &, IdxType, bool *found=0)
Pos::IdxPairDataSet::allowDuplicateIdxPairs
void allowDuplicateIdxPairs(bool)
Pos::IdxPairDataSet::allowsDuplicateIdxPairs
bool allowsDuplicateIdxPairs() const
Definition: posidxpairdataset.h:105
Pos::IdxPairDataSet::secondRange
Interval< IdxType > secondRange(IdxType firsidx=-1) const
Pos::IdxPairDataSet::nrDuplicateIdxPairs
ArrIdxType nrDuplicateIdxPairs() const
Pos::IdxPairDataSet::find
SPos find(const IdxPair &ip) const
Definition: posidxpairdataset.h:115
Pos::IdxPairDataSet::hasDuplicateIdxPairs
bool hasDuplicateIdxPairs() const
Pos::IdxPairDataSet::copyStructureFrom
void copyStructureFrom(const IdxPairDataSet &)
will also empty this set
Pos::IdxPairDataSet::gtScnd
IdxType gtScnd(const SPos &pos) const
Definition: posidxpairdataset.h:244
Pos::IdxPairDataSet::getIdxPair
IdxPair getIdxPair(SPos) const
Pos::IdxPairDataSet::allowdup_
bool allowdup_
Definition: posidxpairdataset.h:229
Pos::IdxPairDataSet::remove
void remove(const TypeSet< SPos > &)
find
const BufferString * find(const BufferStringSet &, const char *)
Pos::IdxPairDataSet::SPos::i
ArrIdxType i
Definition: posidxpairdataset.h:88
Pos::IdxPairDataSet::dump
bool dump(od_ostream &, bool binary) const
Pos::IdxPairDataSet::SPos::SPos
SPos(ArrIdxType ii=-1, ArrIdxType jj=-1)
Definition: posidxpairdataset.h:77
Pos::IdxPairDataSet::next
bool next(SPos &, bool skip_duplicate_idxpairs=false) const
Pos::IdxPairDataSet::BufSzType
od_int64 BufSzType
Definition: posidxpairdataset.h:195
Pos::IdxPairDataSet::nrInls
ArrIdxType nrInls() const
Definition: posidxpairdataset.h:170
operator!=
bool operator!=(const ArrayNDInfo &a1, const ArrayNDInfo &a2)
Definition: arrayndinfo.h:90
Pos::IdxPairDataSet::ObjData::addObjSpace
bool addObjSpace(bool, ArrIdxType, ObjSzType)
Pos::IdxPairDataSet::gtScndSet
const IdxSet & gtScndSet(const SPos &pos) const
Definition: posidxpairdataset.h:250
Pos::IdxPairDataSet::gtObj
const void * gtObj(const SPos &) const
Pos::IdxPairDataSet::ArrIdxType
TypeSet< IdxType >::size_type ArrIdxType
Definition: posidxpairdataset.h:65
posidxpair.h
Pos::IdxPairDataSet::nrCols
ArrIdxType nrCols(IdxType row) const
Definition: posidxpairdataset.h:173
Pos::IdxPairDataSet::gtIdxPair
IdxPair gtIdxPair(const SPos &pos) const
Definition: posidxpairdataset.h:246
Pos::IdxPairDataSet::ObjData::bufsz_
BufSzType bufsz_
Definition: posidxpairdataset.h:222
Pos::IdxPairDataSet::IdxPairDataSet
IdxPairDataSet(ObjSzType, bool allow_duplicate_idxs, bool manage_data=true)
Pos::IdxPairDataSet::ObjData::BufType
unsigned char BufType
Definition: posidxpairdataset.h:201
Pos::IdxPairDataSet::ObjData::~ObjData
~ObjData()
Definition: posidxpairdataset.h:206
Pos::IdxPairDataSet::gtObjData
ObjData & gtObjData(const SPos &pos)
Definition: posidxpairdataset.h:252
Pos::IdxPairDataSet::ObjData::buf_
BufType * buf_
Definition: posidxpairdataset.h:221
Pos::IdxPairDataSet::setEmpty
void setEmpty()
Pos::IdxPairDataSet::scndsets_
ObjectSet< IdxSet > scndsets_
Definition: posidxpairdataset.h:232
Conv::set
void set(T &_to, const F &fr)
template based type conversion
Definition: convert.h:27
Pos::IdxPairDataSet::putObj
void putObj(const SPos &, const void *)
Pos::IdxPairDataSet::crlRange
Interval< IdxType > crlRange(IdxType inl=-1) const
Definition: posidxpairdataset.h:180
Pos::IdxPairDataSet::IdxType
IdxPair::IdxType IdxType
Definition: posidxpairdataset.h:64
Pos::IdxPairDataSet::SPos::isValid
bool isValid() const
Definition: posidxpairdataset.h:86
Pos::IdxPairDataSet::decrObjSize
void decrObjSize(ObjSzType, ObjSzType offs=-1)
Pos::IdxPairDataSet::hasFirst
bool hasFirst(IdxType) const
Pos::IdxPairDataSet::totalSize
GlobIdxType totalSize() const
Pos::IdxPairDataSet::GlobIdxType
od_int64 GlobIdxType
Definition: posidxpairdataset.h:67
Pos::IdxPairDataSet::set
void set(const IdxPair &ip, const void *obj=0)
May do the wrong thing if you have duplicates.
Definition: posidxpairdataset.h:134
Pos::IdxPairDataSet::remove
void remove(const TrcKeySampling &hrg, bool inside)
Pos::IdxPairDataSet::ObjData::manageBufCapacity
bool manageBufCapacity(ObjSzType)
Pos::IdxPairDataSet::ObjData::getObj
const void * getObj(bool, ArrIdxType, ObjSzType) const
Pos::IdxPairDataSet::slurp
bool slurp(od_istream &, bool binary)
Pos::IdxPairDataSet::removeDuplicateIdxPairs
void removeDuplicateIdxPairs()
PosInfo
Position info, often segmented.
Definition: posinfo.h:40
Pos::IdxPairDataSet::add
void add(const PosInfo::CubeData &, EntryCreatedFn fn=0)
Adds only IdxPair postions not yet in set.
Pos::IdxPairDataSet::prev
bool prev(SPos &, bool skip_duplicate_idxpairs=false) const
od_iosfwd.h
Pos::IdxPairDataSet::addObj
bool addObj(SPos &, IdxType, const void *)
Pos::IdxPairDataSet::SPos
Set Position: position in IdxPairDataSet.
Definition: posidxpairdataset.h:76
Pos::IdxPairDataSet::~IdxPairDataSet
virtual ~IdxPairDataSet()
Pos::IdxPairDataSet::nrRows
ArrIdxType nrRows() const
Definition: posidxpairdataset.h:172
Pos::IdxPairDataSet::ObjData::ObjData
ObjData()
Definition: posidxpairdataset.h:203
operator>
bool operator>(const ObjectWithName &obj1, const ObjectWithName &obj2)
Definition: namedobj.h:95
Pos::IdxPairDataSet::objdatas_
ObjectSet< ObjData > objdatas_
Definition: posidxpairdataset.h:233
Pos::IdxPairDataSet::ObjData::ObjData
ObjData(const ObjData &)
Pos::IdxPairDataSet::nrPos
ArrIdxType nrPos(ArrIdxType lineidx) const
Pos::IdxPairDataSet::SPos::operator>
bool operator>(const SPos &) const
Definition: posidxpairdataset.h:268
Pos::IdxPairDataSet::gtFrst
IdxType gtFrst(const SPos &pos) const
Definition: posidxpairdataset.h:242
Pos::IdxPair
IdxPair with position indices; base class for BinID et al.
Definition: posidxpair.h:29
Pos::IdxPairDataSet::firstIdxPair
IdxPair firstIdxPair() const
when empty returns udf()
Pos::IdxPairDataSet::gtScndSet
const IdxSet & gtScndSet(ArrIdxType idx) const
Definition: posidxpairdataset.h:258
ranges.h
Pos::IdxPairDataSet::gtObjData
ObjData & gtObjData(ArrIdxType idx)
Definition: posidxpairdataset.h:260
Pos::IdxPairDataSet::findFirst
SPos findFirst(const IdxPair &ip) const
Definition: posidxpairdataset.h:117
Pos::IdxPairDataSet::mandata_
const bool mandata_
Definition: posidxpairdataset.h:228
sets.h
Interval
Interval of values.
Definition: commontypes.h:30
Pos::EntryCreatedFn
void(* EntryCreatedFn)(IdxPairDataSet &, int spos_i, int spos_j)
Definition: posidxpairdataset.h:26
Pos::IdxPairDataSet::ObjSzType
od_int64 ObjSzType
Definition: posidxpairdataset.h:66
Pos::IdxPairDataSet::gtScndSet
IdxSet & gtScndSet(const SPos &pos)
Definition: posidxpairdataset.h:248
od_ostream
OD class for stream write common access to the user log file, or std::cout in other than od_main.
Definition: od_ostream.h:26
Pos::IdxPairDataSet::addEntry
void addEntry(const Pos::IdxPair &, const void *, SPos &)
Pos::IdxPairDataSet::ObjData::objs_
ObjectSet< const void > objs_
Definition: posidxpairdataset.h:219
Pos::IdxPairDataSet::add
SPos add(const IdxPair &, const void *obj=0)
If returned SPos is not valid memory was full.
Pos::IdxPairDataSet::rowRange
Interval< IdxType > rowRange() const
Definition: posidxpairdataset.h:179
Pos::IdxPairDataSet::isEmpty
bool isEmpty() const
Definition: posidxpairdataset.h:98
TypeSet
Sets of (small) copyable elements.
Definition: commontypes.h:29
Pos::IdxPairDataSet::SPos::j
ArrIdxType j
Definition: posidxpairdataset.h:88
Pos::IdxPairDataSet::append
bool append(const IdxPairDataSet &)
Pos::IdxPairDataSet::IdxSet
TypeSet< IdxType > IdxSet
Definition: posidxpairdataset.h:194

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