Changeset 257 in Sophya for trunk/SophyaLib/BaseTools/ndatablock.cc
- Timestamp:
- Apr 23, 1999, 2:49:50 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/BaseTools/ndatablock.cc
r249 r257 76 76 // Si br==NULL : les donnees nous appartiennent 77 77 // br!=NULL : les donnees ne nous appartiennent pas (ex Blitz) 78 { 79 #ifdef DEBUG_NDATABLOCK 80 cout<<"NDataBlock::Alloc("<<n<<") mSRef="<<mSRef<<endl; 78 // Exemple: on veut connecter a un tableau de T* 79 // -- On veut que NDataBlock ne desalloue pas le tableau 80 // float *x = new float[5]; ... remplissage de x[] ...; 81 // NDataBlock A(5,x,new Bridge); 82 // delete [] x; // Il faut deleter explicitement 83 // -- On veut que NDataBlock desalloue le tableau 84 // ( Ne Pas Faire "delete [] x;" ) 85 // float *x = new float[5]; ... remplissage de x[] ...; 86 // NDataBlock A(5,x); 87 // -- Autre solution: 88 // NDataBlock A(5); A.FillFrom(5,x); 89 { 90 #ifdef DEBUG_NDATABLOCK 91 cout<<"DEBUG_NDataBlock::Alloc("<<n<<") mSRef="<<mSRef<<endl; 81 92 #endif 82 93 if(n==0) throw(SzMismatchError("NDataBlock::Alloc n==0\n")); … … 89 100 #ifdef DEBUG_NDATABLOCK 90 101 if(!data) NallocData++; NallocSRef++; 91 cout<<" NDataBlock::Alloc("<<n<<") mSRef="<<mSRef92 <<" mSRef->nref"<<mSRef->nref<<" mSRef->data "<< mSRef->data102 cout<<"DEBUG_NDataBlock::Alloc("<<n<<") mSRef="<<mSRef 103 <<" mSRef->nref"<<mSRef->nref<<" mSRef->data "<< mSRef->data 93 104 <<" Total("<<NallocData<<","<<NallocSRef<<")"<<endl; 94 105 #endif … … 100 111 { 101 112 #ifdef DEBUG_NDATABLOCK 102 cout<<"NDataBlock::Clone("<<&a<<endl;113 cout<<"DEBUG_NDataBlock::Clone("<<&a<<")"<<endl; 103 114 #endif 104 115 if(!a.mSRef) {mSz=0; mSRef=NULL;} // cas ou "a" est cree par defaut … … 112 123 { 113 124 #ifdef DEBUG_NDATABLOCK 114 cout<<" NDataBlock::Share("<<&a<<") a.mSRef="<<a.mSRef<<" mSRef="<<mSRef<<endl;125 cout<<"DEBUG_NDataBlock::Share("<<&a<<") a.mSRef="<<a.mSRef<<" mSRef="<<mSRef<<endl; 115 126 #endif 116 127 if(&a==NULL) throw(NullPtrError("NDataBlock::Share &a==NULL\n")); … … 120 131 mSz = a.mSz; mSRef = a.mSRef; mSRef->nref++; 121 132 #ifdef DEBUG_NDATABLOCK 122 cout<<" ...NDataBlock::Share("<<&a<<") mSRef="<<mSRef123 <<" mSRef->nref"<<mSRef->nref<<" mSRef->data "<< mSRef->data<<endl;133 cout<<"DEBUG_...NDataBlock::Share("<<&a<<") mSRef="<<mSRef 134 <<" mSRef->nref"<<mSRef->nref<<" mSRef->data "<< mSRef->data<<endl; 124 135 #endif 125 136 } … … 129 140 // Pour detruire les pointeurs en tenant compte des references 130 141 { 131 #ifdef DEBUG_NDATABLOCK132 cout<<"NDataBlock::Delete() mSRef="<<mSRef;133 if(mSRef) cout<<" mSRef->nref"<<mSRef->nref<<" mSRef->data"<<mSRef->data;134 cout<<endl;135 #endif142 #ifdef DEBUG_NDATABLOCK 143 cout<<"DEBUG_NDataBlock::Delete() mSRef="<<mSRef; 144 if(mSRef) cout<<" mSRef->nref"<<mSRef->nref<<" mSRef->data "<<mSRef->data; 145 cout<<endl; 146 #endif 136 147 if(mSRef==NULL) return; // cas du createur par defaut 137 148 mSRef->nref--; 138 149 if(mSRef->nref != 0) { 139 150 #ifdef DEBUG_NDATABLOCK 140 cout<<" ...NDataBlock::Delete() pas de desallocation il reste nref="<<mSRef->nref<<endl;151 cout<<"DEBUG_...NDataBlock::Delete() pas de desallocation il reste nref="<<mSRef->nref<<endl; 141 152 #endif 142 153 return; … … 144 155 #ifdef DEBUG_NDATABLOCK 145 156 if(!mSRef->bridge) NallocData--; NallocSRef--; 146 cout<<" ...NNDataBlock::Delete() desallocation complete il reste nref="<<mSRef->nref157 cout<<"DEBUG_...NNDataBlock::Delete() desallocation complete il reste nref="<<mSRef->nref 147 158 <<" Total("<<NallocData<<","<<NallocSRef<<")"<<endl; 148 159 #endif … … 162 173 } 163 174 175 template <class T> 176 void NDataBlock<T>::FillFrom(size_t n,T* data) 177 // Remplissage par un tableau de donnees 178 // - Si classe vide : creation de l'espace memoire 179 // - Si classe connectee : on ecrit selon la longueur 180 { 181 if(data==NULL) throw(NullPtrError("NDataBlock::FillFrom data==NULL\n")); 182 if(n==0) throw(ParmError("NDataBlock::FillFrom n<=0\n")); 183 if(mSRef==NULL) Alloc(n); // cas du createur par default 184 if(mSz<n) n= mSz; 185 memcpy(Data(),data,n*sizeof(T)); 186 } 187 164 188 //**** Impression 165 189 … … 174 198 if(i1>=mSz || n<=0 || !p) return; 175 199 size_t i2 = i1+n; if(i2>mSz) i2=mSz; 176 size_t im = 1; 200 size_t im = 1; bool enl; 177 201 while(i1<i2) { 202 enl = false; 178 203 cout<<" "<<(*this)(i1); i1++; 179 if(im==10) {cout<<"\n"; im=1;} else im++; 180 } 204 if(im==10) {cout<<"\n"; im=1; enl=true;} else im++; 205 } 206 if(!enl) cout<<endl; 181 207 } 182 208 … … 284 310 } 285 311 286 //**** FIN DES METHODES DE LA CLASSE287 288 312 //**** Surcharge de +,-,*,/ : NDataBlock = NDataBlock+<T>b; NDataBlock = <T>b+NDataBlock; 289 313 // ATTENTION: re-affectation imposee 290 314 291 315 template <class T> 292 NDataBlock<T> operator + (const NDataBlock<T>& a, T b) 293 { 316 NDataBlock<T>& Add(T b) 317 // Pour A+b 318 { 319 NDataBlock<T>& a = *this; 294 320 NDataBlock<T> result(a,false); result.SetTemp(true); 295 321 return (result += b); … … 297 323 298 324 template <class T> 299 NDataBlock<T> operator + (T b, const NDataBlock<T>& a) 300 { 301 NDataBlock<T> result(a,false); result.SetTemp(true); 302 return (result += b); 303 } 304 305 template <class T> 306 NDataBlock<T> operator - (const NDataBlock<T>& a, T b) 307 { 325 NDataBlock<T>& Sub(T b) 326 // Pour A-b 327 { 328 NDataBlock<T>& a = *this; 308 329 NDataBlock<T> result(a,false); result.SetTemp(true); 309 330 return (result -= b); … … 311 332 312 333 template <class T> 313 NDataBlock<T> operator - (T b, const NDataBlock<T>& a) 314 { 334 NDataBlock<T>& SubInv(T b) 335 // Pour b-A 336 { 337 NDataBlock<T>& a = *this; 315 338 NDataBlock<T> result(a,false); result.SetTemp(true); 316 339 T *p=result.Begin(), *pe=result.End(), *pa=a.Begin(); … … 320 343 321 344 template <class T> 322 NDataBlock<T> operator * (const NDataBlock<T>& a, T b) 323 { 345 NDataBlock<T>& Mult(T b) 346 // Pour A*b 347 { 348 NDataBlock<T>& a = *this; 324 349 NDataBlock<T> result(a,false); result.SetTemp(true); 325 350 return (result *= b); … … 327 352 328 353 template <class T> 329 NDataBlock<T> operator * (T b, const NDataBlock<T>& a) 330 { 331 NDataBlock<T> result(a,false); result.SetTemp(true); 332 return (result *= b); 333 } 334 335 template <class T> 336 NDataBlock<T> operator / (const NDataBlock<T>& a, T b) 337 { 354 NDataBlock<T>& Div(T b) 355 // Pour A/b 356 { 357 NDataBlock<T>& a = *this; 338 358 NDataBlock<T> result(a,false); result.SetTemp(true); 339 359 return (result /= b); … … 341 361 342 362 template <class T> 343 NDataBlock<T> operator / (T b, const NDataBlock<T>& a) 344 { 363 NDataBlock<T>& DivInv(T b) 364 // Pour b/A 365 { 366 NDataBlock<T>& a = *this; 345 367 NDataBlock<T> result(a,false); result.SetTemp(true); 346 368 T *p=result.Begin(), *pe=result.End(), *pa=a.Begin(); … … 352 374 353 375 template <class T> 354 NDataBlock<T> operator + (const NDataBlock<T>& a, const NDataBlock<T>& b) 355 { 376 NDataBlock<T>& Add(const NDataBlock<T>& b) 377 // Pour A+B 378 { 379 NDataBlock<T>& a = *this; 356 380 if(a.mSz!=b.mSz) throw(SzMismatchError("NDataBlock operator C=A+B size mismatch/null\n")); 357 381 if(b.IsTemp()) { … … 365 389 366 390 template <class T> 367 NDataBlock<T> operator * (const NDataBlock<T>& a, const NDataBlock<T>& b) 368 { 391 NDataBlock<T>& Mul(const NDataBlock<T>& b) 392 // Pour A*B 393 { 394 NDataBlock<T>& a = *this; 369 395 if(a.mSz!=b.mSz) throw(SzMismatchError("NDataBlock operator C=A*B size mismatch/null\n")); 370 396 if(b.IsTemp()) { … … 378 404 379 405 template <class T> 380 NDataBlock<T> operator - (const NDataBlock<T>& a, const NDataBlock<T>& b) 381 { 406 NDataBlock<T>& Sub(const NDataBlock<T>& b) 407 // Pour A-B 408 { 409 NDataBlock<T>& a = *this; 382 410 if(a.mSz!=b.mSz) throw(SzMismatchError("NDataBlock operator C=A-B size mismatch/null\n")); 383 411 if(b.IsTemp()) { … … 393 421 394 422 template <class T> 395 NDataBlock<T> operator / (const NDataBlock<T>& a, const NDataBlock<T>& b) 396 { 423 NDataBlock<T>& Div(const NDataBlock<T>& b) 424 // Pour A/B 425 { 426 NDataBlock<T>& a = *this; 397 427 if(a.mSz!=b.mSz) throw(SzMismatchError("NDataBlock operator C=A/B size mismatch/null\n")); 398 428 if(b.IsTemp()) { … … 406 436 } 407 437 } 408 409 410 438 411 439 … … 421 449 #pragma define_template NDataBlock<r_4> 422 450 #pragma define_template NDataBlock<r_8> 423 #pragma define_template NDataBlock< complex<float> > 424 #pragma define_template NDataBlock< complex<double> > 451 // pas de definitions de cout pour les complex ?? 452 //#pragma define_template NDataBlock< complex<float> > 453 //#pragma define_template NDataBlock< complex<double> > 425 454 #endif 426 455 … … 454 483 template class NDataBlock< complex<double> >; 455 484 #endif 456 457 #ifdef __CXX_PRAGMA_TEMPLATES__458 #pragma define_template (operator+) <float,float> mais comment on fait ca! CMV_A_FAIRE459 #endif460 461 #ifdef __GNU_TEMPLATES__462 template NDataBlock<T> operator + (const NDataBlock<T>&, const NDataBlock<T>&); mais comment on fait ca! CMV_A_FAIRE463 #endif464 465 #if defined(__ANSI_TEMPLATES__)466 #endif
Note:
See TracChangeset
for help on using the changeset viewer.