Changeset 275 in Sophya for trunk/SophyaLib
- Timestamp:
- Apr 27, 1999, 7:51:47 PM (26 years ago)
- Location:
- trunk/SophyaLib/BaseTools
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/BaseTools/ndatablock.cc
r273 r275 13 13 using namespace PlanckDPC; 14 14 15 // define DEBUG_NDATABLOCK15 // define DEBUG_NDATABLOCK 16 16 17 17 #ifdef DEBUG_NDATABLOCK … … 24 24 // - gestion du partage de reference 25 25 26 //////////////////////////////////////////////////////////////// 26 27 //************ Createur, Destructeur, gestion des donnees 27 28 … … 41 42 NDataBlock<T>::NDataBlock(size_t n, T* data, Bridge* br) 42 43 // Createur d'une structure de "n" donnees, avec donnees preallouees 44 // (Voir explications dans Alloc()) 43 45 : mSz(0), mSRef(NULL), mIsTemp(false) 44 46 { … … 101 103 } 102 104 105 //////////////////////////////////////////////////////////////// 106 103 107 template <class T> 104 108 void NDataBlock<T>::SetTemp(bool temp) const … … 116 120 void NDataBlock<T>::Alloc(size_t n,T* data,Bridge* br) 117 121 // Allocation d'un NOUVEL espace de stoquage 118 // Si data==NULL : allocation de l'espace memoire 122 // Si data==NULL : allocation de l'espace memoire (vide) 119 123 // data!=NULL : partage des donnees avec l'adresse data 120 124 // Si br==NULL : les donnees nous appartiennent 121 // br!=NULL : les donnees ne nous appartiennent pas (ex Blitz) 125 // br!=NULL : les donnees ne nous appartiennent pas (ex: Blitz) 126 // 122 127 // Exemple: on veut connecter a un tableau de T* 123 // -- On veut que NDataBlock ne desalloue pas le tableau 124 // float *x = new float[5]; ... remplissage de x[] ...; 125 // NDataBlock A(5,x,new Bridge); 126 // delete [] x; // Il faut deleter explicitement 127 // -- On veut que NDataBlock desalloue le tableau 128 // ( Ne Pas Faire "delete [] x;" ) 129 // float *x = new float[5]; ... remplissage de x[] ...; 130 // NDataBlock A(5,x); 131 // -- Autre solution: 132 // NDataBlock A(5); A.FillFrom(5,x); 128 // 1- On veut que NDataBlock NE DESALLOUE PAS le tableau "data" 129 // a- Premiere solution 130 // float *x = new float[5]; ... remplissage de x[] ...; 131 // NDataBlock A(5,x,new Bridge); 132 // delete [] x; // Il faut deleter explicitement 133 // (et Bridge est delete par le destructeur de la classe) 134 // b- Autre solution: 135 // NDataBlock A(5); A.FillFrom(5,x); 136 // delete [] x; // Il faut deleter explicitement 137 // 2- On veut que NDataBlock desalloue le tableau 138 // float *x = new float[5]; ... remplissage de x[] ...; 139 // NDataBlock A(5,x); 140 // (Ne Pas Faire "delete [] x;") 133 141 { 134 142 #ifdef DEBUG_NDATABLOCK … … 138 146 #endif 139 147 148 if(br && !data) 149 throw(NullPtrError("NDataBlock::Alloc br!=NULL && data==NULL\n")); 140 150 if(n==0) throw(SzMismatchError("NDataBlock::Alloc n==0\n")); 141 151 if(mSRef) Delete(); … … 147 157 148 158 #ifdef DEBUG_NDATABLOCK 149 if(!data) NallocData++; NallocSRef++; 159 // Meme dans le cas data!=0 et br==0 (connexion d'un tableau 160 // avec destruction geree par ~NDataBlock (cas 2-) on compte 161 // comme si on avait fait une allocation du tableau (ce qui a ete 162 // fait au niveau du dessus!). 163 if(!br) NallocData++; NallocSRef++; 150 164 cout<<"...DEBUG_NDataBlock::Alloc mSz="<<mSz<<" mSRef="<<mSRef 151 165 <<" mSRef->nref="<<mSRef->nref<<" mSRef->data="<< mSRef->data … … 158 172 void NDataBlock<T>::Clone(const NDataBlock<T>& a) 159 173 // Clone (copie de donnee) a partir de "a" 160 { 161 #ifdef DEBUG_NDATABLOCK 162 cout<<"DEBUG_NDataBlock::Clone("<<this<<","<<&a<<") a.(mSz=" 163 <<a.mSz<<" mSRef="<<a.mSRef<<" IsTemp="<<a.IsTemp() 164 <<"), mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 165 #endif 174 // sauf si "a" est une classe temporaire (dans ce cas share!) 175 { 176 #ifdef DEBUG_NDATABLOCK 177 cout<<"DEBUG_NDataBlock::Clone("<<this<<","<<&a<<") a.(mSz=" 178 <<a.mSz<<" mSRef="<<a.mSRef<<" IsTemp="<<a.IsTemp() 179 <<"), mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 180 #endif 181 166 182 if(!a.mSRef) {mSz=0; mSRef=NULL;} // cas ou "a" est cree par defaut 167 183 else if(a.IsTemp()) Share(a); … … 212 228 #ifdef DEBUG_NDATABLOCK 213 229 cout<<"...DEBUG_NDataBlock::Delete() pas de desallocation il reste nref=" 214 <<mSRef->nref<< endl;230 <<mSRef->nref<<" Total("<<NallocData<<","<<NallocSRef<<")"<<endl; 215 231 #endif 216 232 … … 232 248 } 233 249 250 //////////////////////////////////////////////////////////////// 251 234 252 template <class T> 235 253 void NDataBlock<T>::Reset(T v) … … 243 261 244 262 template <class T> 245 void NDataBlock<T>::ReSize(size_t n )246 // Re-dimension, dans ce cas re-allocation de la place247 { 248 // Pas de realloc, si pas de changement de taille ? 249 if (n == mSz) return; // $CHECK$ A verifier , Reza 26/04/99263 void NDataBlock<T>::ReSize(size_t n,bool force_alloc) 264 // Re-dimension, avec re-allocation de la place si n != mSz 265 // Si n==mSz, la place n'est re-allouee que si force_alloc=true 266 { 267 if(!force_alloc && n == mSz) return; 250 268 Alloc(n); 251 269 } … … 264 282 } 265 283 284 //////////////////////////////////////////////////////////////// 266 285 //**** Impression 267 286 … … 287 306 } 288 307 308 //////////////////////////////////////////////////////////////// 289 309 //**** Surcharge de = : NDataBlock=NDataBlock; NDataBlock=<T> b; 290 310 … … 324 344 return *this; 325 345 } 346 347 //////////////////////////////////////////////////////////////// 326 348 327 349 template <class T> … … 349 371 } 350 372 373 //////////////////////////////////////////////////////////////// 351 374 //**** Surcharge de +=,-=,*=,/= (INPLACE): NDataBlock += <T> b; 352 375 … … 388 411 } 389 412 413 414 //////////////////////////////////////////////////////////////// 390 415 //**** Surcharge de +=,-=,*=,/= (INPLACE): NDataBlock += NDataBlock; 391 416 … … 434 459 } 435 460 436 //**** Surcharge de +,-,*,/ : NDataBlock = NDataBlock+<T>b; NDataBlock = <T>b+NDataBlock; 461 462 //////////////////////////////////////////////////////////////// 463 //**** Surcharge de +,-,*,/ : NDataBlock = NDataBlock+<T>b; 464 // NDataBlock = <T>b+NDataBlock; 437 465 // ATTENTION: re-affectation imposee 438 466 … … 492 520 } 493 521 522 523 //////////////////////////////////////////////////////////////// 494 524 //**** Surcharge de +,-,*,/ : NDataBlock = NDataBlock+NDataBlock; 495 525 … … 566 596 } 567 597 568 598 //////////////////////////////////////////////////////////////// 569 599 // ------------------------------------------------------------------------- 570 600 // Les objets delegues pour la gestion de persistance … … 644 674 } 645 675 646 676 /////////////////////////////////////////////////////////////// 647 677 #ifdef __CXX_PRAGMA_TEMPLATES__ 648 678 #pragma define_template NDataBlock<uint_1> … … 658 688 #pragma define_template NDataBlock< complex<float> > 659 689 #pragma define_template NDataBlock< complex<double> > 660 661 690 // Instances des delegues FileIO (PPersist) 662 691 #pragma define_template FIO_NDataBlock<uint_1> … … 672 701 #pragma define_template FIO_NDataBlock< complex<float> > 673 702 #pragma define_template FIO_NDataBlock< complex<double> > 674 675 703 #endif 676 704 … … 689 717 template class NDataBlock< complex<float> >; 690 718 template class NDataBlock< complex<double> >; 691 692 719 // Instances des delegues FileIO (PPersist) 693 720 template class FIO_NDataBlock<uint_1>; -
trunk/SophyaLib/BaseTools/ndatablock.h
r269 r275 42 42 void Clone(const NDataBlock<T>& a); 43 43 void Reset(T v=0); 44 void ReSize(size_t n );44 void ReSize(size_t n,bool force_alloc=false); 45 45 void FillFrom(size_t n,T* data); 46 46
Note:
See TracChangeset
for help on using the changeset viewer.