00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef TINY_VECTOR_HPP
00021 #define TINY_VECTOR_HPP
00022
00023 #include <cmath>
00024 #include <typeinfo>
00025 #include <Assert.hpp>
00026
00027 #include <Types.hpp>
00028 #include <StreamCenter.hpp>
00029
00041 template <size_t N, typename T=real_t>
00042 class TinyVector
00043 {
00044 public:
00046 typedef T ValueType;
00047
00048 enum {
00049 Dimension = N
00050 };
00051
00052 protected:
00054 T __x[N];
00055
00056 public:
00057
00063 size_t size() const
00064 {
00065 return N;
00066 }
00067
00075 inline T& operator[](const size_t& i)
00076 {
00077 ASSERT (i<N);
00078 return __x[i];
00079 }
00080
00088 inline const T& operator[](const size_t& i) const
00089 {
00090 ASSERT (i<N);
00091 return __x[i];
00092 }
00093
00101 inline const TinyVector<N, T>& operator = (const TinyVector<N, T>& V)
00102 {
00103 for (size_t i=0; i<N; i++)
00104 __x[i] = V.__x[i];
00105 return (*this);
00106 }
00107
00115 inline const TinyVector<N, T>& operator = (const T& t)
00116 {
00117 for (size_t i=0; i<N; i++)
00118 __x[i] = t;
00119 return (*this);
00120 }
00121
00129 inline TinyVector<N, T> operator*(const T& t) const
00130 {
00131 TinyVector<N, T> W;
00132 for (size_t i=0; i<N; i++)
00133 W.__x[i] = __x[i] * t;
00134 return W;
00135 }
00136
00144 inline real_t operator*(const TinyVector<N,T>& V) const
00145 {
00146 ASSERT(typeid(T) == typeid(real_t));
00147 real_t s=0;
00148 for (size_t i=0; i<N; i++)
00149 s += __x[i] * V.__x[i];
00150 return s;
00151 }
00152
00160 inline const TinyVector<N, T>& operator*=(const T& t)
00161 {
00162 for (size_t i=0; i<N; i++)
00163 __x[i] *= t;
00164 return (*this);
00165 }
00166
00174 inline const TinyVector<N, T>& operator/=(const T& t)
00175 {
00176 const T temp = 1./t;
00177 this->operator*=(temp);
00178 return (*this);
00179 }
00180
00188 inline TinyVector<N, T> operator-(const TinyVector<N, T>& V) const
00189 {
00190 TinyVector<N, T> v = 0;
00191 for (size_t i=0; i<N; i++)
00192 v[i] = __x[i] - V.__x[i];
00193 return v;
00194 }
00195
00203 inline const TinyVector<N, T>& operator-=(const TinyVector<N, T>& V)
00204 {
00205 for (size_t i=0; i<N; i++)
00206 __x[i] -= V.__x[i];
00207 return (*this);
00208 }
00209
00217 inline TinyVector<N, T> operator^(const TinyVector<N, T>& V) const
00218 {
00219 TinyVector<N, T> W=0;
00220 for (size_t i=0; i<N; i++)
00221 W[i] += __x[(i+1)%N] * V.__x[(i+2)%N] - __x[(i+2)%N] * V.__x[(i+1)%N];
00222 return W;
00223 }
00224
00232 inline TinyVector<N, T> operator + (const TinyVector<N, T>& V) const
00233 {
00234 TinyVector<N, T> W(*this);
00235 for (size_t i=0; i<N; i++)
00236 W.__x[i] += V.__x[i];
00237 return W;
00238 }
00239
00247 inline TinyVector<N, T>& operator += (const TinyVector<N, T>& V) {
00248 for (size_t i=0; i<N; i++)
00249 __x[i] += V.__x[i];
00250 return (*this);
00251 }
00252
00263 inline bool operator==(const TinyVector<N, T>& V) const
00264 {
00265 for (size_t i=0; i<N; i++) {
00266 if (__x[i] != V.__x[i]) {
00267 return false;
00268 }
00269 }
00270 return true;
00271 }
00272
00280 inline bool operator!=(const TinyVector<N, T>& V) const
00281 {
00282 for (size_t i=0; i<N; i++) {
00283 if (__x[i] != V.__x[i]) {
00284 return true;
00285 }
00286 }
00287 return false;
00288 }
00289
00299 inline bool operator < (const TinyVector<N,T>& V) const
00300 {
00301 for (size_t i=0; i<N; ++i) {
00302 if(__x[i] != V.__x[i]) {
00303 return (__x[i] < V.__x[i]);
00304 }
00305 }
00306 return false;
00307 }
00308
00317 inline friend TinyVector<N, T> sqrt(const TinyVector<N, T>& V)
00318 {
00319 using namespace std;
00320 TinyVector<N, T> W;
00321 for (size_t i=0; i<N; i++)
00322 W.__x[i] = sqrt(V.__x[i]);
00323 return W;
00324 }
00325
00333 inline friend T Norm(const TinyVector<N, T>& V)
00334 {
00335 T t = 0;
00336 for (size_t i=0; i<N; i++) {
00337 t += V.__x[i]*V.__x[i];
00338 }
00339
00340 using namespace std;
00341 return sqrt(t);
00342 }
00343
00352 inline friend TinyVector<N, T> operator*(const T& a, const TinyVector<N, T>& V)
00353 {
00354 return (V*a);
00355 }
00356
00365 inline friend std::ostream& operator<<(std::ostream& os,
00366 const TinyVector<N, T>& V)
00367 {
00368 ASSERT (N>0);
00369 os << '(';
00370 for (size_t i=0; i<N-1; i++)
00371 os << V[i] << ", ";
00372 os << V[N-1] << ')';
00373 return os;
00374 }
00375
00381 TinyVector()
00382 {
00383 ;
00384 }
00385
00391 TinyVector(const T& t)
00392 {
00393 for (size_t i=0; i<N; i++) {
00394 __x[i] = t;
00395 }
00396 }
00397
00403 TinyVector(const TinyVector<N, T>& V)
00404 {
00405 for (size_t i=0; i<N; i++)
00406 __x[i] = V.__x[i];
00407 }
00408
00413 ~TinyVector()
00414 {
00415 ;
00416 }
00417 };
00418
00428 template <class T>
00429 class TinyVector<3, T>
00430 {
00432 typedef T ValueType;
00433
00434 enum {
00435 Dimension = 3
00436 };
00437
00438 protected:
00440 T __x[3];
00441
00442 public:
00443
00449 inline size_t size() const
00450 {
00451 return 3;
00452 }
00453
00461 inline T& operator[](const size_t& i)
00462 {
00463 ASSERT (i<3);
00464 return __x[i];
00465 }
00466
00474 inline const T& operator[](const size_t& i) const
00475 {
00476 ASSERT (i<3);
00477 return __x[i];
00478 }
00479
00487 inline const TinyVector<3, T>& operator = (const TinyVector<3, T>& V)
00488 {
00489 for (size_t i=0; i<3; i++)
00490 __x[i] = V.__x[i];
00491 return (*this);
00492 }
00493
00501 inline const TinyVector<3, T>& operator = (const T& t)
00502 {
00503 for (size_t i=0; i<3; i++)
00504 __x[i] = t;
00505 return (*this);
00506 }
00507
00515 inline TinyVector<3, T> operator*(const T& t) const
00516 {
00517 TinyVector<3,T> W;
00518 for (size_t i=0; i<3; i++) {
00519 W.__x[i] = __x[i] * t;
00520 }
00521 return W;
00522 }
00523
00531 inline real_t operator*(const TinyVector<3,T>& V) const
00532 {
00533 ASSERT(typeid(T) == typeid(real_t));
00534 real_t s=0;
00535 for (size_t i=0; i<3; i++)
00536 s += __x[i] * V.__x[i];
00537 return s;
00538 }
00539
00547 inline TinyVector<3, T>& operator*=(const T& t)
00548 {
00549 for (size_t i=0; i<3; i++)
00550 __x[i] *= t;
00551 return (*this);
00552 }
00553
00561 inline TinyVector<3, T>& operator/=(const T& t)
00562 {
00563 const T temp = 1./t;
00564 this->operator*=(temp);
00565 return (*this);
00566 }
00567
00575 inline TinyVector<3, T> operator-(const TinyVector<3, T>& V) const
00576 {
00577 TinyVector<3, T> v = 0;
00578 for (size_t i=0; i<3; i++)
00579 v[i] = __x[i] - V.__x[i];
00580 return v;
00581 }
00582
00589 inline TinyVector<3, T> operator-() const
00590 {
00591 return (TinyVector<3, T> (-__x[0],-__x[1],-__x[2]));
00592 }
00593
00601 inline const TinyVector<3, T>& operator-=(const TinyVector<3, T>& V)
00602 {
00603 for (size_t i=0; i<3; i++)
00604 __x[i] -= V.__x[i];
00605 return (*this);
00606 }
00607
00615 inline TinyVector<3, T> operator^(const TinyVector<3, T>& V) const
00616 {
00617 TinyVector<3, T> W(0);
00618 for (size_t i=0; i<3; i++)
00619 W[i] += __x[(i+1)%3] * V.__x[(i+2)%3] - __x[(i+2)%3] * V.__x[(i+1)%3];
00620 return W;
00621 }
00622
00630 inline TinyVector<3, T> operator + (const TinyVector<3, T>& V) const
00631 {
00632 TinyVector<3, T> W(*this);
00633 for (size_t i=0; i<3; i++)
00634 W.__x[i] += V.__x[i];
00635 return W;
00636 }
00637
00645 inline const TinyVector<3, T>& operator += (const TinyVector<3, T>& V)
00646 {
00647 for (size_t i=0; i<3; i++)
00648 __x[i] += V.__x[i];
00649 return (*this);
00650 }
00651
00662 inline bool operator==(const TinyVector<3, T>& V) const
00663 {
00664 return ((__x[0]==V.__x[0])&&(__x[1]==V.__x[1])&&(__x[2]==V.__x[2]));
00665 }
00666
00674 inline bool operator!=(const TinyVector<3, T>& V) const
00675 {
00676 return ((__x[0]!=V.__x[0])||(__x[1]!=V.__x[1])||(__x[2]!=V.__x[2]));
00677 }
00678
00688 inline bool operator < (const TinyVector<3,T>& V) const
00689 {
00690 for (size_t i=0; i<3; ++i) {
00691 if(__x[i] != V.__x[i]) {
00692 return (__x[i] < V.__x[i]);
00693 }
00694 }
00695 return false;
00696 }
00697
00706 inline friend TinyVector<3, T> sqrt(const TinyVector<3, T>& V)
00707 {
00708 using namespace std;
00709 TinyVector<3, T> W;
00710 for (size_t i=0; i<3; i++)
00711 W.__x[i] = sqrt(V.__x[i]);
00712 return W;
00713 }
00714
00722 inline friend real_t Norm(const TinyVector<3, T>& V)
00723 {
00724 ASSERT(typeid(T) == typeid(real_t));
00725 real_t d = 0;
00726 for (size_t i=0; i<3; i++)
00727 d += V.__x[i]*V.__x[i];
00728 using namespace std;
00729 return sqrt(d);
00730 }
00731
00740 inline friend TinyVector<3, T> operator*(const real_t& a,
00741 const TinyVector<3, T>& V)
00742 {
00743 return (V*a);
00744 }
00745
00754 inline friend std::ostream& operator<<(std::ostream& os,
00755 const TinyVector<3, T>& V)
00756 {
00757 os << '(';
00758 for (size_t i=0; i<3-1; i++)
00759 os << V[i] << ", ";
00760 os << V[3-1] << ')';
00761 return os;
00762 }
00763
00771 TinyVector (const T& x1, const T& x2, const T& x3)
00772 {
00773 __x[0] = x1;
00774 __x[1] = x2;
00775 __x[2] = x3;
00776 }
00777
00783 TinyVector()
00784 {
00785 ;
00786 }
00787
00793 TinyVector(const T& t)
00794 {
00795 for (size_t i=0; i<3; i++)
00796 __x[i] = t;
00797 }
00798
00804 TinyVector(const TinyVector<3, T>& V)
00805 {
00806 for (size_t i=0; i<3; i++)
00807 __x[i] = V.__x[i];
00808 }
00809
00814 ~TinyVector()
00815 {
00816 ;
00817 }
00818 };
00819
00829 template<typename T>
00830 class TinyVector<1, T>
00831 {
00833 typedef T ValueType;
00834
00835 enum {
00836 Dimension =1
00837 };
00838 protected:
00840 T __x;
00841 public:
00842
00850 inline operator T&()
00851 {
00852 return __x;
00853 }
00854
00862 inline operator const T&() const
00863 {
00864 return __x;
00865 }
00866
00874 inline T& operator[](const size_t& i)
00875 {
00876 ASSERT(i==0);
00877 return __x;
00878 }
00879
00887 inline const T& operator[](const size_t& i) const
00888 {
00889 ASSERT(i==0);
00890 return __x;
00891 }
00892
00898 inline size_t size() const
00899 {
00900 return 1;
00901 }
00902
00908 TinyVector(const T& y)
00909 : __x(y)
00910 {
00911 ;
00912 }
00913
00919 TinyVector()
00920 {
00921 ;
00922 }
00923
00925
00930 TinyVector(const TinyVector<1, real_t>& V)
00931 : __x(V.__x)
00932 {
00933 ;
00934 }
00935
00940 ~TinyVector()
00941 {
00942 ;
00943 }
00944 };
00945
00946 #endif // TINY_VECTOR_HPP
00947