Changeset 268 in Sophya
- Timestamp:
- Apr 26, 1999, 5:32:23 PM (26 years ago)
- Location:
- trunk/SophyaLib/BaseTools
- Files:
-
- 2 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/BaseTools/machdefs.h
r245 r268 188 188 /***********************************************************************/ 189 189 190 /* Some features will be *required* for Planck. Which ones ? */190 /* Some features will be *required* for Planck. Which ones ? */ 191 191 192 /* ANSI_TEMPLATES : use ANSI syntax for explicit templates */ 193 /* GNUG_TEMPLATES : use GNU syntax for explicit templates */ 194 /* PRAGMA_TEMPLATES : use pragma template, a la cxx */ 195 /* COMPILER_EXCEPTIONS : knows about exceptions --- required ? */ 196 /* STREAMPOS_IS_CLASS : streampos is a real class */ 197 /* ITER_TAG : use iter_tag for iterator qualifiers in STL */ 198 /* NO_STRSTREAM : does not have strstream */ 199 /* HAS_EXPLICIT : knows about explicit keyword - constructors */ 200 /* HAS_IOS_BIN */ 201 /* HAS_IOS_NOCREATE */ 202 /* HAS_VEC_NEW : operator new[] */ 203 /* ANSI_IO : rdbuf()->pubseekoff rather than seekg */ 204 /* HAS_STR_NPOS : has string::npos and not a global NPOS */ 192 /* ANSI_TEMPLATES : use ANSI syntax for explicit templates */ 193 /* GNUG_TEMPLATES : use GNU syntax for explicit templates */ 194 /* PRAGMA_TEMPLATES : use pragma template, a la cxx */ 195 /* COMPILER_EXCEPTIONS : knows about exceptions --- required ? */ 196 /* STREAMPOS_IS_CLASS : streampos is a real class */ 197 /* ITER_TAG : use iter_tag for iterator qualifiers in STL */ 198 /* NO_STRSTREAM : does not have strstream */ 199 /* HAS_EXPLICIT : knows about explicit keyword - constructors */ 200 /* HAS_IOS_BIN */ 201 /* HAS_IOS_NOCREATE */ 202 /* HAS_VEC_NEW : operator new[] */ 203 /* ANSI_IO : rdbuf()->pubseekoff rather than seekg */ 204 /* HAS_STR_NPOS : has string::npos and not a global NPOS */ 205 /* NO_IOS_COMPLEX : does not have operator << defined for complex */ 205 206 206 207 -
trunk/SophyaLib/BaseTools/ndatablock.cc
r267 r268 1 // Gestion de block de donnees avec partage de references 2 // C.Magneville 04/99 3 // LAL (Orsay) / IN2P3-CNRS DAPNIA/SPP (Saclay) / CEA 1 4 #include "machdefs.h" 2 5 #include <stdio.h> … … 7 10 #include "ndatablock.h" 8 11 9 #define DEBUG_NDATABLOCK 12 using namespace PlanckDPC; 13 14 //define DEBUG_NDATABLOCK 10 15 11 16 #ifdef DEBUG_NDATABLOCK … … 25 30 : mSz(0), mSRef(NULL), mIsTemp(false) 26 31 { 32 #ifdef DEBUG_NDATABLOCK 33 cout<<"DEBUG_NDataBlock::NDataBlock("<<this<<",n="<<n<<")"<<endl; 34 #endif 35 27 36 Alloc(n); 28 37 } … … 33 42 : mSz(0), mSRef(NULL), mIsTemp(false) 34 43 { 44 #ifdef DEBUG_NDATABLOCK 45 cout<<"DEBUG_NDataBlock::NDataBlock("<<this 46 <<",data="<<data<<",br="<<br<<")"<<endl; 47 #endif 48 35 49 Alloc(n,data,br); 36 50 } … … 41 55 : mSz(0), mSRef(NULL), mIsTemp(false) 42 56 { 43 } 44 45 template <class T> 46 NDataBlock<T>::NDataBlock(NDataBlock<T>& a) 57 #ifdef DEBUG_NDATABLOCK 58 cout<<"DEBUG_NDataBlock::NDataBlock("<<this<<") default"<<endl; 59 #endif 60 } 61 62 template <class T> 63 NDataBlock<T>::NDataBlock(const NDataBlock<T>& a) 47 64 // Createur par copie 48 65 // ATTENTION: partage les donnees avec "a" … … 51 68 : mSz(0), mSRef(NULL), mIsTemp(false) 52 69 { 70 #ifdef DEBUG_NDATABLOCK 71 cout<<"DEBUG_NDataBlock::NDataBlock("<<this<<",&a="<<&a<<") a.(mSz=" 72 <<a.mSz<<" mSRef="<<a.mSRef<<" IsTemp="<<a.IsTemp()<<")"<<endl; 73 #endif 74 53 75 Share(a); 54 76 } 55 77 56 78 template <class T> 57 NDataBlock<T>::NDataBlock( NDataBlock<T>& a,bool share)79 NDataBlock<T>::NDataBlock(const NDataBlock<T>& a,bool share) 58 80 // Createur avec choix de partager ou non 59 81 : mSz(0), mSRef(NULL), mIsTemp(false) 60 82 { 83 #ifdef DEBUG_NDATABLOCK 84 cout<<"DEBUG_NDataBlock::NDataBlock("<<this<<",&a="<<&a<<",sh=<<"<<share<<")" 85 <<" a.(mSz="<<a.mSz<<" mSRef="<<a.mSRef<<" IsTemp="<<a.IsTemp()<<")"<<endl; 86 #endif 87 61 88 if(share) Share(a); else Clone(a); 62 89 } … … 66 93 // Destructeur 67 94 { 95 #ifdef DEBUG_NDATABLOCK 96 cout<<"DEBUG_NDataBlock::~NDataBlock("<<this<<")"<<endl; 97 #endif 98 68 99 Delete(); 69 100 } 70 101 71 102 template <class T> 72 void NDataBlock<T>::SetTemp(bool temp) 103 void NDataBlock<T>::SetTemp(bool temp) const 73 104 // Set temporary 74 105 { 75 106 mIsTemp=temp; 76 #ifdef DEBUG_NDATABLOCK 77 cout<<"DEBUG_NDataBlock::SetTemp("<<this<<","<<temp 78 <<"), mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 79 #endif 107 108 #ifdef DEBUG_NDATABLOCK 109 cout<<"DEBUG_NDataBlock::SetTemp("<<this<<","<<temp 110 <<"), mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 111 #endif 80 112 } 81 113 … … 99 131 // NDataBlock A(5); A.FillFrom(5,x); 100 132 { 101 #ifdef DEBUG_NDATABLOCK 102 cout<<"DEBUG_NDataBlock::Alloc("<<this<<"," 103 <<n<<","<<data<<","<<br<<") mSz="<<mSz 104 <<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 105 #endif 133 #ifdef DEBUG_NDATABLOCK 134 cout<<"DEBUG_NDataBlock::Alloc("<<this<<"," 135 <<n<<","<<data<<","<<br<<") mSz="<<mSz 136 <<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 137 #endif 138 106 139 if(n==0) throw(SzMismatchError("NDataBlock::Alloc n==0\n")); 107 140 if(mSRef) Delete(); … … 111 144 if(data) mSRef->data = data; else mSRef->data = new T[n]; 112 145 mSRef->bridge = br; 113 #ifdef DEBUG_NDATABLOCK 114 if(!data) NallocData++; NallocSRef++; 115 cout<<"...DEBUG_NDataBlock::Alloc mSz="<<mSz<<" mSRef="<<mSRef 116 <<" mSRef->nref="<<mSRef->nref<<" mSRef->data="<< mSRef->data 117 <<" mSRef->bridge="<<mSRef->bridge<<" IsTemp="<<mIsTemp 118 <<" Total("<<NallocData<<","<<NallocSRef<<")"<<endl; 119 #endif 120 } 121 122 template <class T> 123 void NDataBlock<T>::Clone(NDataBlock<T>& a) 146 147 #ifdef DEBUG_NDATABLOCK 148 if(!data) NallocData++; NallocSRef++; 149 cout<<"...DEBUG_NDataBlock::Alloc mSz="<<mSz<<" mSRef="<<mSRef 150 <<" mSRef->nref="<<mSRef->nref<<" mSRef->data="<< mSRef->data 151 <<" mSRef->bridge="<<mSRef->bridge<<" IsTemp="<<mIsTemp 152 <<" Total("<<NallocData<<","<<NallocSRef<<")"<<endl; 153 #endif 154 } 155 156 template <class T> 157 void NDataBlock<T>::Clone(const NDataBlock<T>& a) 124 158 // Clone (copie de donnee) a partir de "a" 125 159 { … … 135 169 136 170 template <class T> 137 void NDataBlock<T>::Share( NDataBlock<T>& a)171 void NDataBlock<T>::Share(const NDataBlock<T>& a) 138 172 // Partage des donnees avec "a" 139 173 { 140 #ifdef DEBUG_NDATABLOCK 141 cout<<"DEBUG_NDataBlock::Share("<<this<<","<<&a<<")"; 142 if(&a!=NULL) cout<<" a.(mSz="<<a.mSz<<" mSRef="<<a.mSRef 143 <<" IsTemp="<<a.IsTemp()<<")"; 144 cout<<", mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 145 #endif 174 #ifdef DEBUG_NDATABLOCK 175 cout<<"DEBUG_NDataBlock::Share("<<this<<","<<&a<<")"; 176 if(&a!=NULL) cout<<" a.(mSz="<<a.mSz<<" mSRef="<<a.mSRef 177 <<" IsTemp="<<a.IsTemp()<<")"; 178 cout<<", mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 179 #endif 180 146 181 if(&a==NULL) throw(NullPtrError("NDataBlock::Share &a==NULL\n")); 147 182 // on ne peut partager si "a" pas alloue … … 149 184 if(mSRef) Delete(); 150 185 mSz = a.mSz; mSRef = a.mSRef; mSRef->nref++; 151 #ifdef DEBUG_NDATABLOCK 152 cout<<"...DEBUG_NDataBlock::Share mSz="<<mSz<<" mSRef="<<mSRef 153 <<" mSRef->nref="<<mSRef->nref<<" mSRef->data="<< mSRef->data 154 <<" mSRef->bridge="<<mSRef->bridge<<" IsTemp="<<mIsTemp<<endl; 155 #endif 186 187 #ifdef DEBUG_NDATABLOCK 188 cout<<"...DEBUG_NDataBlock::Share mSz="<<mSz<<" mSRef="<<mSRef 189 <<" mSRef->nref="<<mSRef->nref<<" mSRef->data="<< mSRef->data 190 <<" mSRef->bridge="<<mSRef->bridge<<" IsTemp="<<mIsTemp<<endl; 191 #endif 156 192 } 157 193 … … 160 196 // Pour detruire les pointeurs en tenant compte des references 161 197 { 162 #ifdef DEBUG_NDATABLOCK 163 cout<<"DEBUG_NDataBlock::Delete("<<this<<") mSz="<<mSz 164 <<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp; 165 if(mSRef) 166 cout<<" mSRef->nref="<<mSRef->nref<<" mSRef->data=" 167 <<mSRef->data<<" mSRef->bridge="<<mSRef->bridge; 168 cout<<endl; 169 #endif 198 #ifdef DEBUG_NDATABLOCK 199 cout<<"DEBUG_NDataBlock::Delete("<<this<<") mSz="<<mSz 200 <<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp; 201 if(mSRef) 202 cout<<" mSRef->nref="<<mSRef->nref<<" mSRef->data=" 203 <<mSRef->data<<" mSRef->bridge="<<mSRef->bridge; 204 cout<<endl; 205 #endif 206 170 207 if(mSRef==NULL) return; // cas du createur par defaut 171 208 mSRef->nref--; 172 209 if(mSRef->nref != 0) { 173 #ifdef DEBUG_NDATABLOCK 174 cout<<"...DEBUG_NDataBlock::Delete() pas de desallocation il reste nref=" 175 <<mSRef->nref<<endl; 176 #endif 210 211 #ifdef DEBUG_NDATABLOCK 212 cout<<"...DEBUG_NDataBlock::Delete() pas de desallocation il reste nref=" 213 <<mSRef->nref<<endl; 214 #endif 215 177 216 return; 178 217 } 179 #ifdef DEBUG_NDATABLOCK 180 if(!mSRef->bridge) NallocData--; NallocSRef--; 181 cout<<"...DEBUG_NDataBlock::Delete() desallocation complete il reste nref=" 182 <<mSRef->nref<<" Total("<<NallocData<<","<<NallocSRef<<")"<<endl; 183 #endif 218 219 #ifdef DEBUG_NDATABLOCK 220 if(!mSRef->bridge) NallocData--; NallocSRef--; 221 cout<<"...DEBUG_NDataBlock::Delete() desallocation complete il reste nref=" 222 <<mSRef->nref<<" Total("<<NallocData<<","<<NallocSRef<<")"<<endl; 223 #endif 224 184 225 // Si il y a un Bridge les donnees ne n'appartiennent pas, on detruit le Bridge 185 226 if(mSRef->bridge) delete mSRef->bridge; … … 223 264 224 265 template <class T> 225 void NDataBlock<T>::Print( size_t i1,size_t n)266 void NDataBlock<T>::Print(ostream& os,size_t i1,size_t n) const 226 267 // Impression de n elements a partir de i1 227 268 { … … 229 270 T* p = NULL; Bridge* br = NULL; 230 271 if(mSRef) {nr = mSRef->nref; p = mSRef->data; br = mSRef->bridge;} 231 cout<<"NDataBlock::Print("<<this<<",Sz="<<mSz<<",IsTemp="<<mIsTemp<<")\n"232 233 272 os<<"NDataBlock::Print("<<this<<",Sz="<<mSz<<",IsTemp="<<mIsTemp<<")\n" 273 <<" mSRef="<<mSRef<<"(nref="<<nr<<",data="<<p 274 <<",bridge="<<br<<")"<<endl; 234 275 if(i1>=mSz || n<=0 || !p) return; 235 276 size_t i2 = i1+n; if(i2>mSz) i2=mSz; … … 237 278 while(i1<i2) { 238 279 enl = false; 239 cout<<" "<<(*this)(i1); i1++;240 if(im== 10) {cout<<"\n"; im=1; enl=true;} else im++;241 } 242 if(!enl) cout<<endl;280 os<<" "<<(*this)(i1); i1++; 281 if(im==8) {os<<"\n"; im=1; enl=true;} else im++; 282 } 283 if(!enl) os<<endl; 243 284 } 244 285 … … 246 287 247 288 template <class T> 248 NDataBlock<T>& NDataBlock<T>::operator = ( NDataBlock<T>& a)289 NDataBlock<T>& NDataBlock<T>::operator = (const NDataBlock<T>& a) 249 290 // surcharge avec partage des donnees 250 291 // Ecriture: NDataBlock a; a = b; 251 292 // NDataBlock a(10); a = b; (a est re-affecte) 252 293 { 294 #ifdef DEBUG_NDATABLOCK 295 cout<<"DEBUG_NDataBlock::operator=("<<this<<","<<&a<<") a.(mSz=" 296 <<a.mSz<<" mSRef="<<a.mSRef<<" IsTemp="<<a.IsTemp() 297 <<"), mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 298 #endif 299 253 300 if(this == &a) return *this; 254 301 if(a.mSz!=mSz) … … 264 311 // NDataBlock a; a = v; ou bien NDataBlock a(10); a = v; 265 312 { 313 #ifdef DEBUG_NDATABLOCK 314 cout<<"DEBUG_NDataBlock::operator=("<<this<<","<<v<<")" 315 <<" mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 316 #endif 317 266 318 if(mSz==0) throw(SzMismatchError("NDataBlock::operator=v null size\n")); 267 319 T *p=Begin(), *pe=End(); 268 320 while (p<pe) *p++ = v; 269 321 return *this; 322 } 323 324 template <class T> 325 T NDataBlock<T>::Sum(size_t i1,size_t n) const 326 // Somme des elements de i1 a i1+n-1 327 { 328 if(i1>=mSz) return 0; 329 if(n>mSz) n = mSz; if(n==0) n = mSz-i1; 330 T const *p=Begin()+i1, *pe=p+n; 331 T val = 0; 332 while (p<pe) val += *p++; 333 return val; 334 } 335 336 template <class T> 337 T NDataBlock<T>::Product(size_t i1,size_t n) const 338 // Produit des elements de i1 a i1+n-1 339 { 340 if(i1>=mSz) return 0; 341 if(n>mSz) n = mSz; if(n==0) n = mSz-i1; 342 T const *p=Begin()+i1, *pe=p+n; 343 T val = 0; 344 while (p<pe) val *= *p++; 345 return val; 270 346 } 271 347 … … 312 388 313 389 template <class T> 314 NDataBlock<T>& NDataBlock<T>::operator += ( NDataBlock<T>& a)390 NDataBlock<T>& NDataBlock<T>::operator += (const NDataBlock<T>& a) 315 391 { 316 392 if(mSz==0 || mSz!=a.mSz) 317 393 throw(SzMismatchError("NDataBlock::operator+=A size mismatch/null")); 318 T *p=Begin(), *pe=End(), *pa=a.Begin(); 394 T *p=Begin(), *pe=End(); 395 T const * pa=a.Begin(); 319 396 while (p<pe) *p++ += *pa++; // ca marche meme si *this=a 320 397 return *this; … … 322 399 323 400 template <class T> 324 NDataBlock<T>& NDataBlock<T>::operator -= ( NDataBlock<T>& a)401 NDataBlock<T>& NDataBlock<T>::operator -= (const NDataBlock<T>& a) 325 402 { 326 403 if(mSz==0 || mSz!=a.mSz) 327 404 throw(SzMismatchError("NDataBlock::operator-=A size mismatch/null")); 328 T *p=Begin(), *pe=End(), *pa=a.Begin(); 405 T *p=Begin(), *pe=End(); 406 T const *pa=a.Begin(); 329 407 while (p<pe) *p++ -= *pa++; // ca marche meme si *this=a 330 408 return *this; … … 332 410 333 411 template <class T> 334 NDataBlock<T>& NDataBlock<T>::operator *= ( NDataBlock<T>& a)412 NDataBlock<T>& NDataBlock<T>::operator *= (const NDataBlock<T>& a) 335 413 { 336 414 if(mSz==0 || mSz!=a.mSz) 337 415 throw(SzMismatchError("NDataBlock::operator*=A size mismatch/null")); 338 T *p=Begin(), *pe=End(), *pa=a.Begin(); 416 T *p=Begin(), *pe=End(); 417 T const *pa=a.Begin(); 339 418 while (p<pe) *p++ *= *pa++; // ca marche meme si *this=a 340 419 return *this; … … 342 421 343 422 template <class T> 344 NDataBlock<T>& NDataBlock<T>::operator /= ( NDataBlock<T>& a)423 NDataBlock<T>& NDataBlock<T>::operator /= (const NDataBlock<T>& a) 345 424 { 346 425 if(mSz==0 || mSz!=a.mSz) 347 426 throw(SzMismatchError("NDataBlock::operator/=A size mismatch/null")); 348 T *p=Begin(), *pe=End(), *pa=a.Begin(); 427 T *p=Begin(), *pe=End(); 428 T const *pa=a.Begin(); 349 429 while (p<pe) *p++ /= *pa++; 350 430 return *this; … … 355 435 356 436 template <class T> 357 NDataBlock<T> NDataBlock<T>::Add(T b) 437 NDataBlock<T> NDataBlock<T>::Add(T b) const 358 438 // Pour A+b 359 439 { 360 NDataBlock<T> & a = *this;361 NDataBlock<T> result(a,false); result.SetTemp(true);362 return result += b;363 } 364 365 template <class T> 366 NDataBlock<T> NDataBlock<T>::Sub(T b) 440 NDataBlock<T> result(*this,false); result.SetTemp(true); 441 result += b; 442 return result; 443 } 444 445 template <class T> 446 NDataBlock<T> NDataBlock<T>::Sub(T b) const 367 447 // Pour A-b 368 448 { 369 NDataBlock<T>& a = *this; 370 NDataBlock<T> result(a,false); result.SetTemp(true); 449 NDataBlock<T> result(*this,false); result.SetTemp(true); 371 450 return result -= b; 372 451 } 373 452 374 453 template <class T> 375 NDataBlock<T> NDataBlock<T>::SubInv(T b) 454 NDataBlock<T> NDataBlock<T>::SubInv(T b) const 376 455 // Pour b-A 377 456 { 378 NDataBlock<T> & a = *this;379 NDataBlock<T> result(a,false); result.SetTemp(true);380 T *p=result.Begin(), *pe=result.End(), *pa=a.Begin();457 NDataBlock<T> result(*this,false); result.SetTemp(true); 458 T *p=result.Begin(), *pe=result.End(); 459 T const *pa=this->Begin(); 381 460 while(p<pe) {*p++ = b - *pa++;} 382 461 return result; … … 384 463 385 464 template <class T> 386 NDataBlock<T> NDataBlock<T>::Mul(T b) 465 NDataBlock<T> NDataBlock<T>::Mul(T b) const 387 466 // Pour A*b 388 467 { 389 NDataBlock<T>& a = *this; 390 NDataBlock<T> result(a,false); result.SetTemp(true); 468 NDataBlock<T> result(*this,false); result.SetTemp(true); 391 469 return result *= b; 392 470 } 393 471 394 472 template <class T> 395 NDataBlock<T> NDataBlock<T>::Div(T b) 473 NDataBlock<T> NDataBlock<T>::Div(T b) const 396 474 // Pour A/b 397 475 { 398 NDataBlock<T>& a = *this; 399 NDataBlock<T> result(a,false); result.SetTemp(true); 476 NDataBlock<T> result(*this,false); result.SetTemp(true); 400 477 return result /= b; 401 478 } 402 479 403 480 template <class T> 404 NDataBlock<T> NDataBlock<T>::DivInv(T b) 481 NDataBlock<T> NDataBlock<T>::DivInv(T b) const 405 482 // Pour b/A 406 483 { 407 NDataBlock<T> & a = *this;408 NDataBlock<T> result(a,false); result.SetTemp(true);409 T *p=result.Begin(), *pe=result.End(), *pa=a.Begin();484 NDataBlock<T> result(*this,false); result.SetTemp(true); 485 T *p=result.Begin(), *pe=result.End(); 486 T const *pa = this->Begin(); 410 487 while(p<pe) {*p++ = b / *pa++;} 411 488 return result; … … 415 492 416 493 template <class T> 417 NDataBlock<T> NDataBlock<T>::Add( NDataBlock<T>& b)494 NDataBlock<T> NDataBlock<T>::Add(const NDataBlock<T>& b) const 418 495 // Pour A+B 419 496 { 420 NDataBlock<T>& a = *this; 421 if(a.mSz!=b.mSz) 497 if(this->mSz!=b.mSz) 422 498 throw(SzMismatchError("NDataBlock operator C=A+B size mismatch/null\n")); 499 NDataBlock<T> result; result.SetTemp(true); 423 500 if(b.IsTemp()) { 424 NDataBlock<T> result(b,true); result.SetTemp(true);425 re turn result += a;501 result.Share(b); 502 result += *this; 426 503 } else { 427 NDataBlock<T> result(a,false); result.SetTemp(true); 428 return result += b; 429 } 430 } 431 432 template <class T> 433 NDataBlock<T> NDataBlock<T>::Mul(NDataBlock<T>& b) 504 result.Clone(*this); 505 result += b; 506 } 507 return result; 508 } 509 510 template <class T> 511 NDataBlock<T> NDataBlock<T>::Mul(const NDataBlock<T>& b) const 434 512 // Pour A*B 435 513 { 436 NDataBlock<T>& a = *this; 437 if(a.mSz!=b.mSz) 514 if(this->mSz!=b.mSz) 438 515 throw(SzMismatchError("NDataBlock operator C=A*B size mismatch/null\n")); 516 NDataBlock<T> result; result.SetTemp(true); 439 517 if(b.IsTemp()) { 440 NDataBlock<T> result(b,true); result.SetTemp(true);441 re turn result *= a;518 result.Share(b); 519 result *= *this; 442 520 } else { 443 NDataBlock<T> result(a,false); result.SetTemp(true); 444 return result *= b; 445 } 446 } 447 448 template <class T> 449 NDataBlock<T> NDataBlock<T>::Sub(NDataBlock<T>& b) 521 result.Clone(*this); 522 result *= b; 523 } 524 return result; 525 } 526 527 template <class T> 528 NDataBlock<T> NDataBlock<T>::Sub(const NDataBlock<T>& b) const 450 529 // Pour A-B 451 530 { 452 NDataBlock<T>& a = *this; 453 if(a.mSz!=b.mSz) 531 if(this->mSz!=b.mSz) 454 532 throw(SzMismatchError("NDataBlock operator C=A-B size mismatch/null\n")); 533 NDataBlock<T> result; result.SetTemp(true); 455 534 if(b.IsTemp()) { 456 NDataBlock<T> result(b,true); result.SetTemp(true); 457 T *p=result.Begin(), *pe=result.End(), *pa=a.Begin(); 535 result.Share(b); 536 T *p=result.Begin(), *pe=result.End(); 537 T const *pa=this->Begin(); 458 538 while(p<pe) {*p = *pa++ - *p; p++;} 459 return result;460 539 } else { 461 NDataBlock<T> result(a,false); result.SetTemp(true); 462 return result -= b; 463 } 464 } 465 466 template <class T> 467 NDataBlock<T> NDataBlock<T>::Div(NDataBlock<T>& b) 540 result.Clone(*this); 541 result -= b; 542 } 543 return result; 544 } 545 546 template <class T> 547 NDataBlock<T> NDataBlock<T>::Div(const NDataBlock<T>& b) const 468 548 // Pour A/B 469 549 { 470 NDataBlock<T>& a = *this; 471 if(a.mSz!=b.mSz) 550 if(this->mSz!=b.mSz) 472 551 throw(SzMismatchError("NDataBlock operator C=A/B size mismatch/null\n")); 552 NDataBlock<T> result; result.SetTemp(true); 473 553 if(b.IsTemp()) { 474 NDataBlock<T> result(b,true); result.SetTemp(true); 475 T *p=result.Begin(), *pe=result.End(), *pa=a.Begin(); 554 result.Share(b); 555 T *p=result.Begin(), *pe=result.End(); 556 T const *pa=this->Begin(); 476 557 while(p<pe) {*p = *pa++ / *p; p++;} 477 return result;478 558 } else { 479 NDataBlock<T> result(a,false); result.SetTemp(true); 480 return result /= b; 481 } 559 result.Clone(*this); 560 result /= b; 561 } 562 return result; 482 563 } 483 564 … … 494 575 #pragma define_template NDataBlock<r_4> 495 576 #pragma define_template NDataBlock<r_8> 496 // pas de definitions de cout pour les complex ?? 497 //#pragma define_template NDataBlock< complex<float> > 498 //#pragma define_template NDataBlock< complex<double> > 577 #pragma define_template NDataBlock< complex<float> > 578 #pragma define_template NDataBlock< complex<double> > 499 579 #endif 500 580 -
trunk/SophyaLib/BaseTools/ndatablock.h
r267 r268 1 // This may look like C code, but it is really -*- C++ -*- 2 // Gestion de block de donnees avec partage de references 3 // C.Magneville 04/99 4 // LAL (Orsay) / IN2P3-CNRS DAPNIA/SPP (Saclay) / CEA 1 5 #ifndef NDATABLOCK_H 2 6 #define NDATABLOCK_H 3 7 4 8 #include "machdefs.h" 9 #include "anydataobj.h" 10 #include <iostream.h> 11 12 namespace PlanckDPC { 5 13 6 14 // Classe pour permettre de partager des donnees avec … … 14 22 // classe de container avec partage de reference 15 23 template <class T> 16 class NDataBlock {24 class NDataBlock : public AnyDataObj { 17 25 18 26 public: … … 22 30 NDataBlock(size_t n, T* data, Bridge* br=NULL); 23 31 NDataBlock(); 24 NDataBlock( NDataBlock<T>& a);25 NDataBlock( NDataBlock<T>& a,bool share);32 NDataBlock(const NDataBlock<T>& a); 33 NDataBlock(const NDataBlock<T>& a,bool share); 26 34 virtual ~NDataBlock(); 27 35 28 36 // Temporaire? 29 inline bool IsTemp(void) {return mIsTemp;}30 void SetTemp(bool temp=false) ;37 inline bool IsTemp(void) const {return mIsTemp;} 38 void SetTemp(bool temp=false) const; 31 39 32 40 // Gestion taille/Remplissage 33 void Clone( NDataBlock<T>& a);41 void Clone(const NDataBlock<T>& a); 34 42 void Reset(T v=0); 35 43 void ReSize(size_t n); … … 39 47 inline T* Data() 40 48 {if(mSRef) return mSRef->data; else return NULL;} 49 inline T* Data() const 50 {if(mSRef) return mSRef->data; else return NULL;} 41 51 inline size_t Size() const {return mSz;} 42 inline T& operator()(size_t i) {return *(mSRef->data+i);} 52 inline T& operator()(size_t i) {return *(mSRef->data+i);} 53 inline T operator()(size_t i) const {return *(mSRef->data+i);} 43 54 44 55 inline T* Begin() {return mSRef->data;} 45 inline T const* Begin() const {return mSRef->data;} 56 inline T const* Begin() const {return mSRef->data;} 46 57 inline T* End() {return mSRef->data+mSz;} 47 58 inline T const* End() const {return mSRef->data+mSz;} 48 59 49 60 // Impression 50 void Print(size_t i1=0,size_t n=0); 61 void Print(ostream& os, size_t i1=0,size_t n=10) const; 62 inline void Print(size_t i1=0,size_t n=0) const {Print(cout,i1,n);} 63 64 // 65 T Sum(size_t i1=0,size_t n=0) const; 66 T Product(size_t i1=0,size_t n=0) const; 51 67 52 68 // Surcharge d operateurs 53 NDataBlock<T>& operator = ( NDataBlock<T>& a);69 NDataBlock<T>& operator = (const NDataBlock<T>& a); 54 70 NDataBlock<T>& operator = (T v); 55 71 … … 59 75 NDataBlock<T>& operator /= (T b); 60 76 61 NDataBlock<T>& operator += ( NDataBlock<T>& a);62 NDataBlock<T>& operator -= ( NDataBlock<T>& a);63 NDataBlock<T>& operator *= ( NDataBlock<T>& a);64 NDataBlock<T>& operator /= ( NDataBlock<T>& a);77 NDataBlock<T>& operator += (const NDataBlock<T>& a); 78 NDataBlock<T>& operator -= (const NDataBlock<T>& a); 79 NDataBlock<T>& operator *= (const NDataBlock<T>& a); 80 NDataBlock<T>& operator /= (const NDataBlock<T>& a); 65 81 66 NDataBlock<T> Add(T b) ;67 NDataBlock<T> Sub(T b) ;68 NDataBlock<T> SubInv(T b) ;69 NDataBlock<T> Mul(T b) ;70 NDataBlock<T> Div(T b) ;71 NDataBlock<T> DivInv(T b) ;82 NDataBlock<T> Add(T b) const; 83 NDataBlock<T> Sub(T b) const; 84 NDataBlock<T> SubInv(T b) const; 85 NDataBlock<T> Mul(T b) const; 86 NDataBlock<T> Div(T b) const; 87 NDataBlock<T> DivInv(T b) const; 72 88 73 NDataBlock<T> Add( NDataBlock<T>& b);74 NDataBlock<T> Sub( NDataBlock<T>& b);75 NDataBlock<T> SubInv( NDataBlock<T>& b);76 NDataBlock<T> Mul( NDataBlock<T>& b);77 NDataBlock<T> Div( NDataBlock<T>& b);78 NDataBlock<T> DivInv( NDataBlock<T>& b);89 NDataBlock<T> Add(const NDataBlock<T>& b) const; 90 NDataBlock<T> Sub(const NDataBlock<T>& b) const; 91 NDataBlock<T> SubInv(const NDataBlock<T>& b) const; 92 NDataBlock<T> Mul(const NDataBlock<T>& b) const; 93 NDataBlock<T> Div(const NDataBlock<T>& b) const; 94 NDataBlock<T> DivInv(const NDataBlock<T>& b) const; 79 95 80 96 protected: … … 83 99 84 100 void Alloc(size_t n,T* data=NULL,Bridge* br=NULL); 85 void Share( NDataBlock<T>& a);101 void Share(const NDataBlock<T>& a); 86 102 void Delete(void); 87 103 88 104 size_t mSz; 89 105 NDREF* mSRef; 90 bool mIsTemp;106 mutable bool mIsTemp; 91 107 }; 92 108 93 109 94 110 template<class T> 95 inline NDataBlock<T> operator + (NDataBlock<T>& a,T b) 111 inline ostream& operator << (ostream& os, const NDataBlock<T>& a) 112 {Print(os); return(os);} 113 template<class T> 114 inline NDataBlock<T> operator + (const NDataBlock<T>& a,T b) 96 115 {return a.Add(b);} 97 116 template<class T> 98 inline NDataBlock<T> operator + (T b, NDataBlock<T>& a)117 inline NDataBlock<T> operator + (T b,const NDataBlock<T>& a) 99 118 {return a.Add(b);} 100 119 template<class T> 101 inline NDataBlock<T> operator - ( NDataBlock<T>& a,T b)120 inline NDataBlock<T> operator - (const NDataBlock<T>& a,T b) 102 121 {return a.Sub(b);} 103 122 template<class T> 104 inline NDataBlock<T> operator - (T b, NDataBlock<T>& a)123 inline NDataBlock<T> operator - (T b,const NDataBlock<T>& a) 105 124 {return a.SubInv(b);} 106 125 template<class T> 107 inline NDataBlock<T> operator * ( NDataBlock<T>& a,T b)126 inline NDataBlock<T> operator * (const NDataBlock<T>& a,T b) 108 127 {return a.Mul(b);} 109 128 template<class T> 110 inline NDataBlock<T> operator * (T b, NDataBlock<T>& a)129 inline NDataBlock<T> operator * (T b,const NDataBlock<T>& a) 111 130 {return a.Mul(b);} 112 131 template<class T> 113 inline NDataBlock<T> operator / ( NDataBlock<T>& a,T b)132 inline NDataBlock<T> operator / (const NDataBlock<T>& a,T b) 114 133 {return a.Div(b);} 115 134 template<class T> 116 inline NDataBlock<T> operator / (T b, NDataBlock<T>& a)135 inline NDataBlock<T> operator / (T b,const NDataBlock<T>& a) 117 136 {return a.DivInv(b);} 118 137 119 138 template<class T> 120 inline NDataBlock<T> operator + ( NDataBlock<T>& a,NDataBlock<T>& b)139 inline NDataBlock<T> operator + (const NDataBlock<T>& a,const NDataBlock<T>& b) 121 140 {return a.Add(b);} 122 141 template<class T> 123 inline NDataBlock<T> operator - ( NDataBlock<T>& a,NDataBlock<T>& b)142 inline NDataBlock<T> operator - (const NDataBlock<T>& a,const NDataBlock<T>& b) 124 143 {return a.Sub(b);} 125 144 template<class T> 126 inline NDataBlock<T> operator * ( NDataBlock<T>& a,NDataBlock<T>& b)145 inline NDataBlock<T> operator * (const NDataBlock<T>& a,const NDataBlock<T>& b) 127 146 {return a.Mul(b);} 128 147 template<class T> 129 inline NDataBlock<T> operator / ( NDataBlock<T>& a,NDataBlock<T>& b)148 inline NDataBlock<T> operator / (const NDataBlock<T>& a,const NDataBlock<T>& b) 130 149 {return a.Div(b);} 131 150 151 } // Fin du namespace 132 152 133 153 #endif
Note:
See TracChangeset
for help on using the changeset viewer.