GURLS++  2.0.00
C++ Implementation of GURLS Matlab Toolbox
basearray.hpp
00001 
00002 namespace gurls {
00003 
00004 // IMPLEMENTATION OF TEMPLATE METHODS
00005 
00006 template <typename T>
00007 BaseArray<T>::BaseArray(const BaseArray<T>& other) {
00008     // TO BE DISCUSSED: do we need to allocate memory here?
00009     // this->alloc(other.size);
00010     *this = other;
00011 }
00012 
00013 template <typename T>
00014 BaseArray<T>& BaseArray<T>::operator=(const BaseArray<T>& other) {
00015     if (this == &other) {
00016         return *this;
00017     } else {
00018         this->alloc(other.size);
00019         this->set(other.data, other.size);
00020     }
00021 }
00022 
00023 template <typename T>
00024 
00025 BaseArray<T>& BaseArray<T>::operator=(const T& val) {
00026     T* end = &(this->data[this->size]);
00027     for (T* ptr = this->data; ptr != end; ++ptr) {
00028         *ptr = val;
00029     }
00030     return *this;
00031 }
00032 
00033 
00034 template <typename T>
00035 void BaseArray<T>::alloc(unsigned long n) {
00036     this->isowner = true;
00037     this->size = n;
00038     if ( this->size > 0 )
00039         this->data = new T[this->size];
00040 }
00041 
00042 template <typename T>
00043 void BaseArray<T>::set(const T* buf, unsigned long n, unsigned long start) {
00044     // An exception should be raised here instead of using assert
00045     assert(n <= (this->size - start));
00046     std::memcpy((this->data)+start, buf, n*sizeof(T));
00047 }
00048 
00049 
00050 template <typename T>
00051 void BaseArray<T>::randomize(){
00052     T* d = this->data;
00053     for (unsigned long i = 0; i < this->size; i++) {
00054         *d++ = (T)std::rand()/RAND_MAX;
00055     }
00056 }
00057 
00058 template <typename T>
00059 void BaseArray<T>::resize(unsigned long n) {
00060     if (! this->isowner) {
00061         throw gException("It is not possible to resize an array that is not the owner of its data.");
00062     }
00063     else if (n != this->size) {
00064         T* tmp = this->data;
00065         unsigned long oldsize = this->size;
00066         this->alloc(n);
00067         this->set(tmp, std::min(n, oldsize));
00068         if(tmp != NULL)
00069             delete[] tmp;
00070     };
00071 }
00072 
00073 template <typename T>
00074 void BaseArray<T>::asarray(T * buf, unsigned long n) const {
00075     if (n > this->size) {
00076         throw gException("The length of the array is smaller than the required number of elements to be copied.");
00077     }
00078     std::memcpy(buf, this->data, n*sizeof(T));
00079 }
00080 
00081 
00082 /*
00083   template <typename T>
00084   BaseArray<T> BaseArray<T>::operator-() const {
00085   //return static_cast<T>(-1)*(*this);
00086   BaseArray<T> copy(*this);
00087   return copy *= -1;
00088   }
00089 */
00090 
00091 template <typename T>
00092 BaseArray<T>& BaseArray<T>::operator+=(T val) {
00093     T* ptr = this->data;
00094     for (unsigned long i = 0; i < this->size; ++i, ++ptr) {
00095         *ptr += val;
00096     }
00097     return *this;
00098 }
00099 
00100 template <typename T>
00101 BaseArray<T>& BaseArray<T>::operator-=(T val) {
00102     return *this += (-val);
00103 }
00104 
00105 template <typename T>
00106 BaseArray<T>& BaseArray<T>::operator*=(T val) {
00107     T* ptr = this->data;
00108     for (unsigned long i = 0; i < this->size; ++i, ++ptr) {
00109         *ptr *= val;
00110     }
00111     return *this;
00112 }
00113 
00114 template <typename T>
00115 BaseArray<T>& BaseArray<T>::operator/=(T val) {
00116     T* ptr = this->data;
00117     for (int i = 0; i < this->size; ++i, ++ptr) {
00118         *ptr /= val;
00119     }
00120     return *this;
00121 }
00122 
00123 template <typename T>
00124 BaseArray<T>& BaseArray<T>::add(const BaseArray<T>& v) {
00125     T *ptr = this->data, *ptr_v = v.data;
00126     for (unsigned long i = 0; i < this->size; ++i, ++ptr, ++ptr_v) {
00127         *ptr += *ptr_v;
00128     }
00129     return *this;
00130 }
00131 
00132 template <typename T>
00133 BaseArray<T>& BaseArray<T>::subtract(const BaseArray<T>& v) {
00134     T *ptr = this->data, *ptr_v = v.data;
00135     for (int i = 0; i < this->size; ++i, ++ptr, ++ptr_v) {
00136         *ptr -= *ptr_v;
00137     }
00138     return *this;
00139 }
00140 
00141 template <typename T>
00142 BaseArray<T>& BaseArray<T>::multiply(const BaseArray<T>& v) {
00143     T *ptr = this->data, *ptr_v = v.data;
00144     for (unsigned long i = 0; i < this->size; ++i, ++ptr, ++ptr_v) {
00145         *ptr *= *ptr_v;
00146     }
00147     return *this;
00148 }
00149 
00150 template <typename T>
00151 BaseArray<T>& BaseArray<T>::divide(const BaseArray<T>& v) {
00152     T *ptr = this->data, *ptr_v = v.data;
00153     for (unsigned long i = 0; i < this->size; ++i, ++ptr, ++ptr_v) {
00154         *ptr /= *ptr_v;
00155     }
00156     return *this;
00157 }
00158 
00162 template <typename U>
00163 bool operator== (const BaseArray<U>& v, const U& val) {
00164     U *ptr = v.data;
00165     for (unsigned int i = 0; i < v.size; ++i, ++ptr) {
00166         if (*ptr != val){
00167             return false;
00168         }
00169     }
00170     return true;
00171 }
00172 
00173 template <typename T>
00174 bool BaseArray<T>::closeTo(const BaseArray<T>& other, T tolerance) const {
00175     if (this->size != other.size) {
00176         return false;
00177     }
00178     T *ptr0 = this->data, *ptr1 = other.data;
00179     for (unsigned int i = 0; i < this->size; ++ptr0, ++ptr1, ++i) {
00180         if (std::fabs(*ptr0 - *ptr1) > tolerance) {
00181             return false;
00182         }
00183     }
00184     return true;
00185 }
00186 
00187 template <typename T>
00188 const T& BaseArray<T>::max() const {
00189     if (this->size == 0){return *new T(std::numeric_limits<T>::max());}
00190     const T* val = std::max_element(&(this->data[0]), &(this->data[this->size]));
00191     return *val;
00192 }
00193 
00194 template <typename T>
00195 const T& BaseArray<T>::min() const {
00196     if (this->size == 0){return *new T(std::numeric_limits<T>::min());}
00197     const T* val = std::min_element(&(this->data[0]), &(this->data[this->size]));
00198     return *val;
00199 }
00200 
00201 template <typename T>
00202 T BaseArray<T>::sum() const{
00203 
00204     T* ptr = this->data;
00205     T* endptr = this->data+this->size;
00206 
00207     T sum = (T)0.0;
00208 
00209     while(ptr != endptr)
00210         sum+=*ptr++;
00211 
00212     return sum;
00213 }
00214 
00215 
00216 template <typename T>
00217 BaseArray<T>& BaseArray<T>::setReciprocal() {
00218     T* ptr = this->data;
00219     T* endptr = this->data+this->size;
00220     T one = static_cast<T>(1.0);
00221     while(ptr != endptr){
00222         *ptr = one / *ptr;
00223         ++ptr;
00224     }
00225     return *this;
00226 }
00227 
00228 template <typename T>
00229 template<class Archive>
00230 void BaseArray<T>::save(Archive & ar, const unsigned int /* file_version */) const{
00231     ar & this->size & this->isowner;
00232     T* ptr = this->data;
00233     T* ptr_end = this->data+this->size;
00234     while (ptr!=ptr_end){
00235         ar & *ptr++;
00236     }
00237 }
00238 
00239 template <typename T>
00240 template<class Archive>
00241 void BaseArray<T>::load(Archive & ar, const unsigned int /* file_version */){
00242     ar & this->size;
00243     ar & this->isowner;
00244     this->data = new T[this->size];
00245     T* ptr = this->data;
00246     T* ptr_end = this->data+this->size;
00247     while (ptr!=ptr_end){
00248         ar & *ptr++;
00249     }
00250 }
00251 
00252 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends