source: Sophya/trunk/SophyaLib/HiStats/fio_dtable.cc@ 2962

Last change on this file since 2962 was 2868, checked in by ansari, 20 years ago

Portage/compilation sur AIX-XlC (regatta): Ajout qualification de nom et namespace SOPHYA pour instanciation template - Reza 3 Jan 2006

File size: 9.6 KB
Line 
1#include "datatable.h"
2#include "swppfdtable.h"
3#include "sopnamsp.h"
4#include "pexceptions.h"
5#include "fiosegdb.h"
6
7
8
9/*!
10 \class SOPHYA::ObjFileIO<BaseDataTable>
11 \ingroup HiStats
12 Persistence (serialisation) handler for class DataTable classes
13*/
14/* --Methode-- */
15DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
16void ObjFileIO<BaseDataTable>::WriteSelf(POutPersist& s) const
17// Serialisation en ecriture du DataTable sur stream PPF
18{
19 if (dobj == NULL)
20 throw NullPtrError("ObjFileIO<BaseDataTable>::WriteSelf() NULL dobj pointer ");
21 //------- On ecrit 3 uint_4 ....
22 // [0]: Numero de version ;
23 // [1] : bit1 non nul -> has info
24 // [2] : =1 DataTable , =2 SwPPFDataTable
25 // [3] : reserve
26
27 DataTable* dt = dynamic_cast< DataTable *> (dobj);
28 SwPPFDataTable* swdt = dynamic_cast< SwPPFDataTable *> (dobj);
29 if ( (dt == NULL) && (swdt == NULL) )
30 throw IOExc("ObjFileIO<BaseDataTable>::WriteSelf() object not a DataTable or SwPPFDataTable");
31 if ( swdt && (swdt->mSwOut != &s) )
32 throw IOExc("ObjFileIO<SwPPFDataTable>::WriteSelf() (obj=SwPPFDataTable) OutputStream <> SwapStream");
33 uint_4 itab[4];
34 itab[0] = 1; // Numero de version a 1
35 itab[1] = itab[2] = itab[3] = 0;
36 if (dobj->mInfo) itab[1] = 1;
37 if (dt != NULL) itab[2] = 1;
38 else if (swdt != NULL) itab[2] = 2;
39 s.Put(itab, 4);
40
41 //-------- Ecriture de segment size, nb de colonnes, nb de lignes ...
42 // [0] : SegmentSize() [1] : NVar()
43 // [2] : NEntry() [3] : NbSegments()
44 // [4] : reserve utilisation future
45 uint_8 ltab[5];
46 ltab[0] = dobj->SegmentSize();
47 ltab[1] = dobj->NVar();
48 ltab[2] = dobj->NEntry();
49 ltab[3] = dobj->NbSegments();
50 ltab[4] = 0;
51 s.Put(ltab, 5);
52
53 //------ Ecriture du nom et type des colonnes
54 for(sa_size_t k=0; k<dobj->NVar(); k++) {
55 uint_2 typ = dobj->mNames[k].type;
56 s.Put(typ);
57 s.Put(dobj->mNames[k].nom);
58 }
59 // ------- Ecriture des tableaux min,max et n_minmax
60 for(uint_8 k=0; k<ltab[1]; k++) {
61 s.Put(dobj->mMin[k]);
62 s.Put(dobj->mMax[k]);
63 s.Put(dobj->mMinMaxNEnt[k]);
64 }
65 //------- Ecriture du DVList Info() associe, si existant
66 if (dobj->mInfo) s << (*(dobj->mInfo));
67
68 //------- Ecriture des blocs de donnees Sw/SegDataBlock<T>
69 if (dt) { // C'est un DataTable
70 //.... Ecriture des SegDataBlock<T>
71 for (size_t kk=0; kk<dobj->mNames.size(); kk++) {
72 sa_size_t sk = dobj->mNames[kk].ser;
73 switch (dobj->mNames[kk].type) {
74 case BaseDataTable::IntegerField :
75 s << dt->mICols[sk];
76 break;
77 case BaseDataTable::LongField :
78 s << dt->mLCols[sk];
79 break;
80 case BaseDataTable::FloatField :
81 s << dt->mFCols[sk];
82 break;
83 case BaseDataTable::DoubleField :
84 case BaseDataTable::DateTimeField :
85 s << dt->mDCols[sk];
86 break;
87 case BaseDataTable::ComplexField :
88 s << dt->mYCols[sk];
89 break;
90 case BaseDataTable::DoubleComplexField :
91 s << dt->mZCols[sk];
92 break;
93 case BaseDataTable::StringField :
94 s << dt->mSCols[sk];
95 break;
96 default:
97 throw IOExc("ObjFileIO<BaseDataTable>::WriteSelf() (DataTable) unknown column type ");
98 break;
99 }
100 }
101 }
102 else if (swdt) { // C'est un SwPPFDataTable
103 //.... Ecriture des tables de positionnement de SwSegDataBlock<T>
104 for (size_t kk=0; kk<dobj->mNames.size(); kk++) {
105 sa_size_t sk = dobj->mNames[kk].ser;
106 switch (dobj->mNames[kk].type) {
107 case BaseDataTable::IntegerField :
108 s.PutPosTagTable(swdt->mICols[sk].GetSwapPosTagTable());
109 break;
110 case BaseDataTable::LongField :
111 s.PutPosTagTable(swdt->mLCols[sk].GetSwapPosTagTable());
112 break;
113 case BaseDataTable::FloatField :
114 s.PutPosTagTable(swdt->mFCols[sk].GetSwapPosTagTable());
115 break;
116 case BaseDataTable::DoubleField :
117 case BaseDataTable::DateTimeField :
118 s.PutPosTagTable(swdt->mDCols[sk].GetSwapPosTagTable());
119 break;
120 case BaseDataTable::ComplexField :
121 s.PutPosTagTable(swdt->mYCols[sk].GetSwapPosTagTable());
122 break;
123 case BaseDataTable::DoubleComplexField :
124 s.PutPosTagTable(swdt->mZCols[sk].GetSwapPosTagTable());
125 break;
126 case BaseDataTable::StringField :
127 s.PutPosTagTable(swdt->mSCols[sk].GetSwapPosTagTable());
128 break;
129 default:
130 throw IOExc("ObjFileIO<BaseDataTable>::WriteSelf() (SwPPFDataTable) unknown column type ");
131 break;
132 }
133 }
134 }
135 return;
136 }
137
138/* --Methode-- */
139DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
140void ObjFileIO<BaseDataTable>::ReadSelf(PInPersist& s)
141// Serialisation en lecture du DataTable sur stream PPF
142{
143 // ------- On lit les 3 premiers uint_4
144 // [0]: Numero de version ;
145 // [1] : bit1 non nul -> has info
146 // [2] : =1 DataTable , =2 SwPPFDataTable
147 // [3] : reserve
148 uint_4 itab[4] = {0,0,0,0};
149 s.Get(itab, 4);
150 bool hadinfo = false;
151 if ((itab[1]&1) == 1) hadinfo = true;
152 if ((itab[2] != 1) && (itab[2] != 2))
153 throw IOExc("ObjFileIO<BaseDataTable>::ReadSelf(): (itab[2]=type=1 or 2) supported only");
154
155 // -------- Lecture de segment size, nb de colonnes, nb de lignes ...
156 // [0] : SegmentSize() [1] : NVar()
157 // [2] : NEntry() [3] : NbSegments()
158 uint_8 ltab[5] = {0,0,0,0,0};
159 s.Get(ltab, 5);
160 if (dobj == NULL) {
161 if (itab[2] == 1) dobj = new DataTable(ltab[0]);
162 else if (itab[2] == 2) dobj = new SwPPFDataTable(s, ltab[0]);
163 }
164 else {
165 dobj->Clear();
166 dobj->mSegSz = ltab[0];
167 SwPPFDataTable* swdtc = dynamic_cast< SwPPFDataTable *> (dobj);
168 // Copie brutale en utilisant l'operateur =
169 if (swdtc && (itab[2] == 2)) *swdtc = SwPPFDataTable(s, ltab[0]);
170 }
171
172 DataTable* dt = dynamic_cast< DataTable *> (dobj);
173 SwPPFDataTable* swdt = dynamic_cast< SwPPFDataTable *> (dobj);
174 if ( (dt == NULL) && (swdt == NULL) )
175 throw IOExc("ObjFileIO<BaseDataTable>::ReadSelf() object not a DataTable or SwPPFDataTable");
176 if ( (itab[2] == 1) && (dt == NULL) )
177 throw IOExc("ObjFileIO<BaseDataTable>::ReadSelf() object not a DataTable and itab[2]=1");
178 if ( (itab[2] == 2) && (swdt == NULL) )
179 throw IOExc("ObjFileIO<BaseDataTable>::ReadSelf() object not a DataTable and itab[2]=1");
180
181 // -------- Lecture nom/type colonnes et allocation des colonnes
182 uint_2 typ;
183 string cnom;
184 for(uint_8 k=0; k<ltab[1]; k++) {
185 s.Get(typ);
186 s.Get(cnom);
187 BaseDataTable::FieldType ft = (BaseDataTable::FieldType)typ;
188 dobj->AddColumn(ft, cnom);
189 }
190 // ------- Lecture des tableaux min,max et n_minmax
191 for(uint_8 k=0; k<ltab[1]; k++) {
192 s.Get(dobj->mMin[k]);
193 s.Get(dobj->mMax[k]);
194 s.Get(dobj->mMinMaxNEnt[k]);
195 }
196 // ------- Lecture du DVList Info() associe, si necessaire
197 if (hadinfo) { // Lecture eventuelle du DVList Info
198 if (dobj->mInfo == NULL) dobj->mInfo = new DVList;
199 s >> (*(dobj->mInfo));
200 }
201 // ------- Mise a jour des champs Nb d'entrees, nb segments ...
202 dobj->mNEnt = ltab[2];
203 dobj->mNSeg = ltab[3];
204 // ------- Lecture des donnees Sw/SegDataBlock<T> ou Sw
205 if (itab[2] == 1) { // On lit un DataTable
206 // .... Lecture des SegDataBlock<T>
207 for (size_t kk=0; kk<dobj->mNames.size(); kk++) {
208 sa_size_t sk = dobj->mNames[kk].ser;
209 switch (dobj->mNames[kk].type) {
210 case BaseDataTable::IntegerField :
211 s >> dt->mICols[sk];
212 break;
213 case BaseDataTable::LongField :
214 s >> dt->mLCols[sk];
215 break;
216 case BaseDataTable::FloatField :
217 s >> dt->mFCols[sk];
218 break;
219 case BaseDataTable::DoubleField :
220 case BaseDataTable::DateTimeField :
221 s >> dt->mDCols[sk];
222 break;
223 case BaseDataTable::ComplexField :
224 s >> dt->mYCols[sk];
225 break;
226 case BaseDataTable::DoubleComplexField :
227 s >> dt->mZCols[sk];
228 break;
229 case BaseDataTable::StringField :
230 s >> dt->mSCols[sk];
231 break;
232 default:
233 throw IOExc("ObjFileIO<BaseDataTable>::ReadSelf() : unknown column type ");
234 break;
235 }
236 }
237 }
238 else if (itab[2] == 2) { // C'est un SwPPFDataTable
239 // .... Lecture des tag de positionnement des SwSegDataBlock<T>
240 vector<int_8> swpos;
241 for (size_t kk=0; kk<dobj->mNames.size(); kk++) {
242 sa_size_t sk = dobj->mNames[kk].ser;
243 switch (dobj->mNames[kk].type) {
244 case BaseDataTable::IntegerField :
245 swpos.clear();
246 s.GetPosTagTable(swpos);
247 swdt->mICols[sk] = SwSegDataBlock<int_4>(swdt->mISwapper, swpos, swdt->SegmentSize());
248 break;
249 case BaseDataTable::LongField :
250 swpos.clear();
251 s.GetPosTagTable(swpos);
252 swdt->mLCols[sk] = SwSegDataBlock<int_8>(swdt->mLSwapper, swpos, swdt->SegmentSize());
253 break;
254 case BaseDataTable::FloatField :
255 swpos.clear();
256 s.GetPosTagTable(swpos);
257 swdt->mFCols[sk] = SwSegDataBlock<r_4>(swdt->mFSwapper, swpos, swdt->SegmentSize());
258 break;
259 case BaseDataTable::DoubleField :
260 case BaseDataTable::DateTimeField :
261 swpos.clear();
262 s.GetPosTagTable(swpos);
263 swdt->mDCols[sk] = SwSegDataBlock<r_8>(swdt->mDSwapper, swpos, swdt->SegmentSize());
264 break;
265 case BaseDataTable::ComplexField :
266 swpos.clear();
267 s.GetPosTagTable(swpos);
268 swdt->mYCols[sk] = SwSegDataBlock< complex<r_4> >(swdt->mYSwapper, swpos, swdt->SegmentSize());
269 break;
270 case BaseDataTable::DoubleComplexField :
271 swpos.clear();
272 s.GetPosTagTable(swpos);
273 swdt->mZCols[sk] = SwSegDataBlock< complex<r_8> >(swdt->mZSwapper, swpos, swdt->SegmentSize());
274 break;
275 case BaseDataTable::StringField :
276 swpos.clear();
277 s.GetPosTagTable(swpos);
278 swdt->mSCols[sk] = SwSegDataBlock<string>(swdt->mSSwapper, swpos, swdt->SegmentSize());
279 break;
280 default:
281 throw IOExc("ObjFileIO<SwPPFDataTable>::ReadSelf() : unknown column type ");
282 break;
283 }
284 }
285 }
286return;
287}
288
289#ifdef __CXX_PRAGMA_TEMPLATES__
290#pragma define_template ObjFileIO<BaseDataTable>
291#endif
292
293#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
294template class SOPHYA::ObjFileIO<BaseDataTable>;
295#endif
Note: See TracBrowser for help on using the repository browser.