1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
|
// Copyright (C) 1999-2018
// Smithsonian Astrophysical Observatory, Cambridge, MA, USA
// For conditions of distribution and use, see copyright notice in "copyright"
#ifndef __fitscolumn_h__
#define __fitscolumn_h__
#include "vector.h"
class FitsHead;
class FitsColumn {
protected:
int index_; // col number 1 to n
int width_; // overall width of field in chars
int offset_; // offset in chars from start of row
char type_; // type
int repeat_; // repeat count
char* tform_;
char* ttype_;
char* tunit_;
float tscal_;
float tzero_;
int tnull_;
int hastnull_;
float tlmin_;
float tlmax_;
int hastlmin_;
int hastlmax_;
double min_;
double max_;
int validmm_;
char buf_[128];
char keybuf[9];
char* keycat(const char*, int);
public:
FitsColumn(FitsHead*, int, int);
virtual ~FitsColumn();
int width() {return width_;}
int offset() {return offset_;}
int index() {return index_;}
char type() {return type_;}
int repeat() {return repeat_;}
const char* tform() {return tform_;}
const char* ttype() {return ttype_;}
const char* tunit() {return tunit_;}
float tscal() {return tscal_;}
float tzero() {return tzero_;}
int tnull() {return tnull_;}
float tlmin() {return tlmin_;}
float tlmax() {return tlmax_;}
int hasscaling() {return tscal_ != 1 || tzero_ != 0;}
int hastnull() {return hastnull_;}
void setMin(double m) {min_=m;}
void setMax(double m) {max_=m;}
double getMin() {return min_;}
double getMax() {return max_;}
int hasMinMax() {return min_ != -DBL_MAX ? 1 : 0;}
int hasTLMinTLMax() {return hastlmin_ && hastlmax_;}
virtual int isInt() =0;
virtual char* str(const char* ptr, int i =0);
virtual double value(const char*, int i =0) {return 0;}
virtual Vector dimension() {return Vector();}
};
// FitsAsciiColumn
class FitsAsciiColumn : public FitsColumn {
public:
FitsAsciiColumn(FitsHead*, int, int);
char* str(const char* ptr, int i =0);
};
class FitsAsciiColumnStr : public FitsAsciiColumn {
public:
FitsAsciiColumnStr(FitsHead*, int, int);
int isInt() {return 0;}
};
class FitsAsciiColumnA : public FitsAsciiColumn {
private:
int prec_;
public:
FitsAsciiColumnA(FitsHead*, int, int);
double value(const char*, int i =0);
};
template<class T>
class FitsAsciiColumnT : public FitsAsciiColumnA {
public:
FitsAsciiColumnT(FitsHead*, int, int);
int isInt();
Vector dimension();
};
// FitsBinColumn
class FitsBinColumn : public FitsColumn {
protected:
char* tdisp_;
char* tdim_;
int tdimM_;
int* tdimK_;
public:
FitsBinColumn(FitsHead*, int, int);
~FitsBinColumn();
const char* tdisp() {return tdisp_;}
const char* tdim() {return tdim_;}
int tdimM() {return tdimM_;}
int* tdimK() {return tdimK_;}
int tdimK(int ii) {return tdimK_[ii];}
};
class FitsBinColumnStr : public FitsBinColumn {
public:
FitsBinColumnStr(FitsHead*, int, int);
char* str(const char* ptr, int i =0);
int isInt() {return 0;}
};
class FitsBinColumnLogical : public FitsBinColumn {
public:
FitsBinColumnLogical(FitsHead*, int, int);
char* str(const char* ptr, int i =0);
int isInt() {return 0;}
};
class FitsBinColumnBit : public FitsBinColumn {
public:
FitsBinColumnBit(FitsHead*, int, int);
char* str(const char* ptr, int i =0);
int isInt() {return 0;}
};
class FitsBinColumnArray : public FitsBinColumn {
protected:
int byteswap_;
char ptype_;
int psize_;
int pmax_;
char* abuf_;
virtual int swap(const char* ptr, int i =0) =0;
public:
FitsBinColumnArray(FitsHead*, int, int);
virtual ~FitsBinColumnArray();
virtual void* get(const char* heap, const char* ptr, int* cnt);
int isInt() {return 0;}
};
class FitsBinColumnArrayP : public FitsBinColumnArray {
protected:
int swap(const char* ptr, int i =0);
public:
FitsBinColumnArrayP(FitsHead*, int, int);
};
class FitsBinColumnArrayQ : public FitsBinColumnArray {
protected:
int swap(const char* ptr, int i =0);
public:
FitsBinColumnArrayQ(FitsHead*, int, int);
};
class FitsBinColumnB : public FitsBinColumn {
protected:
int byteswap_;
public:
FitsBinColumnB(FitsHead*, int, int);
};
template<class T>
class FitsBinColumnT : public FitsBinColumnB {
private:
T swap(T*);
public:
FitsBinColumnT(FitsHead*, int, int);
char* str(const char* ptr, int i =0);
double value(const char*, int i =0);
Vector dimension();
int isInt();
};
#endif
|