00001 #include "vuFixel.h"
00002
00003
00004 template <int S, class T>
00005 vuFixel<S,T>::vuFixel()
00006 {
00007 for(int i=0;i<S;++i) m_buffer[i] = (T)0;
00008 }
00009
00010 template <int S, class T>
00011 vuFixel<S,T>::vuFixel(const vuFixel<S,T>& inst)
00012 {
00013 for(int i=0;i<S;++i) m_buffer[i] = inst.m_buffer[i];
00014 }
00015
00016 template <int S, class T>
00017 vuFixel<S,T>::vuFixel(const T *array)
00018 {
00019 for(int i=0;i<S;++i) m_buffer[i] = array[i];
00020 }
00021
00022 template <int S, class T>
00023 vuFixel<S,T>::vuFixel(const T value)
00024 {
00025 for(int i=0;i<S;++i) m_buffer[i] = value;
00026 }
00027
00028 template <int S, class T>
00029 vuFixel<S,T>::~vuFixel()
00030 {
00031 }
00032
00033 template <int S, class T>
00034 T& vuFixel<S,T>::operator[](unsigned int index)
00035 {
00036 return m_buffer[index];
00037 }
00038
00039 template <int S, class T>
00040 T vuFixel<S,T>::operator[](unsigned int index) const
00041 {
00042 return m_buffer[index];
00043 }
00044
00045 template <int S, class T>
00046 T *vuFixel<S,T>::getBuffer()
00047 {
00048 return m_buffer;
00049 }
00050
00051 template <int S, class T>
00052 T const *vuFixel<S,T>::getBuffer() const
00053 {
00054 return m_buffer;
00055 }
00056
00057 template <int S, class T>
00058 vuFixel<S,T>& vuFixel<S,T>::operator=(const T* rhs)
00059 {
00060 for(int i=0;i<S;++i) m_buffer[i] = rhs[i];
00061 return *this;
00062 }
00063
00064 template <int S, class T>
00065 vuFixel<S,T>& vuFixel<S,T>::operator=(T* rhs)
00066 {
00067 for(int i=0;i<S-1;++i) m_buffer[i] = rhs[i];
00068 return *this;
00069 }
00070
00071 template <int S, class T>
00072 vuFixel<S,T>& vuFixel<S,T>::operator=(const vuFixel<S,T>& rhs)
00073 {
00074 if (this != &rhs) {
00075 for(int i=0;i<S;++i) m_buffer[i] = rhs.m_buffer[i];
00076 }
00077 return *this;
00078 }
00079
00080 template <int S, class T>
00081 bool vuFixel<S,T>::operator==(const vuFixel<S,T>& rhs) const
00082 {
00083 for(int i=0;i<S;++i)
00084 if(!m_buffer[i] == rhs[i]) return false;
00085 return true;
00086 }
00087
00088 template <int S, class T>
00089 vuFixel<S,T> vuFixel<S,T>::operator+(const vuFixel<S,T>& rhs) const
00090 {
00091 vuFixel<S,T> ret;
00092 for(int i=0;i<S;++i)
00093 ret.m_buffer[i] = m_buffer[i] + rhs.m_buffer[i];
00094 return ret;
00095 }
00096
00097 template <int S, class T>
00098 vuFixel<S,T> vuFixel<S,T>::operator+(T a) const
00099 {
00100 vuFixel<S,T> ret;
00101 for(int i=0;i<S-1;++i)
00102 ret.m_buffer[i] = m_buffer[i] + a;
00103 return ret;
00104 }
00105
00106 template <int S, class T>
00107 vuFixel<S,T> vuFixel<S,T>::operator-(const vuFixel<S,T>& rhs) const
00108 {
00109 vuFixel<S,T> ret;
00110 for(int i=0;i<S;++i)
00111 ret.m_buffer[i] = m_buffer[i] - rhs.m_buffer[i];
00112 return ret;
00113 }
00114
00115 template <int S, class T>
00116 vuFixel<S,T> vuFixel<S,T>::operator*(const vuFixel<S,T>& rhs) const
00117 {
00118 vuFixel<S,T> ret;
00119 for(int i=0;i<S;++i)
00120 ret.m_buffer[i] = m_buffer[i] * rhs.m_buffer[i];
00121 return ret;
00122 }
00123
00124 template <int S, class T>
00125 vuFixel<S,T> vuFixel<S,T>::operator/(const vuFixel<S,T>& rhs) const
00126 {
00127 vuFixel<S,T> ret;
00128 for(int i=0;i<S;++i)
00129 ret.m_buffer[i] = m_buffer[i] / rhs.m_buffer[i];
00130 return ret;
00131 }
00132
00133 template <int S, class T>
00134 vuFixel<S,T> vuFixel<S,T>::operator*(T rhs) const
00135 {
00136 vuFixel<S,T> ret;
00137 for(int i=0;i<S;++i)
00138 ret.m_buffer[i] = m_buffer[i] * rhs;
00139 return ret;
00140 }
00141
00142 template <int S, class T>
00143 vuFixel<S,T>& vuFixel<S,T>::operator+=(const vuFixel<S,T>& rhs)
00144 {
00145 for(int i=0;i<S;++i)
00146 m_buffer[i] += rhs.m_buffer[i];
00147 return *this;
00148 }
00149
00150 template <int S, class T>
00151 vuFixel<S,T>& vuFixel<S,T>::operator-=(const vuFixel<S,T>& rhs)
00152 {
00153 for(int i=0;i<S;++i)
00154 m_buffer[i] -= rhs.m_buffer[i];
00155 return *this;
00156 }
00157
00158 template <int S, class T>
00159 vuFixel<S,T>& vuFixel<S,T>::operator*=(const vuFixel<S,T>& rhs)
00160 {
00161 for(int i=0;i<S;++i)
00162 m_buffer[i] *= rhs.m_buffer[i];
00163 return *this;
00164 }
00165
00166 template <int S, class T>
00167 vuFixel<S,T>& vuFixel<S,T>::operator/=(const vuFixel<S,T>& rhs)
00168 {
00169 for(int i=0;i<S;++i)
00170 m_buffer[i] /= rhs.m_buffer[i];
00171 return *this;
00172 }
00173
00174 template <int S, class T>
00175 vuFixel<S,T>& vuFixel<S,T>::operator*=(T rhs)
00176 {
00177 for(int i=0;i<S;++i)
00178 m_buffer[i] *= rhs;
00179 return *this;
00180 }
00181
00182 template <int S, class T>
00183 vuFixel<S,T>& vuFixel<S,T>::operator/=(T rhs)
00184 {
00185 for(int i=0;i<S;++i)
00186 m_buffer[i] /= rhs;
00187 return *this;
00188 }
00189
00190 template <int S, class T>
00191 word vuFixel<S,T>::size() const
00192 {
00193 return S;
00194 }
00195
00196 template <int S, class T>
00197 T vuFixel<S,T>::maxComponent() const
00198 {
00199 T maxc = m_buffer[0];
00200 for(int i=1;i<S;++i)
00201 if(maxc<m_buffer[i]) maxc=m_buffer[i];
00202 return maxc;
00203 }
00204
00205 template <int S, class T>
00206 T vuFixel<S,T>::minComponent() const
00207 {
00208 T minc = m_buffer[0];
00209 for(int i=1;i<S;++i)
00210 if(minc>m_buffer[i]) minc=m_buffer[i];
00211 return minc;
00212 }
00213
00214
00215
00216
00217
00218
00219 #if 0
00220 template <int S, class T> friend vuFixel<S,T>
00221 operator*(T lhs, const vuFixel<S,T>& rhs)
00222 {
00223 vuFixel<S,T> ret;
00224 for(int i=0;i<S;++i)
00225 ret.m_buffer[i] = rhs.m_buffer[i] * lhs;
00226 return ret;
00227 }
00228
00229 template <int S, class T>
00230 friend ostream& operator<<(ostream& os, const vuFixel<S,T>& A)
00231 {
00232 const T *dat = A.m_buffer;
00233 os << "[" << (double)*(dat++);
00234 for (int i=1;i<S;i++,dat++)
00235 os << ", " << (double)(*dat);
00236 os << "]";
00237 return os;
00238 }
00239
00240 template <int S, class T>
00241 friend istream& operator>>(istream& is, vuFixel<S,T>& A)
00242 {
00243 T *dat = A.m_buffer;
00244 for (int i=0; i<S;i++,dat++)
00245 is >> (*dat);
00246 return is;
00247 }
00248
00249 template <int S, class T>
00250 istream& vuFixel<S,T>::read(istream& is)
00251 {
00252 T *dat = m_buffer;
00253 for (int i=0;i<S;i++,dat++)
00254 is >> (*dat);
00255 return is;
00256 }
00257
00258 template <int S, class T>
00259 ostream& vuFixel<S,T>::write(ostream& os) const
00260 {
00261 const T *dat = m_buffer;
00262 for (int i=0;i<S;i++,dat++)
00263 os << (*dat) << " ";
00264 return os;
00265 }
00266
00267 #endif