source: Sophya/trunk/SophyaExt/FitsIOServer/fitsarrhand.h@ 2875

Last change on this file since 2875 was 2864, checked in by ansari, 20 years ago

1/ Ajout methode CheckReadability() , retour int pour CheckHandling() ds l'interface FitsHandler et propagation vers handler TArray et DataTable
2/ Correction dans FitsManager et ajout initialiseur de module FitsIOServer (fiosinit.h .cc)
3/ FitsSwapper complete - corrige - full template (suppression de fitsswapper.cc)
4/ MAJ Makefile et objlist.list suite ajout fiosinit.cc et swfitsdtable

Reza , 2 Jan 2006

File size: 3.4 KB
Line 
1#ifndef FITSARRHAND_H
2#define FITSARRHAND_H
3
4#include "machdefs.h"
5#include <string>
6#include "tarray.h"
7#include "tvector.h"
8
9#include "fitshandler.h"
10#include "fitsblkrw.h"
11
12namespace SOPHYA {
13
14/*!
15 \ingroup FitsIOServer
16 \brief FITS I/O handler for array objects
17*/
18
19template <class T>
20class FitsArrayHandler : public FitsHandlerInterface {
21public :
22 FitsArrayHandler() { dobj=NULL; ownobj=true; }
23 FitsArrayHandler(TArray< T > & obj) { dobj = &obj; ownobj=false; }
24 virtual ~FitsArrayHandler() { if (ownobj && dobj) delete dobj; }
25 virtual AnyDataObj* DataObj() { return(dobj); }
26
27 virtual int CheckHandling(AnyDataObj & o)
28 {
29 if ( (typeid(o) == typeid(TArray<T>)) ||
30 (typeid(o) == typeid(TMatrix<T>)) ||
31 (typeid(o) == typeid(TVector<T>)) ) return 2;
32 TArray<T> * po = dynamic_cast< TArray<T> * >(& o);
33 if (po == NULL) return 0;
34 else return 1;
35 }
36
37 virtual void SetDataObj(AnyDataObj & o)
38 {
39 TArray<T> * po = dynamic_cast< TArray<T> * >(& o);
40 if (po == NULL) {
41 string msg = "FitsHandler<T>::SetDataObj() Wrong object type: " ;
42 msg += typeid(o).name();
43 throw TypeMismatchExc(msg);
44 }
45 if (ownobj && dobj) delete dobj; dobj = po; ownobj = false;
46 }
47
48 virtual int CheckReadability(FitsInOutFile& is)
49 {
50 if (is.CurrentHDUType() != IMAGE_HDU) return 0;
51 T x = 0;
52 long naxes[BASEARRAY_MAXNDIMS];
53 int naxis=BASEARRAY_MAXNDIMS;
54 if (FitsTypes::ImageType(x) == is.GetImageHDUInfo(naxis, naxes))
55 return 2;
56 else return 1;
57 }
58
59 virtual FitsHandlerInterface* Clone()
60 { return new FitsArrayHandler< T >(); }
61
62 inline operator T&() { return(*dobj); }
63
64 //----- Ecriture
65 virtual void Write(FitsInOutFile& os)
66 {
67 if ( dobj == NULL)
68 throw NullPtrError("FitsArrayHandler<T>::Write() dobj=NULL ");
69 long naxes[BASEARRAY_MAXNDIMS] = {0,0,0,0,0};
70 for(int_4 id=0; id<dobj->NbDimensions(); id++)
71 naxes[id] = dobj->Size(id);
72 T x = 0;
73 os.CreateImageHDU(FitsTypes::ImageType(x), dobj->NbDimensions(), naxes);
74 os.WriteHeaderRecords(dobj->Info());
75 MuTyV mtv;
76 mtv = "SOPHYA::TArray<T>";
77 os.WriteKey("SOPCLSNM",mtv," Object class name ");
78 FitsBlockRW<T>::WriteImageData(os, dobj->Data(), dobj->Size());
79 }
80
81 //----- Lecture
82 virtual void Read(FitsInOutFile& is)
83 {
84 long naxes[BASEARRAY_MAXNDIMS];
85 int naxis=BASEARRAY_MAXNDIMS;
86 is.GetImageHDUInfo(naxis, naxes);
87 if ( dobj == NULL) {
88 if (naxis == 1) dobj = new TVector<T>;
89 else if (naxis == 1) dobj = new TMatrix<T>;
90 else dobj = new TArray<T>;
91 ownobj = true;
92 }
93 sa_size_t sz[BASEARRAY_MAXNDIMS];
94 if (naxis > BASEARRAY_MAXNDIMS) naxis = BASEARRAY_MAXNDIMS;
95 for(int_4 id=0; id<naxis; id++) sz[id] = naxes[id];
96 dobj->SetSize(naxis, sz, 1, false);
97 FitsBlockRW<T>::ReadImageData(is, dobj->Data(), dobj->Size());
98 is.GetHeaderRecords(dobj->Info());
99 }
100
101protected :
102 TArray<T> * dobj;
103 bool ownobj; // True si dobj obtenu par new
104};
105
106
107template <class T>
108inline FitsInOutFile& operator << (FitsInOutFile& os, TArray<T> const & obj)
109{ FitsArrayHandler<T> fio(const_cast< TArray<T> &>(obj)); fio.Write(os); return os; }
110
111template <class T>
112inline FitsInOutFile& operator >> (FitsInOutFile& is, TArray<T> & obj)
113{ FitsArrayHandler<T> fio(obj); fio.Read(is); is.MoveToNextHDU(); return(is); }
114
115
116} // Fin du namespace
117
118#endif
119
Note: See TracBrowser for help on using the repository browser.