Horus Doc || C++ Reference || Class Overview   Pixels   Images   Detector   Geometry   Registry || Doxygen's quick Index  

HxVec2Tem.h

00001 /*
00002  *  Copyright (c) 1998, University of Amsterdam, The Netherlands.
00003  *  All rights reserved.
00004  *
00005  *
00006  *  Author(s):
00007  *  Dennis Koelma (koelma@wins.uva.nl)
00008  *  Edo Poll (poll@wins.uva.nl)
00009  */
00010 
00011 #ifndef HxVec2Tem_h
00012 #define HxVec2Tem_h
00013 
00014 #include <cstdlib>
00015 #include "HxMath.h"
00016 
00017 #include "HxVec2Int.h"
00018 #include "HxVec2Double.h"
00019 
00020 
00023 template<class T>
00024 class HxVec2Tem {
00025 public:
00026                             HxVec2Tem();
00027                             HxVec2Tem(T x, T y);
00028                             HxVec2Tem(const HxVec2Tem<T>& v);
00029 
00030                             HxVec2Tem(int v);
00031                             HxVec2Tem(double v);
00032                             HxVec2Tem(const HxVec2Int& v);
00033                             HxVec2Tem(const HxVec2Double& v);
00034 
00035     void*                   operator new(size_t, void * = 0);
00036 
00037     T                       x() const;
00038     T                       y() const;
00039     T&                      value(int dimension); // dimension: 1 or 2
00040 
00041                             operator int() const;
00042                             operator double() const;
00043                             operator HxVec2Int() const;
00044                             operator HxVec2Double() const;
00045 
00046     HxVec2Tem<T>&           operator+=(const HxVec2Tem<T>& v);
00047     HxVec2Tem<T>&           operator-=(const HxVec2Tem<T>& v);
00048     HxVec2Tem<T>&           operator*=(const HxVec2Tem<T>& v);
00049     HxVec2Tem<T>&           operator/=(const HxVec2Tem<T>& v);
00050 
00051 #ifdef __GNUC__
00052     friend HxVec2Tem<T>  operator+ <>(  const HxVec2Tem<T>& v1,
00053                                             const HxVec2Tem<T>& v2);
00054     friend HxVec2Tem<T>  operator- <>(  const HxVec2Tem<T>& v1,
00055                                             const HxVec2Tem<T>& v2);
00056     friend HxVec2Tem<T>  operator* <>(  const HxVec2Tem<T>& v1,
00057                                             const HxVec2Tem<T>& v2);
00058     friend HxVec2Tem<T>  operator/ <>(  const HxVec2Tem<T>& v1,
00059                                             const HxVec2Tem<T>& v2);
00060 #else
00061     friend inline HxVec2Tem<T>  operator+(  const HxVec2Tem<T>& v1,
00062                                             const HxVec2Tem<T>& v2);
00063     friend inline HxVec2Tem<T>  operator-(  const HxVec2Tem<T>& v1,
00064                                             const HxVec2Tem<T>& v2);
00065     friend inline HxVec2Tem<T>  operator*(  const HxVec2Tem<T>& v1,
00066                                             const HxVec2Tem<T>& v2);
00067     friend inline HxVec2Tem<T>  operator/(  const HxVec2Tem<T>& v1,
00068                                             const HxVec2Tem<T>& v2);
00069 #endif
00070 
00071     STD_OSTREAM&            put(STD_OSTREAM& os) const;
00072 private:
00073     T                       _values[2];
00074 };
00075 
00076 
00077 // these operations need to be declared here otherwise they won't be
00078 // instantiated (friend declarations do not count)
00079 
00080 template<class T>
00081 inline HxVec2Tem<T>
00082 operator+(const HxVec2Tem<T>& v1, const HxVec2Tem<T>& v2);
00083 
00084 template<class T>
00085 inline HxVec2Tem<T>
00086 operator-(const HxVec2Tem<T>& v1, const HxVec2Tem<T>& v2);
00087 
00088 template<class T>
00089 inline HxVec2Tem<T>
00090 operator*(const HxVec2Tem<T>& v1, const HxVec2Tem<T>& v2);
00091 
00092 template<class T>
00093 inline HxVec2Tem<T>
00094 operator/(const HxVec2Tem<T>& v1, const HxVec2Tem<T>& v2);
00095 
00096 template<class T>
00097 inline STD_OSTREAM&
00098 operator<<(STD_OSTREAM &os, const HxVec2Tem<T> v)
00099 {
00100     return v.put(os);
00101 }
00102 
00103 template<class T>
00104 inline
00105 HxVec2Tem<T>::HxVec2Tem() 
00106 { 
00107 }
00108 
00109 template<class T>
00110 inline
00111 HxVec2Tem<T>::HxVec2Tem(T x, T y)
00112 {
00113     _values[0] = x;
00114     _values[1] = y;
00115 }
00116 
00117 template<class T>
00118 inline
00119 HxVec2Tem<T>::HxVec2Tem(const HxVec2Tem<T>& v)
00120 {
00121     _values[0] = v._values[0];
00122     _values[1] = v._values[1];
00123 }
00124 
00125 template<class T>
00126 inline
00127 HxVec2Tem<T>::HxVec2Tem(int v)
00128 {
00129     _values[0] = T(v);
00130     _values[1] = T(v);
00131 }
00132 
00133 template<class T>
00134 inline
00135 HxVec2Tem<T>::HxVec2Tem(double v)
00136 {
00137     _values[0] = T(v);
00138     _values[1] = T(v);
00139 }
00140 
00141 template<class T>
00142 inline
00143 HxVec2Tem<T>::HxVec2Tem(const HxVec2Int& v)
00144 {
00145     _values[0] = T(v.x());
00146     _values[1] = T(v.y());
00147 }
00148 
00149 template<class T>
00150 inline
00151 HxVec2Tem<T>::HxVec2Tem(const HxVec2Double& v)
00152 {
00153     _values[0] = T(v.x());
00154     _values[1] = T(v.y());
00155 }
00156 
00157 template<class T>
00158 inline void*
00159 HxVec2Tem<T>::operator new(size_t size, void *m) 
00160 {
00161     return m ? m : new char[size];
00162 }
00163 
00164 template<class T>
00165 inline T
00166 HxVec2Tem<T>::x() const
00167 {
00168     return _values[0];
00169 }
00170 
00171 template<class T>
00172 inline T
00173 HxVec2Tem<T>::y() const
00174 {
00175     return _values[1];
00176 }
00177 
00178 template<class T>
00179 inline T&
00180 HxVec2Tem<T>::value(int dimension)
00181 {
00182     return _values[dimension - 1];
00183 }
00184 
00185 template<class T>
00186 inline
00187 HxVec2Tem<T>::operator int() const
00188 {
00189     return sqrt(double(_values[0])*_values[0] + double(_values[1])*_values[1]);
00190 }
00191 
00192 template<class T>
00193 inline
00194 HxVec2Tem<T>::operator double() const
00195 {
00196     return sqrt(double(_values[0])*_values[0] + double(_values[1])*_values[1]);
00197 }
00198 
00199 template<class T>
00200 inline
00201 HxVec2Tem<T>::operator HxVec2Int() const
00202 {
00203     return HxVec2Int(int(_values[0]), int(_values[1]));
00204 }
00205 
00206 template<class T>
00207 inline
00208 HxVec2Tem<T>::operator HxVec2Double() const
00209 {
00210     return HxVec2Double(double(_values[0]), double(_values[1]));
00211 }
00212 
00213 template<class T>
00214 inline HxVec2Tem<T>&
00215 HxVec2Tem<T>::operator+=(const HxVec2Tem<T>& v)
00216 {
00217     _values[0] += v._values[0];
00218     _values[1] += v._values[1];
00219     return *this;
00220 }
00221 
00222 template<class T>
00223 inline HxVec2Tem<T>&
00224 HxVec2Tem<T>::operator-=(const HxVec2Tem<T>& v)
00225 {
00226     _values[0] -= v._values[0];
00227     _values[1] -= v._values[1];
00228     return *this;
00229 }
00230 
00231 template<class T>
00232 inline HxVec2Tem<T>&
00233 HxVec2Tem<T>::operator*=(const HxVec2Tem<T>& v)
00234 {
00235     _values[0] *= v._values[0];
00236     _values[1] *= v._values[1];
00237     return *this;
00238 }
00239 
00240 template<class T>
00241 inline HxVec2Tem<T>&
00242 HxVec2Tem<T>::operator/=(const HxVec2Tem<T>& v)
00243 {
00244     _values[0] /= v._values[0];
00245     _values[1] /= v._values[1];
00246     return *this;
00247 }
00248 
00249 template<class T>
00250 inline HxVec2Tem<T>
00251 operator+(const HxVec2Tem<T>& v1, const HxVec2Tem<T>& v2)
00252 {
00253     return HxVec2Tem<T>(v1._values[0] + v2._values[0],
00254                         v1._values[1] + v2._values[1]);
00255 }
00256 
00257 template<class T>
00258 inline HxVec2Tem<T>
00259 operator-(const HxVec2Tem<T>& v1, const HxVec2Tem<T>& v2)
00260 {
00261     return HxVec2Tem<T>(v1._values[0] - v2._values[0],
00262                         v1._values[1] - v2._values[1]);
00263 }
00264 
00265 template<class T>
00266 inline HxVec2Tem<T>
00267 operator*(const HxVec2Tem<T>& v1, const HxVec2Tem<T>& v2)
00268 {
00269     return HxVec2Tem<T>(v1._values[0] * v2._values[0],
00270                         v1._values[1] * v2._values[1]);
00271 }
00272 
00273 template<class T>
00274 inline HxVec2Tem<T>
00275 operator/(const HxVec2Tem<T>& v1, const HxVec2Tem<T>& v2)
00276 {
00277     return HxVec2Tem<T>(v1._values[0] / v2._values[0],
00278                         v1._values[1] / v2._values[1]);
00279 }
00280 
00281 #ifdef INC_TEMPLATE_SRC
00282 #include "HxVec2Tem.c"
00283 #endif
00284 
00285 #endif

Generated on Tue Feb 3 14:18:44 2004 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001