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

Last change on this file since 3753 was 3236, checked in by ansari, 18 years ago

Ajout namespace SOPHYA ds les fichiers .cc au lieu de include sopnamsp.h en presence de DECL_TEMP_SPEC , cmv+reza 27/04/2007

File size: 9.6 KB
RevLine 
[2700]1#include "datatable.h"
2#include "swppfdtable.h"
3#include "pexceptions.h"
4#include "fiosegdb.h"
5
[3236]6namespace SOPHYA {
[2700]7
8
9/*!
[3236]10 \class ObjFileIO<BaseDataTable>
[2700]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 :
[2831]84 case BaseDataTable::DateTimeField :
[2700]85 s << dt->mDCols[sk];
86 break;
[2827]87 case BaseDataTable::ComplexField :
88 s << dt->mYCols[sk];
89 break;
90 case BaseDataTable::DoubleComplexField :
91 s << dt->mZCols[sk];
92 break;
[2700]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 :
[2831]117 case BaseDataTable::DateTimeField :
[2700]118 s.PutPosTagTable(swdt->mDCols[sk].GetSwapPosTagTable());
119 break;
[2827]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;
[2700]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 :
[2831]220 case BaseDataTable::DateTimeField :
[2700]221 s >> dt->mDCols[sk];
222 break;
[2827]223 case BaseDataTable::ComplexField :
224 s >> dt->mYCols[sk];
225 break;
226 case BaseDataTable::DoubleComplexField :
227 s >> dt->mZCols[sk];
228 break;
[2700]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 :
[2831]260 case BaseDataTable::DateTimeField :
[2700]261 swpos.clear();
262 s.GetPosTagTable(swpos);
263 swdt->mDCols[sk] = SwSegDataBlock<r_8>(swdt->mDSwapper, swpos, swdt->SegmentSize());
264 break;
[2827]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;
[2700]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)
[3236]294template class ObjFileIO<BaseDataTable>;
[2700]295#endif
[3236]296
297} // FIN namespace SOPHYA
Note: See TracBrowser for help on using the repository browser.