Changeset 2699 in Sophya for trunk/SophyaLib/HiStats/swppfdtable.cc
- Timestamp:
- Apr 27, 2005, 1:48:19 PM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/HiStats/swppfdtable.cc
r2696 r2699 46 46 SwPPFDataTable::SwPPFDataTable(POutPersist & os, sa_size_t segsz) 47 47 : BaseDataTable(segsz) , 48 m ISwapper(os), mLSwapper(os), mFSwapper(os), mDSwapper(os), mSSwapper(os),49 m SwOut(&os), mSwIn(NULL)48 mSwOut(&os), mSwIn(NULL), 49 mISwapper(os), mLSwapper(os), mFSwapper(os), mDSwapper(os), mSSwapper(os) 50 50 { 51 51 } … … 53 53 SwPPFDataTable::SwPPFDataTable(PInPersist & is, sa_size_t segsz) 54 54 : BaseDataTable(segsz) , 55 mISwapper(is), mLSwapper(is), mFSwapper(is), mDSwapper(is), mSSwapper(is), 56 mSwOut(NULL), mSwIn(&is) 57 { 55 mSwOut(NULL), mSwIn(NULL) 56 { 57 PInPersist* pis = new PInPersist(is.FileName(), false); 58 mSwIn = new St_InSwap; 59 mSwIn->pis = pis; mSwIn->refcnt = 1; 60 mISwapper.SetInStream(*pis); 61 mLSwapper.SetInStream(*pis); 62 mFSwapper.SetInStream(*pis); 63 mDSwapper.SetInStream(*pis); 64 mDSwapper.SetInStream(*pis); 58 65 } 59 66 … … 64 71 { 65 72 Share(a); 73 } 74 //! Destructor - Deletes / closes the input PPF swap stream 75 SwPPFDataTable::~SwPPFDataTable() 76 { 77 if (mSwIn) { 78 mSwIn->refcnt--; 79 if (mSwIn->refcnt == 0) { 80 delete mSwIn->pis; 81 delete mSwIn; 82 mSwIn = NULL; 83 } 84 } 66 85 } 67 86 … … 77 96 mSwOut = a.mSwOut; 78 97 mSwIn = a.mSwIn; 98 if (mSwIn) mSwIn->refcnt++; // comptage de reference pour le stream input 79 99 80 100 // On recopie la taille de segment … … 277 297 } 278 298 279 /*!280 \class SOPHYA::ObjFileIO<SwPPFDataTable>281 \ingroup HiStats282 Persistence (serialisation) handler for class SwPPFDataTable283 */284 /* --Methode-- */285 DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */286 void ObjFileIO<SwPPFDataTable>::WriteSelf(POutPersist& s) const287 // Serialisation en ecriture du SwPPFDataTable sur stream PPF288 {289 if (dobj == NULL)290 throw NullPtrError("ObjFileIO<SwPPFDataTable>::WriteSelf() NULL dobj pointer ");291 if (dobj->mSwOut != &s)292 throw NotAvailableOperation("ObjFileIO<SwPPFDataTable>::WriteSelf() OutputStream <> SwapStream");293 //------- On ecrit 3 uint_4 ....294 // [0]: Numero de version ;295 // [1] : bit1 non nul -> has info296 // [2] : reserve297 uint_4 itab[3];298 itab[0] = 1; // Numero de version a 1299 itab[1] = itab[2] = 0;300 if (dobj->mInfo) itab[1] = 1;301 s.Put(itab, 3);302 303 //-------- Ecriture de segment size, nb de colonnes, nb de lignes ...304 // [0] : SegmentSize() [1] : NVar()305 // [2] : NEntry() [3] : NbSegments()306 uint_8 ltab[5];307 ltab[0] = dobj->SegmentSize();308 ltab[1] = dobj->NVar();309 ltab[2] = dobj->NEntry();310 ltab[3] = dobj->NbSegments();311 ltab[4] = 0;312 s.Put(ltab, 5);313 314 //------ Ecriture du nom et type des colonnes315 for(sa_size_t k=0; k<dobj->NVar(); k++) {316 uint_2 typ = dobj->mNames[k].type;317 s.Put(typ);318 s.Put(dobj->mNames[k].nom);319 }320 // ------- Ecriture des tableaux min,max et n_minmax321 for(uint_8 k=0; k<ltab[1]; k++) {322 s.Put(dobj->mMin[k]);323 s.Put(dobj->mMax[k]);324 s.Put(dobj->mMinMaxNEnt[k]);325 }326 //------- Ecriture du DVList Info() associe, si existant327 if (dobj->mInfo) s << (*(dobj->mInfo));328 329 //------- Ecriture des tables de positionnement de SwSegDataBlock<T>330 for (size_t kk=0; kk<dobj->mNames.size(); kk++) {331 sa_size_t sk = dobj->mNames[kk].ser;332 switch (dobj->mNames[kk].type) {333 case BaseDataTable::IntegerField :334 s.PutPosTagTable(dobj->mICols[sk].GetSwapPosTagTable());335 break;336 case BaseDataTable::LongField :337 s.PutPosTagTable(dobj->mLCols[sk].GetSwapPosTagTable());338 break;339 case BaseDataTable::FloatField :340 s.PutPosTagTable(dobj->mFCols[sk].GetSwapPosTagTable());341 break;342 case BaseDataTable::DoubleField :343 s.PutPosTagTable(dobj->mDCols[sk].GetSwapPosTagTable());344 break;345 case BaseDataTable::StringField :346 s.PutPosTagTable(dobj->mSCols[sk].GetSwapPosTagTable());347 break;348 default:349 throw ForbiddenError("ObjFileIO<SwPPFDataTable>::WriteSelf() : unknown column type ");350 break;351 }352 }353 return;354 }355 356 /* --Methode-- */357 DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */358 void ObjFileIO<SwPPFDataTable>::ReadSelf(PInPersist& s)359 // Serialisation en lecture du SwPPFDataTable sur stream PPF360 {361 // ------- On lit les 3 premiers uint_4362 // [0]: Numero de version ;363 // [1] : bit1 non nul -> has info364 // [2] : reserve365 uint_4 itab[3] = {0,0,0};366 s.Get(itab, 3);367 bool hadinfo = false;368 if ((itab[1]&1) == 1) hadinfo = true;369 370 // -------- Lecture de segment size, nb de colonnes, nb de lignes ...371 // [0] : SegmentSize() [1] : NVar()372 // [2] : NEntry() [3] : NbSegments()373 uint_8 ltab[5] = {0,0,0,0,0};374 s.Get(ltab, 5);375 if (dobj == NULL) dobj = new SwPPFDataTable(s, ltab[0]);376 else {377 // Copie brutale en utilisant l'operateur =378 *dobj = SwPPFDataTable(s, ltab[0]);379 }380 // -------- Lecture nom/type colonnes et allocation des colonnes381 uint_2 typ;382 string cnom;383 for(uint_8 k=0; k<ltab[1]; k++) {384 s.Get(typ);385 s.Get(cnom);386 BaseDataTable::FieldType ft = (BaseDataTable::FieldType)typ;387 dobj->AddColumn(ft, cnom);388 }389 // ------- Lecture des tableaux min,max et n_minmax390 for(uint_8 k=0; k<ltab[1]; k++) {391 s.Get(dobj->mMin[k]);392 s.Get(dobj->mMax[k]);393 s.Get(dobj->mMinMaxNEnt[k]);394 }395 // ------- Lecture du DVList Info() associe, si necessaire396 if (hadinfo) { // Lecture eventuelle du DVList Info397 if (dobj->mInfo == NULL) dobj->mInfo = new DVList;398 s >> (*(dobj->mInfo));399 }400 // ------- Mise a jour des champs Nb d'entrees, nb segments ...401 dobj->mNEnt = ltab[2];402 dobj->mNSeg = ltab[3];403 cout << " DEBUG___ SegmentSize()= " << dobj->SegmentSize() << endl;404 // ------- Lecture des tag de positionnement des SwSegDataBlock<T>405 vector<int_8> swpos;406 for (size_t kk=0; kk<dobj->mNames.size(); kk++) {407 sa_size_t sk = dobj->mNames[kk].ser;408 switch (dobj->mNames[kk].type) {409 case BaseDataTable::IntegerField :410 swpos.clear();411 s.GetPosTagTable(swpos);412 dobj->mICols[sk] = SwSegDataBlock<int_4>(dobj->mISwapper, swpos, dobj->SegmentSize());413 break;414 case BaseDataTable::LongField :415 swpos.clear();416 s.GetPosTagTable(swpos);417 dobj->mLCols[sk] = SwSegDataBlock<int_8>(dobj->mLSwapper, swpos, dobj->SegmentSize());418 break;419 case BaseDataTable::FloatField :420 swpos.clear();421 s.GetPosTagTable(swpos);422 dobj->mFCols[sk] = SwSegDataBlock<r_4>(dobj->mFSwapper, swpos, dobj->SegmentSize());423 break;424 case BaseDataTable::DoubleField :425 swpos.clear();426 s.GetPosTagTable(swpos);427 dobj->mDCols[sk] = SwSegDataBlock<r_8>(dobj->mDSwapper, swpos, dobj->SegmentSize());428 break;429 case BaseDataTable::StringField :430 swpos.clear();431 s.GetPosTagTable(swpos);432 dobj->mSCols[sk] = SwSegDataBlock<string>(dobj->mSSwapper, swpos, dobj->SegmentSize());433 break;434 default:435 throw ForbiddenError("ObjFileIO<SwPPFDataTable>::ReadSelf() : unknown column type ");436 break;437 }438 }439 return;440 }441 442 #ifdef __CXX_PRAGMA_TEMPLATES__443 #pragma define_template ObjFileIO<SwPPFDataTable>444 #endif445 446 #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)447 template class ObjFileIO<SwPPFDataTable>;448 #endif
Note:
See TracChangeset
for help on using the changeset viewer.