![]() |
GURLS++
2.0.00
C++ Implementation of GURLS Matlab Toolbox
|
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 }