00001
00002
00003
00004
00005
00006
00007
00008
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);
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
00078
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