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

Generated on Tue Jan 8 13:59:18 2002 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001