Changeset 2863 in Sophya


Ignore:
Timestamp:
Jan 2, 2006, 2:38:54 PM (20 years ago)
Author:
ansari
Message:

Correction bug latent ds SwSegDataBlock<T> (operateur = et constructeur de copie) par ajout / appel methode Clone() dans DataSwapperInterface<T> - Reza 2 Jan 2006

Location:
trunk/SophyaLib/BaseTools
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/BaseTools/ppfswapper.h

    r2805 r2863  
    4343  virtual int_8 WriteToSwap(const T * d, size_t sz, int_8 idx, int_8 oswp=0, bool osw=false)
    4444  {
    45     if (ppfos == NULL) throw NotAvailableOperation("PPFDataSwapper<T>::WriteToSwap() - No POutPersist stream !");
     45    if (ppfos == NULL)
     46      throw NotAvailableOperation("PPFDataSwapper<T>::WriteToSwap() - No POutPersist stream !");
    4647    int_8 tag = ppfos->WritePositionTag();
    4748    PPF_TPointer_IO<T>::Write(*ppfos, d, sz);
     
    5051  virtual void  ReadFromSwap(int_8 idx, int_8 swp, T* d, size_t sz)
    5152  {
    52     if (ppfis == NULL) throw NotAvailableOperation("PPFDataSwapper<T>::ReadFromSwap() - No PInPersist stream !");
     53    if (ppfis == NULL)
     54      throw NotAvailableOperation("PPFDataSwapper<T>::ReadFromSwap() - No PInPersist stream !");
    5355    bool ok = ppfis->GotoPositionTag(swp);
    5456    PPF_TPointer_IO<T>::Read(*ppfis, d, sz);
    5557    return;
     58  }
     59  virtual DataSwapperInterface<T>* Clone()
     60  {
     61    PPFDataSwapper<T> * rsw = new PPFDataSwapper<T> ;
     62    (*rsw) = *this;
     63    return rsw;
    5664  }
    5765protected:
  • trunk/SophyaLib/BaseTools/swsegdb.h

    r2805 r2863  
    5252   */
    5353  virtual void  ReadFromSwap(int_8 idx, int_8 swp, T* d, size_t sz) = 0;
     54
     55  /*! Duplicate the swapper object and return the new object pointer.
     56      The returned pointer should be deleted when not needed any more.
     57      This method is used by SwSegDataBlock<T>
     58  */
     59  virtual DataSwapperInterface<T>* Clone() = 0;
    5460};
    5561
     
    6268    mSRef = NULL;
    6369    SetSize(segsz, swpos.size());
    64     mSRef->swapper = &dsw;
     70    SetSwapper(dsw);
    6571    mSRef->swp = swpos;
    6672    for(size_t k=0; k<mSRef->fgwp.size(); k++)  mSRef->fgwp[k] = true;
     
    7177    mSRef = NULL;
    7278    SetSize(segsz, nbseg);
    73     mSRef->swapper = &dsw;
     79    SetSwapper(dsw);
    7480  }
    7581  //! copy constructor - shares the data
     
    8995    return mSRef->swp.size();
    9096  }
    91   //! Changes the data segment size and reallocates the memory segments
     97  /*! \brief Changes the data segment size and reallocates the memory segments
     98    \warning SetSwapper() must be called after call to SetSize()
     99  */
    92100  // segsz : Segment size ;  nbseg : Number of data segments
    93101  virtual void SetSize(size_t segsz, size_t nbseg=0)
     
    105113      mSRef->fgwp.push_back(false);
    106114    }
    107   }
     115    mSRef->swapper = NULL;
     116  }
     117
     118  //! Define the data swapper object. Should only be called if SetSize() is called
     119  void SetSwapper(DataSwapperInterface<T> & dsw)
     120  {
     121    if (mSRef == NULL) return;
     122    if (mSRef->swapper) delete mSRef->swapper; 
     123    mSRef->swapper = dsw.Clone();
     124  }
     125
    108126  //! Return the segment size data structure
    109127  virtual  size_t SegmentSize() const  { return mSRef->segsize; }
     
    165183    mSRef->nref--;
    166184    if (mSRef->nref > 0)  { mSRef = NULL; return; }
     185    if (mSRef->swapper) delete mSRef->swapper; 
    167186    delete[] mSRef->buff;
    168187    delete mSRef;
Note: See TracChangeset for help on using the changeset viewer.