00001 #ifndef GEOM_FSVECTOR_H
00002 #define GEOM_FSVECTOR_H
00003 #include "patterns.h"
00004
00005
00006
00007 template <class K, unsigned n >
00008 struct fsvector
00009 {
00010 typedef K field;
00011 typedef K value_type;
00012 typedef unsigned size_type;
00013 typedef unsigned index_t;
00014 static const int dimension = n;
00015 K _data[n];
00016 public:
00017 const K * data() const { return _data; };
00018 const unsigned size() const { return n; };
00019
00020
00021 fsvector();
00022 fsvector( const K& k ) ;
00023 fsvector( const K * src ) ;
00024
00025
00026 K& operator[]( unsigned i ) ;
00027 const K& operator[]( unsigned i ) const ;
00028 K * begin() { return &(_data[0]); };
00029
00030
00031
00032 fsvector& operator+=( const fsvector& v ) ;
00033 fsvector& operator-=( const fsvector& v ) ;
00034 fsvector& operator*=( const K& k ) ;
00035 fsvector& operator/=( const K& k ) ;
00036 fsvector& operator/=( const fsvector& v ) ;
00037 fsvector& operator%=( const fsvector& v ) ;
00038
00039 fsvector operator-( ) const;
00040 fsvector operator+( const fsvector& v ) const;
00041 fsvector operator-( const fsvector& v ) const;
00042
00043
00044 K operator*( const fsvector& v ) const;
00045
00046 fsvector operator^( const fsvector& v ) const;
00047
00048 };
00049
00050
00051
00052
00053
00054 template<class K, unsigned n>
00055 inline bool operator< ( const fsvector<K,n>& v0, const fsvector<K,n>& v1 )
00056 { return lexicographic_comp(v0,v1,n,n,1,1) == -1; };
00057 template<class K, unsigned n>
00058 inline bool operator<=( const fsvector<K,n>& v0, const fsvector<K,n>& v1 )
00059 { return lexicographic_comp(v0,v1,n,n,1,1) <= 0; };
00060 template<class K, unsigned n>
00061 inline bool operator> ( const fsvector<K,n>& v0, const fsvector<K,n>& v1 )
00062 { return lexicographic_comp(v0,v1,n,n,1,1) == 1; };
00063 template<class K, unsigned n>
00064 inline bool operator>=( const fsvector<K,n>& v0, const fsvector<K,n>& v1 )
00065 { return lexicographic_comp(v0,v1,n,n,1,1) >= 0; };
00066
00067
00068 template<class K, unsigned n> inline K
00069 norm_euc( const fsvector<K,n>& v )
00070 {
00071 K r;
00072 patterns::norm_euc(r,v,n,1);
00073 return r;
00074 };
00075
00076 template<class K,unsigned n> inline void
00077 norm_euc( K& r, const fsvector<K,n>& v )
00078 { norm_euc( r, v, n,1 ); };
00079 template<class K,unsigned n> inline void
00080 norm_max( K& r, const fsvector<K,n>& v )
00081 { norm_max(r,v, n,1); };
00082
00083
00084
00085 template<class K,unsigned n>
00086 inline
00087 fsvector<K,n>::fsvector<K,n>(){};
00088
00089 template<class K,unsigned n>
00090 inline
00091 fsvector<K,n>::fsvector<K,n>( const K& k )
00092 {
00093 patterns::fill(*this,k,n);
00094 };
00095
00096 template<class K,unsigned n>
00097 inline
00098 fsvector<K,n>::fsvector<K,n>( const K * src )
00099 {
00100 patterns::copy(*this,src,n);
00101 };
00102
00103 template<class K,unsigned n>
00104 inline K&
00105 fsvector<K,n>::operator[]( unsigned i )
00106 {
00107 return _data[i];
00108 };
00109
00110 template<class K,unsigned n>
00111 inline const K&
00112 fsvector<K,n>::operator[]( unsigned i ) const
00113 {
00114 return _data[i];
00115 };
00116
00117
00118
00119 template<class K,unsigned n>
00120 inline fsvector<K,n>&
00121 fsvector<K,n>::operator+=( const fsvector& v )
00122 {
00123 patterns::padd1(*this,v,n);
00124 return (*this);
00125 };
00126
00127 template<class K,unsigned n>
00128 inline fsvector<K,n>&
00129 fsvector<K,n>::operator-=( const fsvector& v )
00130 {
00131 patterns::psub1(*this,v,n);
00132 return (*this);
00133 };
00134
00135 template<class K,unsigned n>
00136 inline fsvector<K,n>&
00137 fsvector<K,n>::operator*=( const K& k )
00138 {
00139 patterns::smul1(*this,k,n);
00140 return (*this);
00141 };
00142
00143 template<class K,unsigned n>
00144 inline fsvector<K,n>&
00145 fsvector<K,n>::operator/=( const K& k )
00146 {
00147 patterns::sdiv1(*this,k,n);
00148 return (*this);
00149 };
00150
00151 template<class K,unsigned n>
00152 inline fsvector<K,n>
00153 fsvector<K,n>::operator-() const
00154 {
00155 fsvector<K,n> temp;
00156 patterns::neg2(temp,*this,n);
00157 return temp;
00158 };
00159
00160 template<class K,unsigned n>
00161 inline fsvector<K,n>
00162 fsvector<K,n>::operator+( const fsvector<K,n>& v ) const
00163 {
00164 fsvector<K,n> temp;
00165 patterns::padd2(temp,*this,v,n);
00166 return temp;
00167 };
00168
00169 template<class K,unsigned n>
00170 inline fsvector<K,n>
00171 fsvector<K,n>::operator-( const fsvector<K,n>& v ) const
00172 {
00173 fsvector<K,n> temp;
00174 patterns::psub2(temp,*this,v,n);
00175 return temp;
00176 };
00177
00178 template<class K,unsigned n>
00179 inline K fsvector<K,n>::operator*( const fsvector<K,n>& v ) const
00180 {
00181 K temp;
00182 patterns::dot(temp,*this,v,n);
00183 return temp;
00184 };
00185
00186 template<class K,unsigned n>
00187 inline void crossprod( fsvector<K,n>& res,
00188 const fsvector<K,n>& a, const fsvector<K,n>& b )
00189 { patterns::cross(res,a,b,n); };
00190
00191
00192 template<class K,unsigned n>
00193 inline fsvector<K,n>
00194 fsvector<K,n>::operator^( const fsvector<K,n>& v ) const
00195 {
00196 fsvector<K,n> temp;
00197 crossprod( temp, *this, v );
00198 return temp;
00199 };
00200
00201 template<class K,unsigned n>
00202 inline fsvector<K,n>
00203 operator*( const K& k, const fsvector<K,n>& v )
00204 {
00205 fsvector<K,n> temp;
00206 patterns::smul2(temp,v,k,n);
00207 return temp;
00208 };
00209
00210 template<class K,unsigned n>
00211 inline fsvector<K,n>
00212 operator*( const fsvector<K,n>& v, const K& k )
00213 {
00214 fsvector<K,n> temp;
00215 patterns::smul2(temp,v,k,n);
00216 return temp;
00217 };
00218
00219 template<class K,unsigned n>
00220 inline fsvector<K,n>
00221 operator/( const fsvector<K,n>& v, const K& k )
00222 {
00223 fsvector<K,n> temp;
00224 patterns::sdiv2(temp,v,k,n);
00225 return temp;
00226 };
00227
00228 template<class K,unsigned n>
00229 inline std::ostream&
00230 operator<<( std::ostream& out, const fsvector<K,n>& v )
00231 {
00232 out << "( ";
00233 for ( unsigned i = 0; i < n; i++ )
00234 out << v[i] << " ";
00235 out << ')';
00236 return out;
00237 };
00238
00239
00240 template<class K,unsigned n>
00241 inline K norm_max( const fsvector<K,n>& v )
00242 {
00243 K temp;
00244 patterns::norm_max(temp,v,n,1);
00245 return temp;
00246 };
00247
00248 #ifndef PIPO
00249 template< class number, unsigned size >
00250 inline void
00251 scale( fsvector< number, size >& v, const fsvector< number, size>& s )
00252 { patterns::pmul1( v.data(), s.data(), size ); };
00253
00254 template< class number, unsigned size >
00255 inline void
00256 inv ( fsvector< number, size >& v )
00257 { patterns::inv1( v.data(), size ); };
00258 #endif
00259 #endif
00260
00261
00262
00263