- Timestamp:
- May 3, 1999, 6:56:48 PM (26 years ago)
- Location:
- trunk/SophyaLib/BaseTools
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/BaseTools/ndatablock.cc
r285 r289 20 20 #endif 21 21 22 // LOGIQUE DE BASE: 23 // - le createur par copie et la surcharge de l operateur = "partage" les donnees 24 // - gestion du partage de reference 25 26 //////////////////////////////////////////////////////////////// 27 //************ Createur, Destructeur, gestion des donnees 22 //////////////////////////////////////////////////////////////// 23 //************ Createur, Destructeur 28 24 29 25 template <class T> … … 33 29 { 34 30 #ifdef DEBUG_NDATABLOCK 35 cout<<" DEBUG_NDataBlock::NDataBlock("<<this<<",n="<<n<<")"<<endl;31 cout<<"?_NDataBlock::NDataBlock("<<this<<",n="<<n<<")"<<endl; 36 32 #endif 37 33 … … 46 42 { 47 43 #ifdef DEBUG_NDATABLOCK 48 cout<<" DEBUG_NDataBlock::NDataBlock("<<this44 cout<<"?_NDataBlock::NDataBlock("<<this 49 45 <<",data="<<data<<",br="<<br<<")"<<endl; 50 46 #endif … … 59 55 { 60 56 #ifdef DEBUG_NDATABLOCK 61 cout<<" DEBUG_NDataBlock::NDataBlock("<<this<<") default"<<endl;57 cout<<"?_NDataBlock::NDataBlock("<<this<<") default"<<endl; 62 58 #endif 63 59 } … … 65 61 template <class T> 66 62 NDataBlock<T>::NDataBlock(const NDataBlock<T>& a) 67 // Createur par copie 68 // ATTENTION: partage les donnees avec "a" 69 // Ecriture: NDataBlock a = b; 70 // NDataBlock a(b) 63 // Createur par copie: partage les donnees si "a" temporaire, clone sinon. 71 64 : mSz(0), mSRef(NULL), mIsTemp(false) 72 65 { 73 66 #ifdef DEBUG_NDATABLOCK 74 cout<<"DEBUG_NDataBlock::NDataBlock("<<this<<",&a="<<&a<<") a.(mSz=" 75 <<a.mSz<<" mSRef="<<a.mSRef<<" IsTemp="<<a.IsTemp()<<")"<<endl; 76 #endif 77 78 Share(a); 67 cout<<"?_NDataBlock::NDataBlock("<<this<<",&a="<<&a<<")"<<endl; 68 #endif 69 70 CloneOrShare(a); 79 71 } 80 72 81 73 template <class T> 82 74 NDataBlock<T>::NDataBlock(const NDataBlock<T>& a,bool share) 83 // Createur avec choix de partager ou non 84 // Si "a" temporaire alors partage meme si share=false 75 // Createur avec choix de partager ou non selon "share" 85 76 : mSz(0), mSRef(NULL), mIsTemp(false) 86 77 { 87 78 #ifdef DEBUG_NDATABLOCK 88 cout<<"DEBUG_NDataBlock::NDataBlock("<<this<<",&a="<<&a<<",sh=<<"<<share<<")" 89 <<" a.(mSz="<<a.mSz<<" mSRef="<<a.mSRef<<" IsTemp="<<a.IsTemp()<<")"<<endl; 79 cout<<"?_NDataBlock::NDataBlock("<<this<<",&a="<<&a<<",sh=<<"<<share<<")"<<endl; 90 80 #endif 91 81 … … 98 88 { 99 89 #ifdef DEBUG_NDATABLOCK 100 cout<<" DEBUG_NDataBlock::~NDataBlock("<<this<<")"<<endl;90 cout<<"?_NDataBlock::~NDataBlock("<<this<<")"<<endl; 101 91 #endif 102 92 … … 105 95 106 96 //////////////////////////////////////////////////////////////// 107 108 template <class T> 109 void NDataBlock<T>::SetTemp(bool temp) const 110 // Set temporary 111 { 112 mIsTemp=temp; 113 114 #ifdef DEBUG_NDATABLOCK 115 cout<<"DEBUG_NDataBlock::SetTemp("<<this<<","<<temp 116 <<"), mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 117 #endif 118 } 97 //************ Gestion de donnees 119 98 120 99 template <class T> … … 142 121 { 143 122 #ifdef DEBUG_NDATABLOCK 144 cout<<" DEBUG_NDataBlock::Alloc("<<this<<","123 cout<<"?_NDataBlock::Alloc("<<this<<"," 145 124 <<n<<","<<data<<","<<br<<") mSz="<<mSz 146 125 <<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; … … 164 143 // fait au niveau du dessus!). 165 144 if(!br) NallocData++; NallocSRef++; 166 cout<<"... DEBUG_NDataBlock::Alloc mSz="<<mSz<<" mSRef="<<mSRef145 cout<<"...?_NDataBlock::Alloc mSz="<<mSz<<" mSRef="<<mSRef 167 146 <<" mSRef->nref="<<mSRef->nref<<" mSRef->data="<< mSRef->data 168 147 <<" mSRef->bridge="<<mSRef->bridge<<" IsTemp="<<mIsTemp … … 173 152 template <class T> 174 153 void NDataBlock<T>::Clone(const NDataBlock<T>& a) 175 // Clone (copie de donnee) a partir de "a" 176 // sauf si "a" est une classe temporaire (dans ce cas share!) 177 { 178 #ifdef DEBUG_NDATABLOCK 179 cout<<"DEBUG_NDataBlock::Clone("<<this<<","<<&a<<") a.(mSz=" 154 // Clone: copie de donnees a partir de "a" 155 { 156 #ifdef DEBUG_NDATABLOCK 157 cout<<"?_NDataBlock::Clone("<<this<<","<<&a<<") a.(mSz=" 180 158 <<a.mSz<<" mSRef="<<a.mSRef<<" IsTemp="<<a.IsTemp() 181 159 <<"), mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 182 160 #endif 183 161 184 if(a.mSz==0) throw(SzMismatchError("NDataBlock::Clone a.mSz==0\n")); 185 else if(a.IsTemp()) Share(a); 186 else {Alloc(a.mSz); memcpy(Data(),a.Data(),mSz*sizeof(T));} 162 if(&a==NULL) throw(NullPtrError("NDataBlock::Clone &a==NULL\n")); 163 if(!a.mSRef || a.mSz==0) throw(SzMismatchError("NDataBlock::Clone a.mSz==0\n")); 164 Alloc(a.mSz); 165 memcpy(Data(),a.Data(),mSz*sizeof(T)); 166 } 167 168 template <class T> 169 void NDataBlock<T>::CloneOrShare(const NDataBlock<T>& a) 170 // CloneOrShare: Share si "a" temporaire, Clone sinon. 171 { 172 #ifdef DEBUG_NDATABLOCK 173 cout<<"?_NDataBlock::CloneOrShare("<<this<<","<<&a<<")"<<endl; 174 #endif 175 176 if(&a==NULL) throw(NullPtrError("NDataBlock::CloneOrShare &a==NULL\n")); 177 if(a.IsTemp()) Share(a); else Clone(a); 187 178 } 188 179 189 180 template <class T> 190 181 void NDataBlock<T>::Share(const NDataBlock<T>& a) 191 // Partage des donnees avec "a"192 { 193 #ifdef DEBUG_NDATABLOCK 194 cout<<" DEBUG_NDataBlock::Share("<<this<<","<<&a<<")";182 // Share: Partage les donnees avec "a" 183 { 184 #ifdef DEBUG_NDATABLOCK 185 cout<<"?_NDataBlock::Share("<<this<<","<<&a<<")"; 195 186 if(&a!=NULL) cout<<" a.(mSz="<<a.mSz<<" mSRef="<<a.mSRef 196 187 <<" IsTemp="<<a.IsTemp()<<")"; … … 199 190 200 191 if(&a==NULL) throw(NullPtrError("NDataBlock::Share &a==NULL\n")); 201 // on ne peut partager si "a" pas alloue 202 if(!a.mSRef) throw(NullPtrError("NDataBlock::Share not allocated a\n")); 192 if(!a.mSRef || a.mSz==0) throw(NullPtrError("NDataBlock::Share a.mSz=0\n")); 203 193 if(mSRef) Delete(); 204 194 mSz = a.mSz; mSRef = a.mSRef; mSRef->nref++; 205 195 206 196 #ifdef DEBUG_NDATABLOCK 207 cout<<"... DEBUG_NDataBlock::Share mSz="<<mSz<<" mSRef="<<mSRef197 cout<<"...?_NDataBlock::Share mSz="<<mSz<<" mSRef="<<mSRef 208 198 <<" mSRef->nref="<<mSRef->nref<<" mSRef->data="<< mSRef->data 209 199 <<" mSRef->bridge="<<mSRef->bridge<<" IsTemp="<<mIsTemp<<endl; … … 216 206 { 217 207 #ifdef DEBUG_NDATABLOCK 218 cout<<" DEBUG_NDataBlock::Delete("<<this<<") mSz="<<mSz208 cout<<"?_NDataBlock::Delete("<<this<<") mSz="<<mSz 219 209 <<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp; 220 210 if(mSRef) … … 224 214 #endif 225 215 226 if(mSRef==NULL) return; // cas du createur par defaut216 if(mSRef==NULL) return; 227 217 mSRef->nref--; 228 218 if(mSRef->nref != 0) { 229 219 230 220 #ifdef DEBUG_NDATABLOCK 231 cout<<"... DEBUG_NDataBlock::Delete() pas de desallocation il reste nref="221 cout<<"...?_NDataBlock::Delete() pas de desallocation il reste nref=" 232 222 <<mSRef->nref<<" Total("<<NallocData<<","<<NallocSRef<<")"<<endl; 233 223 #endif … … 239 229 #ifdef DEBUG_NDATABLOCK 240 230 if(!mSRef->bridge) NallocData--; NallocSRef--; 241 cout<<"... DEBUG_NDataBlock::Delete() desallocation complete il reste nref="231 cout<<"...?_NDataBlock::Delete() desallocation complete il reste nref=" 242 232 <<mSRef->nref<<" Total("<<NallocData<<","<<NallocSRef<<")"<<endl; 243 233 #endif … … 250 240 } 251 241 252 ////////////////////////////////////////////////////////////////253 254 template <class T>255 void NDataBlock<T>::Reset(T v)256 {257 if(mSRef==NULL || mSRef->data==NULL || mSz==0) return;258 T *p=Begin(), *pe=End(); while(p<pe) *p++ = v;259 }260 261 template <class T>262 void NDataBlock<T>::ReSize(size_t n,bool force_alloc)263 // Re-dimension, avec re-allocation de la place si n != mSz264 // Si n==mSz, la place n'est re-allouee que si force_alloc=true265 {266 if(!force_alloc && n == mSz) return;267 Alloc(n);268 }269 270 242 template <class T> 271 243 void NDataBlock<T>::FillFrom(size_t n,T* data) 272 244 // Remplissage par un tableau de donnees 273 245 // - Si classe vide : creation de l'espace memoire 274 // - Si classe connectee : on ecrit selon la longueur 246 // - Si classe connectee : on ecrit selon la longueur minimale 247 // (cad this->mSz ou "n") 275 248 { 276 249 if(data==NULL) throw(NullPtrError("NDataBlock::FillFrom data==NULL\n")); 277 250 if(n==0) throw(ParmError("NDataBlock::FillFrom n<=0\n")); 278 if(mSRef==NULL) Alloc(n); // cas du createur par default251 if(mSRef==NULL) Alloc(n); 279 252 if(mSz<n) n = mSz; 280 253 memcpy(Data(),data,n*sizeof(T)); … … 306 279 307 280 //////////////////////////////////////////////////////////////// 308 //**** Surcharge de = : NDataBlock=NDataBlock; NDataBlock=<T> b;309 310 template <class T>311 NDataBlock<T>& NDataBlock<T>::operator = (const NDataBlock<T>& a)312 // surcharge avec partage des donnees313 // Ecriture: NDataBlock a; a = b;314 // NDataBlock a(10); a = b; (a est re-affecte)315 {316 #ifdef DEBUG_NDATABLOCK317 cout<<"DEBUG_NDataBlock::operator=("<<this<<","<<&a<<") a.(mSz="318 <<a.mSz<<" mSRef="<<a.mSRef<<" IsTemp="<<a.IsTemp()319 <<"), mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl;320 #endif321 322 if(this == &a) return *this;323 if(a.mSz!=mSz)324 throw(SzMismatchError("NDataBlock::operator=A size mismatch/null\n"));325 Share(a);326 return *this;327 }328 329 template <class T>330 NDataBlock<T>& NDataBlock<T>::operator = (T v)331 // surcharge avec copie des donnees (pas de partage)332 // "this" est sur-ecrit, attention au partage de reference!333 // NDataBlock a; a = v; ou bien NDataBlock a(10); a = v;334 {335 #ifdef DEBUG_NDATABLOCK336 cout<<"DEBUG_NDataBlock::operator=("<<this<<","<<v<<")"337 <<" mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl;338 #endif339 340 if(mSz==0) throw(SzMismatchError("NDataBlock::operator=v null size\n"));341 T *p=Begin(), *pe=End();342 while (p<pe) *p++ = v;343 return *this;344 }345 346 ////////////////////////////////////////////////////////////////347 281 348 282 template <class T> … … 371 305 372 306 //////////////////////////////////////////////////////////////// 307 //**** Surcharge de = : NDataBlock=NDataBlock; NDataBlock=<T> b; 308 309 template <class T> 310 NDataBlock<T>& NDataBlock<T>::operator = (const NDataBlock<T>& a) 311 // Affectation: partage des donnees si "a" temporaire, clone sinon. 312 { 313 #ifdef DEBUG_NDATABLOCK 314 cout<<"?_NDataBlock::operator=("<<this<<","<<&a<<") a.(mSz=" 315 <<a.mSz<<" mSRef="<<a.mSRef<<" IsTemp="<<a.IsTemp() 316 <<"), mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 317 #endif 318 319 if(this == &a) return *this; 320 if(a.mSz==0) 321 throw(SzMismatchError("NDataBlock::operator=A null size\n")); 322 CloneOrShare(a); 323 return *this; 324 } 325 326 template <class T> 327 NDataBlock<T>& NDataBlock<T>::operator = (T v) 328 // Affectation de tous les elements a une constante "v" 329 { 330 #ifdef DEBUG_NDATABLOCK 331 cout<<"?_NDataBlock::operator=("<<this<<","<<v<<")" 332 <<" mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 333 #endif 334 335 if(mSz==0) throw(SzMismatchError("NDataBlock::operator=v null size\n")); 336 T *p=Begin(), *pe=End(); 337 while (p<pe) *p++ = v; 338 return *this; 339 } 340 341 //////////////////////////////////////////////////////////////// 373 342 //**** Surcharge de +=,-=,*=,/= (INPLACE): NDataBlock += <T> b; 374 343 … … 410 379 } 411 380 412 413 381 //////////////////////////////////////////////////////////////// 414 382 //**** Surcharge de +=,-=,*=,/= (INPLACE): NDataBlock += NDataBlock; … … 421 389 T *p=Begin(), *pe=End(); 422 390 T const * pa=a.Begin(); 423 while (p<pe) *p++ += *pa++; // ca marche meme si *this=a391 while (p<pe) *p++ += *pa++; 424 392 return *this; 425 393 } … … 432 400 T *p=Begin(), *pe=End(); 433 401 T const *pa=a.Begin(); 434 while (p<pe) *p++ -= *pa++; // ca marche meme si *this=a402 while (p<pe) *p++ -= *pa++; 435 403 return *this; 436 404 } … … 443 411 T *p=Begin(), *pe=End(); 444 412 T const *pa=a.Begin(); 445 while (p<pe) *p++ *= *pa++; // ca marche meme si *this=a413 while (p<pe) *p++ *= *pa++; 446 414 return *this; 447 415 } … … 449 417 template <class T> 450 418 NDataBlock<T>& NDataBlock<T>::operator /= (const NDataBlock<T>& a) 419 // Attention, aucune protection si un element de "a" est nul. 451 420 { 452 421 if(mSz==0 || mSz!=a.mSz) … … 461 430 //**** Surcharge de +,-,*,/ : NDataBlock = NDataBlock+<T>b; 462 431 // NDataBlock = <T>b+NDataBlock; 463 // ATTENTION: re-affectation imposee464 432 465 433 template <class T> … … 467 435 // Pour A+b 468 436 { 469 NDataBlock<T> result(*this ,false); result.SetTemp(true);437 NDataBlock<T> result(*this); result.SetTemp(true); 470 438 result += b; 471 439 return result; … … 476 444 // Pour A-b 477 445 { 478 NDataBlock<T> result(*this ,false); result.SetTemp(true);446 NDataBlock<T> result(*this); result.SetTemp(true); 479 447 return result -= b; 480 448 } … … 484 452 // Pour b-A 485 453 { 486 NDataBlock<T> result(*this ,false); result.SetTemp(true);454 NDataBlock<T> result(*this); result.SetTemp(true); 487 455 T *p=result.Begin(), *pe=result.End(); 488 456 T const *pa=this->Begin(); … … 495 463 // Pour A*b 496 464 { 497 NDataBlock<T> result(*this ,false); result.SetTemp(true);465 NDataBlock<T> result(*this); result.SetTemp(true); 498 466 return result *= b; 499 467 } … … 503 471 // Pour A/b 504 472 { 505 NDataBlock<T> result(*this ,false); result.SetTemp(true);473 NDataBlock<T> result(*this); result.SetTemp(true); 506 474 return result /= b; 507 475 } … … 511 479 // Pour b/A 512 480 { 513 NDataBlock<T> result(*this ,false); result.SetTemp(true);481 NDataBlock<T> result(*this); result.SetTemp(true); 514 482 T *p=result.Begin(), *pe=result.End(); 515 483 T const *pa = this->Begin(); … … 518 486 } 519 487 520 521 488 //////////////////////////////////////////////////////////////// 522 489 //**** Surcharge de +,-,*,/ : NDataBlock = NDataBlock+NDataBlock; … … 529 496 throw(SzMismatchError("NDataBlock operator C=A+B size mismatch/null\n")); 530 497 NDataBlock<T> result; result.SetTemp(true); 531 if(b.IsTemp()) { 532 result.Share(b); 533 result += *this; 534 } else { 535 result.Clone(*this); 536 result += b; 537 } 498 if(b.IsTemp()) {result.Share(b); result += *this;} 499 else {result.CloneOrShare(*this); result += b;} 538 500 return result; 539 501 } … … 546 508 throw(SzMismatchError("NDataBlock operator C=A*B size mismatch/null\n")); 547 509 NDataBlock<T> result; result.SetTemp(true); 548 if(b.IsTemp()) { 549 result.Share(b); 550 result *= *this; 551 } else { 552 result.Clone(*this); 553 result *= b; 554 } 510 if(b.IsTemp()) {result.Share(b); result *= *this;} 511 else {result.CloneOrShare(*this); result *= b;} 555 512 return result; 556 513 } … … 565 522 if(b.IsTemp()) { 566 523 result.Share(b); 567 T *p=result.Begin(), *pe=result.End(); 568 T const *pa=Begin(); 524 T *p=result.Begin(), *pe=result.End(); T const *pa=Begin(); 569 525 while(p<pe) {*p = *pa++ - *p; p++;} 570 } else { 571 result.Clone(*this); 572 result -= b; 573 } 526 } else {result.CloneOrShare(*this); result -= b;} 574 527 return result; 575 528 } … … 584 537 if(b.IsTemp()) { 585 538 result.Share(b); 586 T *p=result.Begin(), *pe=result.End(); 587 T const *pa=Begin(); 539 T *p=result.Begin(), *pe=result.End(); T const *pa=Begin(); 588 540 while(p<pe) {*p = *pa++ / *p; p++;} 589 } else { 590 result.Clone(*this); 591 result /= b; 592 } 541 } else {result.CloneOrShare(*this); result /= b;} 593 542 return result; 594 543 } … … 659 608 is.Get(itab, 3); 660 609 if (dobj == NULL) dobj = new NDataBlock<T>(itab[1]); 661 else dobj->ReSize(itab[1] , false);610 else dobj->ReSize(itab[1]); 662 611 // On lit le tableau de nombres 663 612 PIOSReadArray(is, dobj->Data(), dobj->Size()); … … 707 656 #endif 708 657 709 710 658 #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) 711 659 template class NDataBlock<uint_1>; -
trunk/SophyaLib/BaseTools/ndatablock.h
r285 r289 37 37 // Temporaire? 38 38 inline bool IsTemp(void) const {return mIsTemp;} 39 void SetTemp(bool temp=false) const;39 inline void SetTemp(bool temp=false) const {mIsTemp = temp;} 40 40 41 41 // Gestion taille/Remplissage 42 42 void Clone(const NDataBlock<T>& a); 43 void Reset(T v=0);44 void ReSize(size_t n,bool force_alloc=true);43 void CloneOrShare(const NDataBlock<T>& a); 44 void Share(const NDataBlock<T>& a); 45 45 void FillFrom(size_t n,T* data); 46 inline void Reset(T v=0) 47 {if(mSz==0) return; T *p=Begin(),*pe=End(); while(p<pe) *p++=v;} 48 inline void ReSize(size_t n) {Alloc(n);} 46 49 47 50 // Informations pointeur/data … … 53 56 inline T& operator()(size_t i) {return *(mSRef->data+i);} 54 57 inline T operator()(size_t i) const {return *(mSRef->data+i);} 55 56 58 inline T* Begin() {return mSRef->data;} 57 59 inline T const* Begin() const {return mSRef->data;} … … 67 69 T Product(size_t i1=0,size_t n=0) const; 68 70 69 // Surcharge d operateurs71 // Surcharge d'operateurs INPLACE: A = x , A = B , A @= x , A @= B 70 72 NDataBlock<T>& operator = (const NDataBlock<T>& a); 71 73 NDataBlock<T>& operator = (T v); … … 81 83 NDataBlock<T>& operator /= (const NDataBlock<T>& a); 82 84 85 // Surcharge d'operateurs: C = A @ x , C = A @ B 83 86 NDataBlock<T> Add(T b) const; 84 87 NDataBlock<T> Sub(T b) const; … … 99 102 100 103 void Alloc(size_t n,T* data=NULL,Bridge* br=NULL); 101 void Share(const NDataBlock<T>& a);102 104 void Delete(void); 103 105 … … 153 155 template <class T> 154 156 class FIO_NDataBlock : public PPersist { 155 156 157 public: 157 FIO_NDataBlock(); 158 FIO_NDataBlock(string const & filename); 159 FIO_NDataBlock(const NDataBlock<T> & obj); 160 FIO_NDataBlock(NDataBlock<T> * obj); 161 virtual ~FIO_NDataBlock(); 162 163 virtual AnyDataObj* DataObj(); 158 FIO_NDataBlock(); 159 FIO_NDataBlock(string const & filename); 160 FIO_NDataBlock(const NDataBlock<T> & obj); 161 FIO_NDataBlock(NDataBlock<T> * obj); 162 virtual ~FIO_NDataBlock(); 163 virtual AnyDataObj* DataObj(); 164 164 inline operator NDataBlock<T>() { return(*dobj); } 165 166 165 protected : 167 166 virtual void ReadSelf(PInPersist&);
Note:
See TracChangeset
for help on using the changeset viewer.