00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef TABLES_ISMCOLUMN_H
00029 #define TABLES_ISMCOLUMN_H
00030
00031
00032
00033 #include <casacore/casa/aips.h>
00034 #include <casacore/tables/DataMan/StManColumn.h>
00035 #include <casacore/tables/DataMan/ISMBase.h>
00036 #include <casacore/casa/Arrays/IPosition.h>
00037 #include <casacore/casa/Containers/Block.h>
00038 #include <casacore/casa/Utilities/Compare.h>
00039 #include <casacore/casa/OS/Conversion.h>
00040
00041 namespace casacore {
00042
00043
00044 class ISMBucket;
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 class ISMColumn : public StManColumn
00116 {
00117 public:
00118
00119
00120
00121 ISMColumn (ISMBase* parent, int dataType, uInt colnr);
00122
00123 ~ISMColumn();
00124
00125
00126 virtual void setShapeColumn (const IPosition& shape);
00127
00128
00129
00130 virtual uInt ndim (uInt rownr);
00131
00132
00133
00134 virtual IPosition shape (uInt rownr);
00135
00136
00137
00138 virtual void doCreate (ISMBucket*);
00139
00140
00141 virtual void getFile (uInt nrrow);
00142
00143
00144
00145 virtual Bool flush (uInt nrrow, Bool fsync);
00146
00147
00148
00149 void resync (uInt nrrow);
00150
00151
00152 virtual void reopenRW();
00153
00154
00155
00156 virtual void getBoolV (uInt rownr, Bool* dataPtr);
00157 virtual void getuCharV (uInt rownr, uChar* dataPtr);
00158 virtual void getShortV (uInt rownr, Short* dataPtr);
00159 virtual void getuShortV (uInt rownr, uShort* dataPtr);
00160 virtual void getIntV (uInt rownr, Int* dataPtr);
00161 virtual void getuIntV (uInt rownr, uInt* dataPtr);
00162 virtual void getfloatV (uInt rownr, float* dataPtr);
00163 virtual void getdoubleV (uInt rownr, double* dataPtr);
00164 virtual void getComplexV (uInt rownr, Complex* dataPtr);
00165 virtual void getDComplexV (uInt rownr, DComplex* dataPtr);
00166 virtual void getStringV (uInt rownr, String* dataPtr);
00167
00168
00169
00170
00171 virtual void putBoolV (uInt rownr, const Bool* dataPtr);
00172 virtual void putuCharV (uInt rownr, const uChar* dataPtr);
00173 virtual void putShortV (uInt rownr, const Short* dataPtr);
00174 virtual void putuShortV (uInt rownr, const uShort* dataPtr);
00175 virtual void putIntV (uInt rownr, const Int* dataPtr);
00176 virtual void putuIntV (uInt rownr, const uInt* dataPtr);
00177 virtual void putfloatV (uInt rownr, const float* dataPtr);
00178 virtual void putdoubleV (uInt rownr, const double* dataPtr);
00179 virtual void putComplexV (uInt rownr, const Complex* dataPtr);
00180 virtual void putDComplexV (uInt rownr, const DComplex* dataPtr);
00181 virtual void putStringV (uInt rownr, const String* dataPtr);
00182
00183
00184
00185
00186
00187
00188 virtual void getScalarColumnBoolV (Vector<Bool>* dataPtr);
00189 virtual void getScalarColumnuCharV (Vector<uChar>* dataPtr);
00190 virtual void getScalarColumnShortV (Vector<Short>* dataPtr);
00191 virtual void getScalarColumnuShortV (Vector<uShort>* dataPtr);
00192 virtual void getScalarColumnIntV (Vector<Int>* dataPtr);
00193 virtual void getScalarColumnuIntV (Vector<uInt>* dataPtr);
00194 virtual void getScalarColumnfloatV (Vector<float>* dataPtr);
00195 virtual void getScalarColumndoubleV (Vector<double>* dataPtr);
00196 virtual void getScalarColumnComplexV (Vector<Complex>* dataPtr);
00197 virtual void getScalarColumnDComplexV (Vector<DComplex>* dataPtr);
00198 virtual void getScalarColumnStringV (Vector<String>* dataPtr);
00199
00200
00201
00202
00203
00204
00205 virtual void putScalarColumnBoolV (const Vector<Bool>* dataPtr);
00206 virtual void putScalarColumnuCharV (const Vector<uChar>* dataPtr);
00207 virtual void putScalarColumnShortV (const Vector<Short>* dataPtr);
00208 virtual void putScalarColumnuShortV (const Vector<uShort>* dataPtr);
00209 virtual void putScalarColumnIntV (const Vector<Int>* dataPtr);
00210 virtual void putScalarColumnuIntV (const Vector<uInt>* dataPtr);
00211 virtual void putScalarColumnfloatV (const Vector<float>* dataPtr);
00212 virtual void putScalarColumndoubleV (const Vector<double>* dataPtr);
00213 virtual void putScalarColumnComplexV (const Vector<Complex>* dataPtr);
00214 virtual void putScalarColumnDComplexV (const Vector<DComplex>* dataPtr);
00215 virtual void putScalarColumnStringV (const Vector<String>* dataPtr);
00216
00217
00218
00219
00220
00221
00222
00223 virtual void getScalarColumnCellsBoolV (const RefRows& rownrs,
00224 Vector<Bool>* dataPtr);
00225 virtual void getScalarColumnCellsuCharV (const RefRows& rownrs,
00226 Vector<uChar>* dataPtr);
00227 virtual void getScalarColumnCellsShortV (const RefRows& rownrs,
00228 Vector<Short>* dataPtr);
00229 virtual void getScalarColumnCellsuShortV (const RefRows& rownrs,
00230 Vector<uShort>* dataPtr);
00231 virtual void getScalarColumnCellsIntV (const RefRows& rownrs,
00232 Vector<Int>* dataPtr);
00233 virtual void getScalarColumnCellsuIntV (const RefRows& rownrs,
00234 Vector<uInt>* dataPtr);
00235 virtual void getScalarColumnCellsfloatV (const RefRows& rownrs,
00236 Vector<float>* dataPtr);
00237 virtual void getScalarColumnCellsdoubleV (const RefRows& rownrs,
00238 Vector<double>* dataPtr);
00239 virtual void getScalarColumnCellsComplexV (const RefRows& rownrs,
00240 Vector<Complex>* dataPtr);
00241 virtual void getScalarColumnCellsDComplexV (const RefRows& rownrs,
00242 Vector<DComplex>* dataPtr);
00243 virtual void getScalarColumnCellsStringV (const RefRows& rownrs,
00244 Vector<String>* dataPtr);
00245
00246
00247
00248
00249 virtual void getArrayBoolV (uInt rownr, Array<Bool>* dataPtr);
00250 virtual void getArrayuCharV (uInt rownr, Array<uChar>* dataPtr);
00251 virtual void getArrayShortV (uInt rownr, Array<Short>* dataPtr);
00252 virtual void getArrayuShortV (uInt rownr, Array<uShort>* dataPtr);
00253 virtual void getArrayIntV (uInt rownr, Array<Int>* dataPtr);
00254 virtual void getArrayuIntV (uInt rownr, Array<uInt>* dataPtr);
00255 virtual void getArrayfloatV (uInt rownr, Array<float>* dataPtr);
00256 virtual void getArraydoubleV (uInt rownr, Array<double>* dataPtr);
00257 virtual void getArrayComplexV (uInt rownr, Array<Complex>* dataPtr);
00258 virtual void getArrayDComplexV (uInt rownr, Array<DComplex>* dataPtr);
00259 virtual void getArrayStringV (uInt rownr, Array<String>* dataPtr);
00260
00261
00262
00263
00264 virtual void putArrayBoolV (uInt rownr, const Array<Bool>* dataPtr);
00265 virtual void putArrayuCharV (uInt rownr, const Array<uChar>* dataPtr);
00266 virtual void putArrayShortV (uInt rownr, const Array<Short>* dataPtr);
00267 virtual void putArrayuShortV (uInt rownr, const Array<uShort>* dataPtr);
00268 virtual void putArrayIntV (uInt rownr, const Array<Int>* dataPtr);
00269 virtual void putArrayuIntV (uInt rownr, const Array<uInt>* dataPtr);
00270 virtual void putArrayfloatV (uInt rownr, const Array<float>* dataPtr);
00271 virtual void putArraydoubleV (uInt rownr, const Array<double>* dataPtr);
00272 virtual void putArrayComplexV (uInt rownr, const Array<Complex>* dataPtr);
00273 virtual void putArrayDComplexV (uInt rownr, const Array<DComplex>* dataPtr);
00274 virtual void putArrayStringV (uInt rownr, const Array<String>* dataPtr);
00275
00276
00277
00278
00279 virtual void addRow (uInt newNrrow, uInt oldNrrow);
00280
00281
00282 void remove (uInt bucketRownr, ISMBucket* bucket, uInt bucketNrrow,
00283 uInt newNrrow);
00284
00285
00286
00287
00288
00289 static Conversion::ValueFunction* getReaduInt (Bool asCanonical);
00290 static Conversion::ValueFunction* getWriteuInt (Bool asCanonical);
00291
00292
00293
00294
00295 virtual void handleCopy (uInt rownr, const char* value);
00296
00297
00298
00299 virtual void handleRemove (uInt rownr, const char* value);
00300
00301
00302
00303 uInt getFixedLength() const;
00304
00305
00306 uInt nelements() const;
00307
00308
00309 protected:
00310
00311 int isLastValueInvalid (Int rownr) const;
00312
00313
00314
00315 void getValue (uInt rownr, void* value, Bool setCache);
00316
00317
00318 void putValue (uInt rownr, const void* value);
00319
00320
00321
00322 ISMBase* stmanPtr_p;
00323
00324
00325 uInt fixedLength_p;
00326
00327 uInt colnr_p;
00328
00329 IPosition shape_p;
00330
00331 uInt nrelem_p;
00332
00333
00334
00335 uInt nrcopy_p;
00336
00337
00338 Int startRow_p;
00339 Int endRow_p;
00340 void* lastValue_p;
00341
00342 uInt lastRowPut_p;
00343
00344 uInt typeSize_p;
00345
00346 Conversion::ValueFunction* writeFunc_p;
00347
00348 Conversion::ValueFunction* readFunc_p;
00349
00350 ObjCompareFunc* compareFunc_p;
00351
00352
00353 private:
00354
00355 ISMColumn (const ISMColumn&);
00356
00357
00358 ISMColumn& operator= (const ISMColumn&);
00359
00360
00361
00362 void init();
00363
00364
00365 void clear();
00366
00367
00368 void putFromRow (uInt rownr, const char* data, uInt lenData);
00369
00370
00371
00372
00373 void putData (ISMBucket* bucket, uInt bucketStartRow,
00374 uInt bucketNrrow, uInt bucketRownr,
00375 const char* data, uInt lenData,
00376 Bool afterLastRow, Bool canSplit);
00377
00378
00379
00380 void replaceData (ISMBucket* bucket, uInt bucketStartRow,
00381 uInt bucketNrrow, uInt bucketRownr, uInt& offset,
00382 const char* data, uInt lenData, Bool canSplit = True);
00383
00384
00385
00386 Bool addData (ISMBucket* bucket, uInt bucketStartRow,
00387 uInt bucketNrrow, uInt bucketRownr, uInt inx,
00388 const char* data, uInt lenData,
00389 Bool afterLastRow = False, Bool canSplit = True);
00390
00391
00392 void handleSplit (ISMBucket& bucket, const Block<Bool>& duplicated);
00393
00394
00395 virtual Bool compareValue (const void* val1, const void* val2) const;
00396
00397
00398
00399 static size_t fromString (void* out, const void* in, size_t n,
00400 Conversion::ValueFunction* writeLeng);
00401 static size_t toString (void* out, const void* in, size_t n,
00402 Conversion::ValueFunction* readLeng);
00403 static size_t writeStringBE (void* out, const void* in, size_t n);
00404 static size_t readStringBE (void* out, const void* in, size_t n);
00405 static size_t writeStringLE (void* out, const void* in, size_t n);
00406 static size_t readStringLE (void* out, const void* in, size_t n);
00407
00408 };
00409
00410
00411 inline int ISMColumn::isLastValueInvalid (Int rownr) const
00412 {
00413 return rownr < startRow_p || rownr > endRow_p;
00414 }
00415
00416 inline uInt ISMColumn::getFixedLength() const
00417 {
00418 return fixedLength_p;
00419 }
00420
00421 inline uInt ISMColumn::nelements() const
00422 {
00423 return nrelem_p;
00424 }
00425
00426
00427
00428 }
00429
00430 #endif