Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

int_u.h

Go to the documentation of this file.
00001 // 
00002 // Copyright(c) 1993-1998 Tony Kirke
00003 // author="Tony Kirke" *
00004 /*
00005  * SPUC - Signal processing using C++ - A DSP library
00006  * 
00007  * This program is free software; you can redistribute it and/or modify
00008  * it under the terms of the GNU General Public License as published by
00009  * the Free Software Foundation; either version 2, or (at your option)
00010  * any later version.
00011  * 
00012  * This program is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  * GNU General Public License for more details.
00016  * 
00017  * You should have received a copy of the GNU General Public License
00018  * along with this program; if not, write to the Free Software
00019  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00020 */
00021 #ifndef INTU
00022 #define INTU
00023 #include <spuc.h>
00024 #include <math.h>
00025 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00026 namespace SPUC {
00029 //
00033 class int_u
00034 {
00035         typedef long natural;
00036 
00037         public:
00038           natural q;
00039           natural mask;
00040           natural bits;
00041           natural bitpos;
00042       bool oveflow;
00043 
00044 
00045 //  protected:
00046           int_u() { 
00047                   q = 0;
00048                   bits = 32;
00049                   mask = 0;
00050                   bitpos=0;
00051           }
00052           int_u(natural y) { 
00053                   q = y;
00054                   bits = 32;
00055                   mask = 0;
00056                   bitpos=0;
00057           }
00058 
00059   public:
00060   inline int_u operator =(const int_u& y) {   
00061     q = ~mask & y.q;
00062         return *this; 
00063   } 
00064   inline int_u operator =(const natural& y) {   
00065     q = ~mask & y;
00066         return *this; 
00067   } 
00068 //  friend int_u operator ,(int_u r, int_u l);
00069   friend int_u operator %(int_u r, int_u l);
00070   friend int_u operator %(int_u r, natural l);
00071   friend int_u operator %(natural r, int_u l);
00072   friend int_u operator +(int_u r, int_u l);
00073   friend int_u operator +(int_u r, natural l);
00074   friend int_u operator +(natural r, int_u l);
00075   friend int_u operator -(int_u r, int_u l);
00076   friend int_u operator -(int_u r, natural l);
00077   friend int_u operator -(natural r, int_u l);
00078   friend int_u operator &(int_u r, int_u l);
00079   friend int_u operator &(int_u r, natural l);
00080   friend int_u operator &(natural r, int_u l);
00081   friend int_u operator ^(int_u r, int_u l);
00082   friend int_u operator ^(int_u r, natural l);
00083   friend int_u operator ^(natural r, int_u l);
00084   friend int_u operator |(int_u r, int_u l);
00085   friend int_u operator |(int_u r, natural l);
00086   friend int_u operator |(natural r, int_u l);
00087   friend int_u operator *(int_u r, int_u l);
00088   friend int_u operator *(int_u r, natural l);
00089   friend int_u operator *(natural r, int_u l);
00090   friend int_u operator /(int_u r, int_u l);
00091   friend int_u operator /(natural r, int_u l);
00092   friend int_u operator /(int_u r, natural l);
00093   friend int_u operator <<(int_u r, const natural shift) ;
00094   friend int_u operator >>(int_u r, const natural shift) ;
00095 
00096   int_u operator ++() {
00097   q++;
00098   q &= ~mask;
00099   return *this;  
00100   };
00101   int_u operator ++(int) {
00102   q++;
00103   q &= ~mask;
00104   return *this;  
00105   };
00106   int_u operator --() {
00107   q--;
00108   q &= ~mask;
00109   return *this;  
00110   };
00111   int_u operator --(int) {
00112   q--;
00113   q &= ~mask;
00114   return *this;  
00115   };
00116   int_u operator +=(int_u r) {
00117   q += r.q;
00118   q &= ~mask;
00119   return *this;  
00120   };
00121 
00122   int_u operator -=(int_u r){
00123   q -= r.q;
00124   q &= ~mask;
00125 //  if (  ((mask&q)!=mask) || ((mask&q)!=0) ) q &= ~mask;
00126   return *this;  
00127   };
00128   int_u operator *=(int_u r) {
00129   q *= r.q;
00130   q &= ~mask;
00131   return *this;  
00132   };
00133   int_u operator /=(int_u r){
00134   if (r.q != 0) q = q/r.q;
00135   else    q = 0;
00136   return *this;  
00137   };
00138 
00139   int_u operator <<=(const natural shift)  {
00140           q = q << shift;
00141           q &= ~mask;
00142           return *this;
00143   };
00144   int_u  operator >>=(const natural shift) {
00145           q = q >> shift;
00146           return *this;
00147   }
00148 
00149   int_u operator ^=(int_u r) {
00150   q ^= r.q;
00151   q &= ~mask;
00152   return *this;  
00153   };
00154   int_u operator &=(int_u r) {
00155   q &= r.q;
00156   q &= ~mask;
00157   return *this;  
00158   };
00159   int_u operator |=(int_u r) {
00160   q |= r.q;
00161   q &= ~mask;
00162   return *this;  
00163   };
00164 
00165   inline natural operator ~() {return(~q);}
00166   inline bool operator !() {return(!q);}
00167   inline bool operator ==(int_u r) {  return ((q == r.q));  };
00168   inline bool operator ==(natural r) {  return ((q == r));  };
00169   inline bool operator !=(int_u r) {  return ((q != r.q));  };
00170   inline bool operator !=(natural r) {  return ((q != r));  };
00171   inline bool operator >(int_u r) {  return ((q > r.q));  };
00172   inline bool operator >(natural r) {  return ((q > r));  };
00173   inline bool operator <(int_u r) {  return ((q < r.q));  };
00174   inline bool operator <(natural r) {  return ((q < r));  };
00175   inline int_u magsq(int_u y) { 
00176           int_u x;
00177           x.q = y.q*y.q;
00178           x.mask = -1 << (y.bits * 2);
00179           return(x); 
00180   };
00181 
00182   operator const natural () const {       return(q);  }
00183   operator const double () const {        return((double)q);  }
00185   int_u round(int_u in, natural rbits) {
00186   double scale = 1.0/(double)MASK_BIT(rbits);
00187   return(int_u((natural)floor((double)(scale*in.q)+0.5)));
00188   };
00189 
00191   int_u saturate(int_u in, natural rbits) {
00192         int_u out;
00193         natural low_mask = MASK_LOW(rbits);
00194         if (in.q > low_mask) out.q = low_mask;
00195         else out.q = in.q;
00196         out.mask = ~low_mask; // ?
00197     return(out);
00198   }
00200   int_u clip(int_u in, int_u min_clp, int_u max_clp) {
00201   int_u out = CLIP(in, max_clp, min_clp);
00202   return out;
00203   }
00205   inline bool bit(natural i) { return (q & MASK_BIT(i)) ? 1 : 0; }
00206   // OR reduction of number
00207   bool or_bits(int_u r) {
00208           natural x=r.q;
00209           bool s=0;
00210           for (int i=0;i<bits;i++) { 
00211                 s |= x & 0x1;
00212                 x >>= 1;
00213           }
00214           return(s);
00215   }
00216 };
00217    int_u operator %(int_u r, int_u l) {
00218         int_u x;
00219         x.q = r.q % l.q;
00220         return(x);
00221   }
00222    int_u operator %(int_u r, natural l) {
00223         int_u x;
00224         x.q = r.q % l;
00225         return(x);
00226   }
00227    int_u operator %(natural r, int_u l) {
00228         int_u x;
00229         x.q = r % l.q;
00230         return(x);
00231   }
00232    int_u operator +(int_u r, int_u l) {
00233         int_u x;
00234         x.q = r.q + l.q;
00235         return(x);
00236   }
00237    int_u operator +(int_u r, natural l) {
00238         int_u x;
00239         x.q = r.q + l;
00240         return(x);
00241   }
00242    int_u operator +(natural r, int_u l) {
00243         int_u x;
00244         x.q = r + l.q;
00245         return(x);
00246   }
00247    int_u operator -(int_u r, int_u l) {
00248         int_u x;
00249         x.q = r.q - l.q;
00250         return(x);
00251   }
00252    int_u operator -(int_u r, natural l) {
00253         int_u x;
00254         x.q = r.q - l;
00255         return(x);
00256   }
00257    int_u operator -(natural r, int_u l) {
00258         int_u x;
00259         x.q = r - l.q;
00260         return(x);
00261   }
00262    int_u operator &(int_u r, int_u l) {
00263         int_u x;
00264         x.q = r.q & l.q;
00265         return(x);
00266   }
00267    int_u operator &(int_u r, natural l) {
00268         int_u x;
00269         x.q = r.q & l;
00270         return(x);
00271   }
00272    int_u operator &(natural r, int_u l) {
00273         int_u x;
00274         x.q = r & l.q;
00275         return(x);
00276   }
00277    int_u operator ^(int_u r, int_u l) {
00278         int_u x;
00279         x.q = r.q ^ l.q;
00280         return(x);
00281   }
00282    int_u operator ^(int_u r, natural l) {
00283         int_u x;
00284         x.q = r.q ^ l;
00285         return(x);
00286   }
00287    int_u operator ^(natural r, int_u l) {
00288         int_u x;
00289         x.q = r ^ l.q;
00290         return(x);
00291   }
00292    int_u operator |(int_u r, int_u l) {
00293         int_u x;
00294         x.q = r.q | l.q;
00295         return(x);
00296   }
00297    int_u operator |(int_u r, natural l) {
00298         int_u x;
00299         x.q = r.q | l;
00300         return(x);
00301   }
00302    int_u operator |(natural r, int_u l) {
00303         int_u x;
00304         x.q = r | l.q;
00305         return(x);
00306   }
00307    int_u operator *(int_u r, int_u l) {
00308         int_u x;
00309         x.q = r.q*l.q;
00310         return(x);  
00311   };
00312    int_u operator *(int_u r, natural l) {
00313         int_u x;
00314         x.q = r.q*l;
00315         return(x);  
00316   };
00317    int_u operator *(natural r, int_u l) {
00318         int_u x;
00319         x.q = r*l.q;
00320         return(x);  
00321   };
00322    int_u operator /(int_u r, int_u l) {
00323         int_u x;
00324         x.q = r.q/l.q;
00325         return(x);  
00326   };
00327    int_u operator /(natural r, int_u l) {
00328         int_u x;
00329         x.q = r/l.q;
00330         return(x);  
00331   };
00332    int_u operator /(int_u r, natural l) {
00333         int_u x;
00334         x.q = r.q/l;
00335         return(x);  
00336   };
00337 
00338    int_u operator <<(int_u r, const natural shift)  {
00339           int_u x;
00340           x.q = r.q << shift;
00341           x.mask = r.mask << shift;
00342           x.bits = r.bits + shift;
00343           return(x);
00344   };
00345    int_u operator >>(int_u r, const natural shift)  {
00346           int_u x;
00347           x.q = r.q >> shift;
00348           x.mask = r.mask >> shift;
00349           x.bits = r.bits - shift;
00350           return(x);
00351   };
00352   int_u operator ,(int_u r, int_u l) {
00353         int_u x;
00354         x.q = (r.q << l.bits) | l.q;
00355         return(x);
00356   }
00357 } // namespace SPUC 
00358 #endif
00359 #endif

Generated on Fri Sep 16 11:02:27 2005 for spuc by  doxygen 1.4.4