Changeset 976 in Sophya for trunk/SophyaLib/BaseTools
- Timestamp:
- Apr 27, 2000, 7:55:14 PM (25 years ago)
- Location:
- trunk/SophyaLib/BaseTools
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/BaseTools/ndatablock.cc
r969 r976 114 114 //! Copy constructor 115 115 /*! 116 \warning datas are shared if \b a is temporary, cloned if not.116 \warning datas are \b SHARED with \b a. 117 117 */ 118 118 template <class T> … … 199 199 200 200 //! \b Share with \b a if \b temporary, \b clone from \b a if not. 201 /*! \warning For most purposes, users don't have to worry with 202 the "temporary" nature of a NDataBlock. That is used 203 internaly to avoid memory allocation in operation 204 like A = B + C + D for instance. The method is not 205 protected to allow users to write complicated functions 206 on NDataBlock. 207 \verbatim 208 ---------------------------------------------------------- 209 Pourquoi une complication avec la notion de "temporaire" : 210 ---------------------------------------------------------- 211 - Le constructeur par copie partageant les donnees, 212 dans une methode un { NDataBlock<T> result; ...; return result;} 213 ne va pas allouer de la memoire pour retourner "result". 214 - La gestion de temporaire sert quand on enchaine plusieurs 215 operations sur la meme ligne, par exemple : A = B+C+D; 216 Dans ce cas l'objet CD=C+D est d'abord alloue et rempli 217 avec C+D, puis CD est mis a "temporaire". 218 Quand on ajoute B a CD, la methode d'addition va se rendre compte 219 que CD est "temporaire" et additionner B "in-place" dans CD 220 sans allouer une fois de plus de la place (pas d'allocation 221 de place BCD pour mettre B+CD mais une operation CD += B). 222 Si la notion d'objet "temporaire" n'avait pas ete consideree 223 l'addition A = B+C+D aurait alloue de la place pour "CD=C+D" 224 puis pour BCD=B+CD : 2 allocations auraient ete necessaires 225 contre 1 seule dans notre cas de geston de "temporaire". 226 \endverbatim 227 */ 201 228 template <class T> 202 229 void NDataBlock<T>::CloneOrShare(const NDataBlock<T>& a) … … 473 500 /////////////////////////////////////////////////////////////// 474 501 475 //! Operator = : ND = ND 1476 /*! \warning share if \b a is temporary, clone if not*/502 //! Operator = : ND = NDa 503 /*! \warning Datas are copied (cloned) from \b a. */ 477 504 template <class T> 478 505 NDataBlock<T>& NDataBlock<T>::operator = (const NDataBlock<T>& a) … … 487 514 if(a.mSz==0) 488 515 throw(SzMismatchError("NDataBlock::operator=A null size \n")); 489 if (mSz==0) { 490 CloneOrShare(a); 491 return *this; 492 } 516 if (mSz==0) { CloneOrShare(a); return *this; } 493 517 if (a.mSz != mSz) 494 518 throw(SzMismatchError("NDataBlock::operator=A Unequal sizes \n")); … … 506 530 <<" mSz="<<mSz<<" mSRef="<<mSRef<<" IsTemp="<<mIsTemp<<endl; 507 531 508 509 532 if(mSz==0) throw(SzMismatchError("NDataBlock::operator=v null size\n")); 510 T *p=Begin(), *pe=End(); 511 while (p<pe) *p++ = v; 533 T *p=Begin(), *pe=End(); while (p<pe) *p++ = v; 512 534 return *this; 513 535 } … … 522 544 { 523 545 if(mSz==0) throw(SzMismatchError("NDataBlock::operator+=v null size\n")); 524 T *p=Begin(), *pe=End(); 525 while (p<pe) *p++ += b; 546 T *p=Begin(), *pe=End(); while (p<pe) *p++ += b; 526 547 return *this; 527 548 } … … 532 553 { 533 554 if(mSz==0) throw(SzMismatchError("NDataBlock::operator-=v null size\n")); 534 T *p=Begin(), *pe=End(); 535 while (p<pe) *p++ -= b; 555 T *p=Begin(), *pe=End(); while (p<pe) *p++ -= b; 536 556 return *this; 537 557 } … … 542 562 { 543 563 if(mSz==0) throw(SzMismatchError("NDataBlock::operator*=v null size\n")); 544 T *p=Begin(), *pe=End(); 545 while (p<pe) *p++ *= b; 546 return *this; 547 } 548 549 //! Divide by a constant : ND *= b 564 T *p=Begin(), *pe=End(); while (p<pe) *p++ *= b; 565 return *this; 566 } 567 568 //! Divide by a constant : ND /= b 550 569 template <class T> 551 570 NDataBlock<T>& NDataBlock<T>::operator /= (T b) … … 553 572 if(b==(T) 0) throw(ParmError("NDataBlock::operator/=v divide by zero\n")); 554 573 if(mSz==0) throw(SzMismatchError("NDataBlock::operator/=v null size\n")); 555 T *p=Begin(), *pe=End(); 556 while (p<pe) *p++ /= b; 574 T *p=Begin(), *pe=End(); while (p<pe) *p++ /= b; 557 575 return *this; 558 576 } … … 562 580 //////////////////////////////////////////////////////////////////// 563 581 564 //! Add a NDataBlock : ND += ND 1582 //! Add a NDataBlock : ND += NDa 565 583 template <class T> 566 584 NDataBlock<T>& NDataBlock<T>::operator += (const NDataBlock<T>& a) … … 574 592 } 575 593 576 //! Substract a NDataBlock : ND -= ND 1594 //! Substract a NDataBlock : ND -= NDa 577 595 template <class T> 578 596 NDataBlock<T>& NDataBlock<T>::operator -= (const NDataBlock<T>& a) … … 586 604 } 587 605 588 //! Multiply by a NDataBlock : ND *= ND 1606 //! Multiply by a NDataBlock : ND *= NDa 589 607 template <class T> 590 608 NDataBlock<T>& NDataBlock<T>::operator *= (const NDataBlock<T>& a) … … 598 616 } 599 617 600 //! Divide by a NDataBlock : ND *= ND1618 //! Divide by a NDataBlock : ND /= NDa 601 619 template <class T> 602 620 NDataBlock<T>& NDataBlock<T>::operator /= (const NDataBlock<T>& a) … … 607 625 T *p=Begin(), *pe=End(); 608 626 T const *pa=a.Begin(); 609 while (p<pe) *p++ /= *pa++; 610 return *this; 611 } 612 613 //////////////////////////////////////////////////////////////// 614 // Pour surcharge de +,-,*,/ : NDataBlock = NDataBlock1+<T>b; // 615 // NDataBlock = <T>b+NDataBlock1; // 616 //////////////////////////////////////////////////////////////// 627 while (p<pe) *p++ /= *pa++; // Division par zero non protegee 628 return *this; 629 } 630 631 ////////////////////////////////////////////////////////////////// 632 // Pour surcharge de +,-,*,/ : NDataBlock = NDataBlock1+<T>b; // 633 // NDataBlock = <T>b+NDataBlock1; // 634 // Pour la notion de "temporaire" voir blabla dans CloneOrShare // 635 ////////////////////////////////////////////////////////////////// 617 636 618 637 //! Add a constant and return NDataBlock : NDret = ND + b … … 627 646 } 628 647 629 //! Substract a constant and return NDataBlock : NDret = ND - b 630 template <class T> 631 NDataBlock<T> NDataBlock<T>::Sub(T b) const 632 // Pour A-b 648 //! Substract a constant and return NDataBlock : NDret = ND - b or NDret = b - ND 649 /*! Substract a constant or from a constant 650 \param fginv==false : performs NDret = ND - b (default) 651 \param fginv==true : performs NDret = b - ND 652 */ 653 template <class T> 654 NDataBlock<T> NDataBlock<T>::Sub(T b,bool fginv) const 655 // Pour A-b sauf si fginv==true b-A (- n'est pas commutatif!) 633 656 { 634 657 NDataBlock<T> result; 635 658 result.CloneOrShare(*this); result.SetTemp(true); 636 return result -= b; 637 } 638 639 //! Substract from a constant and return NDataBlock : NDret = b - ND 640 template <class T> 641 NDataBlock<T> NDataBlock<T>::SubInv(T b) const 642 // Pour b-A 659 if(fginv) { 660 T *p=result.Begin(), *pe=result.End(); 661 T const *pa=this->Begin(); 662 while(p<pe) {*p++ = b - *pa++;} 663 } else result -= b; 664 return result; 665 } 666 667 //! Multiply by a constant and return NDataBlock : NDret = ND * b 668 template <class T> 669 NDataBlock<T> NDataBlock<T>::Mul(T b) const 670 // Pour A*b 643 671 { 644 672 NDataBlock<T> result; 645 673 result.CloneOrShare(*this); result.SetTemp(true); 646 T *p=result.Begin(), *pe=result.End(); 647 T const *pa=this->Begin(); 648 while(p<pe) {*p++ = b - *pa++;} 674 result *= b; 649 675 return result; 650 676 } 651 677 652 //! Multiply by a constant and return NDataBlock : NDret = ND * b 653 template <class T> 654 NDataBlock<T> NDataBlock<T>::Mul(T b) const 655 // Pour A*b 678 //! Divide by a constant and return NDataBlock : NDret = ND / b or NDret = b / ND 679 /*! Divide by a constant or from a constant 680 \param fginv==false : performs NDret = ND / b (default) 681 \param fginv==true : performs NDret = b / ND 682 */ 683 template <class T> 684 NDataBlock<T> NDataBlock<T>::Div(T b,bool fginv) const 685 // Pour A/b sauf si fginv==true b/A (/ n'est pas commutatif!) 656 686 { 657 687 NDataBlock<T> result; 658 688 result.CloneOrShare(*this); result.SetTemp(true); 659 return result *= b; 660 } 661 662 //! Divide by a constant and return NDataBlock : NDret = ND / b 663 template <class T> 664 NDataBlock<T> NDataBlock<T>::Div(T b) const 665 // Pour A/b 666 { 667 NDataBlock<T> result; 668 result.CloneOrShare(*this); result.SetTemp(true); 669 return result /= b; 670 } 671 672 //! Divide from a constant and return NDataBlock : NDret = b / ND 673 template <class T> 674 NDataBlock<T> NDataBlock<T>::DivInv(T b) const 675 // Pour b/A 676 { 677 NDataBlock<T> result; 678 result.CloneOrShare(*this); result.SetTemp(true); 679 T *p=result.Begin(), *pe=result.End(); 680 T const *pa = this->Begin(); 681 while(p<pe) {*p++ = b / *pa++;} 689 if(fginv) { 690 T *p=result.Begin(), *pe=result.End(); 691 T const *pa = this->Begin(); 692 while(p<pe) {*p++ = b / *pa++;} // Division par zero non protegee 693 } else { 694 if( b == (T) 0 ) throw MathExc("NDataBlock<T>::Div(T) - Divide by zero ! "); 695 result /= b; 696 } 682 697 return result; 683 698 } … … 740 755 result.Share(b); 741 756 T *p=result.Begin(), *pe=result.End(); T const *pa=Begin(); 742 while(p<pe) {*p = *pa++ / *p; p++;} 757 while(p<pe) {*p = *pa++ / *p; p++;} // Division par zero non protegee 743 758 } else {result.CloneOrShare(*this); result /= b;} 744 759 return result; -
trunk/SophyaLib/BaseTools/ndatablock.h
r948 r976 133 133 // Surcharge d'operateurs: C = A @ x , C = A @ B 134 134 NDataBlock<T> Add(T b) const; 135 NDataBlock<T> Sub(T b) const; 136 NDataBlock<T> SubInv(T b) const; 135 NDataBlock<T> Sub(T b,bool fginv=false) const; 137 136 NDataBlock<T> Mul(T b) const; 138 NDataBlock<T> Div(T b) const; 139 NDataBlock<T> DivInv(T b) const; 137 NDataBlock<T> Div(T b,bool fginv=false) const; 140 138 141 139 NDataBlock<T> Add(const NDataBlock<T>& b) const; 142 140 NDataBlock<T> Sub(const NDataBlock<T>& b) const; 143 NDataBlock<T> SubInv(const NDataBlock<T>& b) const;144 141 NDataBlock<T> Mul(const NDataBlock<T>& b) const; 145 142 NDataBlock<T> Div(const NDataBlock<T>& b) const; 146 NDataBlock<T> DivInv(const NDataBlock<T>& b) const;147 143 148 144 protected: … … 186 182 template<class T> 187 183 inline NDataBlock<T> operator - (T b,const NDataBlock<T>& a) 188 {return a.Sub Inv(b);}184 {return a.Sub(b,true);} 189 185 //! Multiply datas by a constant and return NDataBlock : ND = NDa * b 190 186 template<class T> … … 202 198 template<class T> 203 199 inline NDataBlock<T> operator / (T b,const NDataBlock<T>& a) 204 {return a.Div Inv(b);}200 {return a.Div(b,true);} 205 201 206 202 //! Add datas of two data blocks and return NDataBlock : ND = NDa + NDb
Note:
See TracChangeset
for help on using the changeset viewer.