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

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

Ajout fichier fio_dtable.cc pour ObjFileIO<BaseDataTable>::ReadSelf() / WriteSelf() - Reza 27/04/2005

File size: 8.5 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 s << dt->mDCols[sk];
85 break;
86 case BaseDataTable::StringField :
87 s << dt->mSCols[sk];
88 break;
89 default:
90 throw IOExc("ObjFileIO<BaseDataTable>::WriteSelf() (DataTable) unknown column type ");
91 break;
92 }
93 }
94 }
95 else if (swdt) { // C'est un SwPPFDataTable
96 //.... Ecriture des tables de positionnement de SwSegDataBlock<T>
97 for (size_t kk=0; kk<dobj->mNames.size(); kk++) {
98 sa_size_t sk = dobj->mNames[kk].ser;
99 switch (dobj->mNames[kk].type) {
100 case BaseDataTable::IntegerField :
101 s.PutPosTagTable(swdt->mICols[sk].GetSwapPosTagTable());
102 break;
103 case BaseDataTable::LongField :
104 s.PutPosTagTable(swdt->mLCols[sk].GetSwapPosTagTable());
105 break;
106 case BaseDataTable::FloatField :
107 s.PutPosTagTable(swdt->mFCols[sk].GetSwapPosTagTable());
108 break;
109 case BaseDataTable::DoubleField :
110 s.PutPosTagTable(swdt->mDCols[sk].GetSwapPosTagTable());
111 break;
112 case BaseDataTable::StringField :
113 s.PutPosTagTable(swdt->mSCols[sk].GetSwapPosTagTable());
114 break;
115 default:
116 throw IOExc("ObjFileIO<BaseDataTable>::WriteSelf() (SwPPFDataTable) unknown column type ");
117 break;
118 }
119 }
120 }
121 return;
122 }
123
124/* --Methode-- */
125DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
126void ObjFileIO<BaseDataTable>::ReadSelf(PInPersist& s)
127// Serialisation en lecture du DataTable sur stream PPF
128{
129 // ------- On lit les 3 premiers uint_4
130 // [0]: Numero de version ;
131 // [1] : bit1 non nul -> has info
132 // [2] : =1 DataTable , =2 SwPPFDataTable
133 // [3] : reserve
134 uint_4 itab[4] = {0,0,0,0};
135 s.Get(itab, 4);
136 bool hadinfo = false;
137 if ((itab[1]&1) == 1) hadinfo = true;
138 if ((itab[2] != 1) && (itab[2] != 2))
139 throw IOExc("ObjFileIO<BaseDataTable>::ReadSelf(): (itab[2]=type=1 or 2) supported only");
140
141 // -------- Lecture de segment size, nb de colonnes, nb de lignes ...
142 // [0] : SegmentSize() [1] : NVar()
143 // [2] : NEntry() [3] : NbSegments()
144 uint_8 ltab[5] = {0,0,0,0,0};
145 s.Get(ltab, 5);
146 if (dobj == NULL) {
147 if (itab[2] == 1) dobj = new DataTable(ltab[0]);
148 else if (itab[2] == 2) dobj = new SwPPFDataTable(s, ltab[0]);
149 }
150 else {
151 dobj->Clear();
152 dobj->mSegSz = ltab[0];
153 SwPPFDataTable* swdtc = dynamic_cast< SwPPFDataTable *> (dobj);
154 // Copie brutale en utilisant l'operateur =
155 if (swdtc && (itab[2] == 2)) *swdtc = SwPPFDataTable(s, ltab[0]);
156 }
157
158 DataTable* dt = dynamic_cast< DataTable *> (dobj);
159 SwPPFDataTable* swdt = dynamic_cast< SwPPFDataTable *> (dobj);
160 if ( (dt == NULL) && (swdt == NULL) )
161 throw IOExc("ObjFileIO<BaseDataTable>::ReadSelf() object not a DataTable or SwPPFDataTable");
162 if ( (itab[2] == 1) && (dt == NULL) )
163 throw IOExc("ObjFileIO<BaseDataTable>::ReadSelf() object not a DataTable and itab[2]=1");
164 if ( (itab[2] == 2) && (swdt == NULL) )
165 throw IOExc("ObjFileIO<BaseDataTable>::ReadSelf() object not a DataTable and itab[2]=1");
166
167 // -------- Lecture nom/type colonnes et allocation des colonnes
168 uint_2 typ;
169 string cnom;
170 for(uint_8 k=0; k<ltab[1]; k++) {
171 s.Get(typ);
172 s.Get(cnom);
173 BaseDataTable::FieldType ft = (BaseDataTable::FieldType)typ;
174 dobj->AddColumn(ft, cnom);
175 }
176 // ------- Lecture des tableaux min,max et n_minmax
177 for(uint_8 k=0; k<ltab[1]; k++) {
178 s.Get(dobj->mMin[k]);
179 s.Get(dobj->mMax[k]);
180 s.Get(dobj->mMinMaxNEnt[k]);
181 }
182 // ------- Lecture du DVList Info() associe, si necessaire
183 if (hadinfo) { // Lecture eventuelle du DVList Info
184 if (dobj->mInfo == NULL) dobj->mInfo = new DVList;
185 s >> (*(dobj->mInfo));
186 }
187 // ------- Mise a jour des champs Nb d'entrees, nb segments ...
188 dobj->mNEnt = ltab[2];
189 dobj->mNSeg = ltab[3];
190 // ------- Lecture des donnees Sw/SegDataBlock<T> ou Sw
191 if (itab[2] == 1) { // On lit un DataTable
192 // .... Lecture des SegDataBlock<T>
193 for (size_t kk=0; kk<dobj->mNames.size(); kk++) {
194 sa_size_t sk = dobj->mNames[kk].ser;
195 switch (dobj->mNames[kk].type) {
196 case BaseDataTable::IntegerField :
197 s >> dt->mICols[sk];
198 break;
199 case BaseDataTable::LongField :
200 s >> dt->mLCols[sk];
201 break;
202 case BaseDataTable::FloatField :
203 s >> dt->mFCols[sk];
204 break;
205 case BaseDataTable::DoubleField :
206 s >> dt->mDCols[sk];
207 break;
208 case BaseDataTable::StringField :
209 s >> dt->mSCols[sk];
210 break;
211 default:
212 throw IOExc("ObjFileIO<BaseDataTable>::ReadSelf() : unknown column type ");
213 break;
214 }
215 }
216 }
217 else if (itab[2] == 2) { // C'est un SwPPFDataTable
218 // .... Lecture des tag de positionnement des SwSegDataBlock<T>
219 vector<int_8> swpos;
220 for (size_t kk=0; kk<dobj->mNames.size(); kk++) {
221 sa_size_t sk = dobj->mNames[kk].ser;
222 switch (dobj->mNames[kk].type) {
223 case BaseDataTable::IntegerField :
224 swpos.clear();
225 s.GetPosTagTable(swpos);
226 swdt->mICols[sk] = SwSegDataBlock<int_4>(swdt->mISwapper, swpos, swdt->SegmentSize());
227 break;
228 case BaseDataTable::LongField :
229 swpos.clear();
230 s.GetPosTagTable(swpos);
231 swdt->mLCols[sk] = SwSegDataBlock<int_8>(swdt->mLSwapper, swpos, swdt->SegmentSize());
232 break;
233 case BaseDataTable::FloatField :
234 swpos.clear();
235 s.GetPosTagTable(swpos);
236 swdt->mFCols[sk] = SwSegDataBlock<r_4>(swdt->mFSwapper, swpos, swdt->SegmentSize());
237 break;
238 case BaseDataTable::DoubleField :
239 swpos.clear();
240 s.GetPosTagTable(swpos);
241 swdt->mDCols[sk] = SwSegDataBlock<r_8>(swdt->mDSwapper, swpos, swdt->SegmentSize());
242 break;
243 case BaseDataTable::StringField :
244 swpos.clear();
245 s.GetPosTagTable(swpos);
246 swdt->mSCols[sk] = SwSegDataBlock<string>(swdt->mSSwapper, swpos, swdt->SegmentSize());
247 break;
248 default:
249 throw IOExc("ObjFileIO<SwPPFDataTable>::ReadSelf() : unknown column type ");
250 break;
251 }
252 }
253 }
254return;
255}
256
257#ifdef __CXX_PRAGMA_TEMPLATES__
258#pragma define_template ObjFileIO<BaseDataTable>
259#endif
260
261#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
262template class ObjFileIO<BaseDataTable>;
263#endif
Note: See TracBrowser for help on using the repository browser.