OpendTect-6_4  6.4
i_datainterp.h
Go to the documentation of this file.
1 // No multiple inclusion protection!
2 
3 /*+
4 ________________________________________________________________________
5 
6  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
7  Author: A.H. Bril
8  Date: Mar 2001
9  RCS: $Id$
10 ________________________________________________________________________
11 
12 -*/
13 
14 #ifndef mTheType
15 #error To include __FILE__, set mTheType
16 #endif
17 
18 #define mDICB(fntyp,fn) \
19 ((DataInterpreter<mTheType>::fntyp)(&DataInterpreter<mTheType>::fn))
20 
21 #define mDefGetPut(fnnm) \
22 { \
23  getfn = needswap ? mDICB(GetFn,get##fnnm##swp) : mDICB(GetFn,get##fnnm); \
24  putfn = needswap ? mDICB(PutFn,put##fnnm##swp) : mDICB(PutFn,put##fnnm); \
25 }
26 
27 #define mDefGetPutNoSwap(fnnm) \
28 { getfn = mDICB(GetFn,get##fnnm); putfn = mDICB(PutFn,put##fnnm); }
29 
30 
31 template <>
33  bool ignend )
34 {
35  swpfn = dc.nrBytes() == BinDataDesc::N1 ? mDICB(SwapFn,swap0)
36  : ( dc.nrBytes() == BinDataDesc::N8 ? mDICB(SwapFn,swap8)
37  : ( dc.nrBytes() == BinDataDesc::N4 ? mDICB(SwapFn,swap4)
38  : mDICB(SwapFn,swap2) ) );
39 
40  getfn = mDICB(GetFn,get0);
41  putfn = mDICB(PutFn,put0);
42  bool needswap = !ignend && dc.needSwap();
43 
44  if ( !dc.isInteger() )
45  {
46  if ( !dc.isIeee() )
47  {
48  if ( dc.nrBytes() == BinDataDesc::N4 )
49  mDefGetPut(FIbm)
50  }
51  else
52  {
53  if ( dc.nrBytes() == BinDataDesc::N4 )
54  mDefGetPut(F)
55  else if ( dc.nrBytes() == BinDataDesc::N8 )
56  mDefGetPut(D)
57  }
58  }
59  else
60  {
61  if ( dc.isSigned() )
62  {
63  if ( !dc.isIeee() )
64  {
65  switch ( dc.nrBytes() )
66  {
67  case BinDataDesc::N1: mDefGetPutNoSwap(S1) break;
68  case BinDataDesc::N2: mDefGetPut(S2Ibm) break;
69  case BinDataDesc::N4: mDefGetPut(S4Ibm) break;
70  default: pErrMsg("Invalid enum"); break;
71  }
72  }
73  else
74  {
75  switch ( dc.nrBytes() )
76  {
77  case BinDataDesc::N1: mDefGetPutNoSwap(S1) break;
78  case BinDataDesc::N2: mDefGetPut(S2) break;
79  case BinDataDesc::N4: mDefGetPut(S4) break;
80  case BinDataDesc::N8: mDefGetPut(S8) break;
81  }
82  }
83  }
84  else if ( dc.isIeee() )
85  {
86  switch ( dc.nrBytes() )
87  {
88  case BinDataDesc::N1: mDefGetPutNoSwap(U1) break;
89  case BinDataDesc::N2: mDefGetPut(U2) break;
90  case BinDataDesc::N4: mDefGetPut(U4) break;
91  default: pErrMsg("Unhandled enum"); break;
92  }
93  }
94  }
95 }
96 
97 
98 template <>
100  const DataCharacteristics& dc, bool ignend )
101 {
102  set( dc, ignend );
103 }
104 
105 
106 template <>
108  const DataInterpreter& di )
109  : swpfn(di.swpfn)
110  , getfn(di.getfn)
111  , putfn(di.putfn)
112 {
113 }
114 
115 
116 template <>
118  const DataInterpreter<mTheType>& di )
119 {
120  if ( &di != this )
121  {
122  swpfn = di.swpfn;
123  getfn = di.getfn;
124  putfn = di.putfn;
125  }
126  return *this;
127 }
128 
129 
130 template <>
132 {
136  : 1 ));
137 }
138 
139 
140 #define mSet(nb,isint,frmt,iss,swpd) \
141  dc = DataCharacteristics( isint, iss, (BinDataDesc::ByteCount)nb, \
142  DataCharacteristics::frmt, __islittle__ != swpd );
143 
144 template <>
146 {
148  switch ( nrBytes() )
149  {
150 
151  case 2: {
153  mSet(2,true,Ieee,true,false)
155  mSet(2,true,Ieee,false,false)
157  mSet(2,true,Ibm,true,false)
159  mSet(2,true,Ieee,true,true)
161  mSet(2,true,Ieee,false,true)
163  mSet(2,true,Ibm,true,true)
164  }
165 
166  case 4:
167  {
169  mSet(4,true,Ieee,true,false)
171  mSet(4,true,Ieee,false,false)
172  else if ( getfn == &DataInterpreter<mTheType>::getF )
173  mSet(4,false,Ieee,true,false)
175  mSet(4,true,Ibm,true,false)
177  mSet(4,false,Ibm,true,false)
179  mSet(4,true,Ieee,true,true)
181  mSet(4,true,Ieee,false,true)
183  mSet(4,false,Ieee,true,true)
185  mSet(4,true,Ibm,true,true)
187  mSet(4,false,Ibm,true,true)
188  }
189 
190  case 8:
191  {
193  mSet(8,false,Ieee,true,false)
195  mSet(8,false,Ieee,true,true)
197  mSet(8,true,Ieee,true,false)
199  mSet(8,true,Ieee,true,true)
200  }
201 
202  default:
203  {
205  mSet(1,true,Ieee,true,false)
207  mSet(1,true,Ieee,false,false)
208  }
209 
210  }
211 
212  return dc;
213 }
214 
215 #undef mSet
216 
217 
218 template <>
220 {
221  switch ( nrBytes() )
222  {
223  case 2: return getfn == &DataInterpreter<mTheType>::getS2swp
226 
227  case 4: return getfn == &DataInterpreter<mTheType>::getS4swp
232 
233  case 8: return getfn == &DataInterpreter<mTheType>::getDswp
235 
236  }
237  return false;
238 }
239 
240 
241 #define mDoChgSwp(typ) \
242  if ( getfn == &DataInterpreter<mTheType>::get##typ ) \
243  { \
244  getfn = &DataInterpreter<mTheType>::get##typ##swp; \
245  putfn = &DataInterpreter<mTheType>::put##typ##swp; \
246  } \
247  else if ( getfn == &DataInterpreter<mTheType>::get##typ##swp ) \
248  { \
249  getfn = &DataInterpreter<mTheType>::get##typ; \
250  putfn = &DataInterpreter<mTheType>::put##typ; \
251  }
252 
253 
254 template <>
256 {
257  switch ( nrBytes() )
258  {
259  case 2: {
260  mDoChgSwp(S2)
261  else mDoChgSwp(U2)
262  else mDoChgSwp(S2Ibm)
263  }
264 
265  case 4:
266  {
267  mDoChgSwp(S4)
268  else mDoChgSwp(U4)
269  else mDoChgSwp(F)
270  else mDoChgSwp(S4Ibm)
271  else mDoChgSwp(FIbm)
272  }
273 
274  case 8:
275  {
276  mDoChgSwp(D)
277  else mDoChgSwp(S8)
278  }
279 
280  }
281 }
int nrBytes() const
Definition: bindatadesc.h:47
#define mSet(nb, isint, frmt, iss, swpd)
Definition: i_datainterp.h:140
SwapFn swpfn
Definition: datainterp.h:154
DataCharacteristics dataChar() const
GetFn getfn
Definition: datainterp.h:152
void set(const DataCharacteristics &, bool ignoreendianness=false)
use ignoreendianness when you pre-byteswap the data
Definition: bindatadesc.h:47
bool isIeee() const
Definition: datachar.h:55
Byte-level data interpreter.
Definition: cbvswriter.h:22
ByteCount nrBytes() const
Definition: bindatadesc.h:62
Definition: bindatadesc.h:47
PutFn putfn
Definition: datainterp.h:153
#define mDoChgSwp(typ)
Definition: i_datainterp.h:241
byte-level data characteristics of stored data.
Definition: datachar.h:37
#define mDefGetPut(fnnm)
Definition: i_datainterp.h:21
#define mDefGetPutNoSwap(fnnm)
Definition: i_datainterp.h:27
DataInterpreter< T > & operator=(const DataInterpreter< T > &)
bool needSwap() const
Definition: datachar.h:84
bool isInteger() const
Definition: bindatadesc.h:60
bool needSwap() const
Definition: bindatadesc.h:47
#define mDICB(fntyp, fn)
Definition: i_datainterp.h:18
DataInterpreter(const DataCharacteristics &, bool ignoreendianness=false)
#define pErrMsg(msg)
Definition: errmsg.h:60
bool isSigned() const
Definition: bindatadesc.h:61

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