Changeset ecbe9f7 in git for kernel/Poly.h


Ignore:
Timestamp:
Aug 17, 2005, 8:34:17 AM (19 years ago)
Author:
Michael Brickenstein <bricken@…>
Branches:
(u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', 'd08f5f0bb3329b8ca19f23b74cb1473686415c3a')
Children:
77ed9949773a942859e2d90eb3e135a1e0d09d7a
Parents:
89ccc16173d3e69a1de96f508bbe39a32a01ca75
Message:
*bricken: module, vector separated


git-svn-id: file:///usr/local/Singular/svn/trunk@8510 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/Poly.h

    r89ccc1 recbe9f7  
    1 //$Id: Poly.h,v 1.7 2005-08-16 14:36:10 bricken Exp $
     1//$Id: Poly.h,v 1.8 2005-08-17 06:34:16 bricken Exp $
    22
    33
     
    2424//Poly wraps around PolyImpl with reference counting using boost
    2525class PolyImpl{
    26   friend class Poly;
     26  friend class PolyBase<RING>;
     27  friend class PolyBase<MODUL>;
    2728  //friend class Number;
    2829 protected:
     
    324325
    325326};
    326 class Poly{
     327
     328template <poly_variant variant> class PolyBase;
     329template <poly_variant v> inline PolyBase<v> operator+(const PolyBase<v>& p1, const PolyBase<v>& p2);
     330template <poly_variant v> inline PolyBase<v> operator*(const PolyBase<v>& p1, const PolyBase<v>& p2);
     331template <poly_variant v>inline PolyBase<v> operator*(const PolyBase<v>& p1, const Number& n);
     332template<poly_variant variant> class PolyBase{
    327333 
    328334 public:
    329   typedef PolyInputIterator<Poly> iterator;
     335  typedef PolyInputIterator<PolyBase> iterator;
    330336  void copy_on_write(){
    331337    if (!ptr.unique()){
     
    342348  }
    343349
    344   Poly(ring r=currRing):ptr(new PolyImpl((poly) NULL,r)){
    345   }
    346   Poly(int n, ring r=currRing):ptr(new PolyImpl(n,r)){
    347    
    348   }
    349   Poly(const char* c, ring r=currRing):ptr(new PolyImpl((poly)NULL,r)){
     350  PolyBase(ring r=currRing):ptr(new PolyImpl((poly) NULL,r)){
     351  }
     352  PolyBase(int n, ring r=currRing):ptr(new PolyImpl(n,r)){
     353   
     354  }
     355  PolyBase(const char* c, ring r=currRing):ptr(new PolyImpl((poly)NULL,r)){
    350356    //p_Read takes no const so do
    351357    char* cp=(char*) omalloc((strlen(c)+1)*sizeof(char));
     
    354360    omfree(cp);
    355361  }
    356   Poly(const Poly&p):ptr(p.ptr){
    357   }
    358   Poly(const Number& n):ptr(new PolyImpl(n)){
    359    
    360   }
    361   Poly(std::vector<int> v, ring r=currRing):ptr(new PolyImpl((poly) NULL,r)){
     362  PolyBase(const PolyBase&p):ptr(p.ptr){
     363  }
     364  PolyBase(const Number& n):ptr(new PolyImpl(n)){
     365   
     366  }
     367  PolyBase(std::vector<int> v, ring r=currRing):ptr(new PolyImpl((poly) NULL,r)){
    362368    unsigned int i;
    363369    int s=v.size();
     
    369375    ptr->p=p;
    370376  }
    371   Poly& operator+=(Poly p2){
     377  PolyBase& operator+=(PolyBase p2){
    372378    copy_on_write();
    373379    *ptr += *p2.ptr;
     
    375381    return *this;
    376382  }
    377   Poly& operator*=(Poly p2){
     383  PolyBase& operator*=(PolyBase p2){
    378384    copy_on_write();
    379385    *ptr *= *p2.ptr;
     
    381387    return *this;
    382388  }
    383   Poly& operator*=(Number n){
     389  PolyBase& operator*=(Number n){
    384390    copy_on_write();
    385391    *ptr *=n;
     
    392398     Print(StringAppendS(""));
    393399     }*/
    394   virtual ~Poly(){}
    395   Poly(poly p, ring r):ptr(new PolyImpl(p,r)){
    396   }
    397   Poly(poly p, ring r,int):ptr(new PolyImpl(p,r,0)){
     400  virtual ~PolyBase(){}
     401  PolyBase(poly p, ring r):ptr(new PolyImpl(p,r)){
     402  }
     403  PolyBase(poly p, ring r,int):ptr(new PolyImpl(p,r,0)){
    398404  }
    399405  /*Poly(Poly& p){
     
    401407    }*/
    402408
    403   PolyInputIterator<Poly> begin(){
    404     return PolyInputIterator<Poly>(ptr->p,ptr->r);
    405   }
    406   PolyInputIterator<Poly> end(){
    407     return PolyInputIterator<Poly>(NULL, ptr->r);
     409  PolyInputIterator<PolyBase> begin(){
     410    return PolyInputIterator<PolyBase>(ptr->p,ptr->r);
     411  }
     412  PolyInputIterator<PolyBase> end(){
     413    return PolyInputIterator<PolyBase>(NULL, ptr->r);
    408414  }
    409415  ring getRing(){
     
    411417  }
    412418 protected:
    413   Poly(PolyImpl& impl):ptr(&impl){
     419  PolyBase(PolyImpl& impl):ptr(&impl){
    414420   
    415421  }
     
    419425 private:
    420426  shared_ptr<PolyImpl> ptr;
    421   friend inline Poly operator+(const Poly& p1, const Poly& p2);
    422   friend inline Poly operator*(const Poly& p1, const Poly& p2);
    423   friend inline Poly operator*(const Poly& p1, const Number& n);
     427  //friend inline Poly operator+(const Poly& p1, const Poly& p2);
     428  ///friend inline PolyBase operator*(const Poly& p1, const Poly& p2);
     429  //friend inline PolyBase operator*(const Poly& p1, const Number& n);
    424430  // friend inline Poly operator*(const Poly& p1, const Number& n);
    425  
     431  //  friend inline template PolyBase<poly_variant variant> operator+(const PolyBase<v>& p1, const PolyBase<v>& p2);
     432  friend PolyBase<variant> operator+<>(const PolyBase<variant>& p1, const PolyBase<variant>& p2);
     433  friend PolyBase<variant> operator*<>(const PolyBase<variant>& p1, const PolyBase<variant>& p2);
     434  friend PolyBase<variant> operator*<>(const PolyBase<variant>& p1, const Number& p2);
    426435};
    427 
    428 inline Poly operator+(const Poly& p1, const Poly& p2){
     436typedef PolyBase<RING> Poly;
     437template <poly_variant v> inline PolyBase<v> operator+(const PolyBase<v>& p1, const PolyBase<v>& p2){
    429438    PolyImpl* res=new PolyImpl(*p1.ptr);
    430439    *res+=*p2.ptr;
    431     return(Poly(*res));
    432 }
    433 inline Poly operator*(const Poly& p1, const Poly& p2){
     440    return(PolyBase<v>(*res));
     441}
     442template <poly_variant v> inline PolyBase<v> operator*(const PolyBase<v>& p1, const PolyBase<v>& p2){
    434443    PolyImpl* res=new PolyImpl(*p1.ptr);
    435444    *res *= *p2.ptr;
    436     return(Poly(*res));
    437 }
    438 inline Poly operator*(const Poly& p1, const Number& n){
     445    return(PolyBase<v> (*res));
     446}
     447template <poly_variant v>inline PolyBase<v> operator*(const PolyBase<v>& p1, const Number& n){
    439448    PolyImpl* res=new PolyImpl(*p1.ptr);
    440449    *res *= n;
    441     return(Poly(*res));
     450    return(PolyBase<v>(*res));
    442451}
    443452
Note: See TracChangeset for help on using the changeset viewer.