Ignore:
Timestamp:
Apr 27, 2005, 1:48:19 PM (20 years ago)
Author:
ansari
Message:

1/ Corrections diverses ds BaseDataTable, en particulier GetSegment() -> GetCstSegment(), et ameliorations/debug divers
2/ Classe SWPPFDataTable debugge, rendu +/- operationnelle
3/ Gestionnaire PPersist de DataTable et SWPPFDataTable fusionnee en une seule
classe ObjFileIO<BaseDataTable> - mis ds fio_dtable.cc
4/ mis a jour histats.h avec swppfdtable.h, objlist.list et histinit.cc

Reza, 27 Avril 2005

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/HiStats/swppfdtable.cc

    r2696 r2699  
    4646SwPPFDataTable::SwPPFDataTable(POutPersist & os, sa_size_t segsz)
    4747  : BaseDataTable(segsz) ,
    48     mISwapper(os), mLSwapper(os), mFSwapper(os), mDSwapper(os), mSSwapper(os),
    49     mSwOut(&os), mSwIn(NULL)
     48    mSwOut(&os), mSwIn(NULL),
     49    mISwapper(os), mLSwapper(os), mFSwapper(os), mDSwapper(os), mSSwapper(os)
    5050{
    5151}
     
    5353SwPPFDataTable::SwPPFDataTable(PInPersist & is, sa_size_t segsz)
    5454  : 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);
    5865}
    5966
     
    6471{
    6572  Share(a);
     73}
     74//! Destructor - Deletes / closes the input PPF swap stream 
     75SwPPFDataTable::~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  }
    6685}
    6786
     
    7796  mSwOut = a.mSwOut;
    7897  mSwIn = a.mSwIn;
     98  if (mSwIn)  mSwIn->refcnt++;  // comptage de reference pour le stream input
    7999
    80100  // On recopie la taille de segment
     
    277297}
    278298
    279 /*!
    280    \class SOPHYA::ObjFileIO<SwPPFDataTable>
    281    \ingroup HiStats
    282    Persistence (serialisation) handler for class SwPPFDataTable
    283 */
    284 /* --Methode-- */
    285 DECL_TEMP_SPEC  /* equivalent a template <> , pour SGI-CC en particulier */
    286 void   ObjFileIO<SwPPFDataTable>::WriteSelf(POutPersist& s)  const
    287 //      Serialisation en ecriture du SwPPFDataTable sur stream PPF
    288 {
    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 info 
    296   //  [2] : reserve
    297   uint_4 itab[3];
    298   itab[0] = 1;  // Numero de version a 1
    299   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 colonnes
    315   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_minmax
    321   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 existant
    327   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 PPF
    360 {
    361   // ------- On lit les 3 premiers uint_4
    362   //  [0]: Numero de version ;
    363   //  [1] : bit1 non nul -> has info 
    364   //  [2] : reserve
    365   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 colonnes
    381   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_minmax
    390   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 necessaire
    396   if (hadinfo) {    // Lecture eventuelle du DVList Info
    397     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 #endif
    445 
    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.