00001 #ifndef __INSTANTIO_VEC2_H
00002 #define __INSTANTIO_VEC2_H
00003
00004 #ifdef _MSC_VER
00005 # pragma once
00006 #endif
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "InstantIODef.h"
00027 #include "TypeName.h"
00028 #ifdef _MSC_VER
00029 # pragma warning (push)
00030 # pragma warning (disable: 4351)
00031 #endif
00032
00033
00034 namespace InstantIO
00035 {
00036
00037
00056 template <class T> class Vec2
00057 {
00058 public:
00059
00064 inline Vec2(): vec_()
00065 { vec_[0] = vec_[1] = 0.f; }
00066
00073 inline Vec2(T x, T y): vec_()
00074 { vec_[0] = x; vec_[1] = y; }
00075
00084 inline Vec2(const T *vec): vec_()
00085 { vec_[0] = vec[0]; vec_[1] = vec[1]; }
00086
00092 inline Vec2(const Vec2 &vec): vec_()
00093 { vec_[0] = vec.vec_[0]; vec_[1] = vec.vec_[1]; }
00094
00101 inline const Vec2 &operator=(const Vec2 &vec)
00102 {
00103 vec_[0] = vec.vec_[0]; vec_[1] = vec.vec_[1];
00104 return vec;
00105 }
00106
00115 inline const T *operator=(const T *vec)
00116 {
00117 vec_[0] = vec[0]; vec_[1] = vec[1];
00118 return vec;
00119 }
00120
00125 inline void setX(T x) { vec_[0] = x; }
00126
00131 inline T getX() const { return vec_[0]; }
00132
00137 inline void setY(T y) { vec_[1] = y; }
00138
00143 inline T getY() const { return vec_[1]; }
00144
00150 inline void set(T x, T y)
00151 { vec_[0] = x; vec_[1] = y; }
00152
00160 inline void set(const T *vec)
00161 { vec_[0] = vec[0]; vec_[1] = vec[1]; }
00162
00167 void set(const Vec2 &vec)
00168 {
00169 vec_[0] = vec.vec_[0];
00170 vec_[1] = vec.vec_[1];
00171 }
00172
00178 inline void get(T &x, T &y) const
00179 { x = vec_[0]; y = vec_[1]; }
00180
00189 inline void get(T *vec) const
00190 { vec[0] = vec_[0]; vec[1] = vec_[1]; }
00191
00197 inline void get(Vec2 &vec) const
00198 { vec.vec_[0] = vec_[0]; vec.vec_[1] = vec_[1]; }
00199
00206 inline const T *get() const { return vec_; }
00207
00214 inline T *get() { return vec_; }
00215
00221 inline T operator[](int i) const { return vec_[i]; }
00222
00228 inline T &operator[](int i) { return vec_[i]; }
00229
00234 inline operator T *() { return &vec_[0]; }
00235
00240 inline operator const T *() const { return &vec_[0]; }
00241
00249 friend inline bool operator==(const Vec2 &a, const Vec2 &b)
00250 {
00251 return (a.vec_[0] == b.vec_[0]) && (a.vec_[1] == b.vec_[1]);
00252 }
00253
00261 friend inline bool operator!=(const Vec2 &a, const Vec2 &b)
00262 {
00263 return (a.vec_[0] != b.vec_[0]) || (a.vec_[1] != b.vec_[1]);
00264 }
00265
00266 private:
00267
00269 T vec_[2];
00270 };
00271
00272
00273 typedef Vec2<double> Vec2d;
00274
00275
00276 typedef Vec2<float> Vec2f;
00277
00278
00285 template <>
00286 class INSTANTIO_DLLMAPPING TypeName<Vec2d>
00287 {
00288 public:
00289
00294 static const char *getName();
00295
00296 private:
00297
00299 TypeName();
00300
00302 TypeName(const TypeName &);
00303
00305 const TypeName &operator=(const TypeName &);
00306 };
00307
00308
00315 template <>
00316 class INSTANTIO_DLLMAPPING TypeName<Vec2f>
00317 {
00318 public:
00319
00324 static const char *getName();
00325
00326 private:
00327
00329 TypeName();
00330
00332 TypeName(const TypeName &);
00333
00335 const TypeName &operator=(const TypeName &);
00336 };
00337
00338
00339 }
00340
00341
00342 #ifdef _MSC_VER
00343 # pragma warning (pop)
00344 #endif
00345
00346 #endif // __INSTANTIO_VEC2F_H