00001 #ifndef GEAR_Vectors_H
00002 #define GEAR_Vectors_H 1
00003
00004 #include <stdexcept>
00005
00006 namespace gear {
00007
00008
00018 template <int N, typename Float_T=double>
00019 class VectorND_T {
00020
00021 public:
00022
00023 VectorND_T() {} ;
00024
00026 inline Float_T& operator[](unsigned i) {
00027
00028 if( i > N-1 ) throw std::out_of_range( "VectorND_T::operator[]" ) ;
00029
00030 return _c[i] ;
00031 }
00032 inline Float_T operator[](unsigned i) const {
00033
00034 if( i > N-1 ) throw std::out_of_range( "VectorND_T::operator[]" ) ;
00035
00036 return _c[i] ;
00037 }
00038
00039 protected:
00040
00041 Float_T _c[N] ;
00042
00043 };
00044
00045
00047 template <typename Float_T=double>
00048 struct Vector2D_T : public VectorND_T<2,Float_T> {
00049 typedef VectorND_T<2,Float_T> Base ;
00050 Vector2D_T() {
00051 Base::_c[0] = 0. ;
00052 Base::_c[1] = 0. ;
00053 }
00054 Vector2D_T( Float_T c0, Float_T c1 ) {
00055 Base::_c[0] = c0 ;
00056 Base::_c[1] = c1 ;
00057 }
00058 } ;
00059
00061 template <typename Float_T=double>
00062 struct Vector3D_T : public VectorND_T<3,Float_T> {
00063 typedef VectorND_T<3,Float_T> Base ;
00064 Vector3D_T() {
00065 Base::_c[0] = 0. ;
00066 Base::_c[1] = 0. ;
00067 Base::_c[2] = 0. ;
00068 }
00069 Vector3D_T( Float_T c0, Float_T c1, Float_T c2 ) {
00070 Base::_c[0] = c0 ;
00071 Base::_c[1] = c1 ;
00072 Base::_c[2] = c2 ;
00073 }
00074 } ;
00075
00076
00077
00078 typedef Vector2D_T<double> Vector2D ;
00079
00080 typedef Vector3D_T<double> Vector3D ;
00081
00082
00083
00084 }
00085
00086 #endif
00087