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
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);
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
00076
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