00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_ALGEBRA_H_VEC_HH
00027 # define MLN_ALGEBRA_H_VEC_HH
00028
00032
00033 # include <mln/algebra/vec.hh>
00034 # include <mln/literal/one.hh>
00035
00036
00037 namespace mln
00038 {
00039
00040
00041 namespace algebra {
00042 template <unsigned d, typename C> struct h_vec;
00043 }
00044
00045
00046 namespace trait
00047 {
00048
00049
00050
00051 template < template <class> class Name,
00052 unsigned d, typename C >
00053 struct set_precise_unary_< Name, algebra::h_vec<d, C> >
00054 {
00055 typedef mln_trait_unary(Name, C) V;
00056 typedef algebra::h_vec<d, V> ret;
00057 };
00058
00059
00060
00061 template < template <class, class> class Name,
00062 unsigned d, typename C,
00063 typename Q >
00064 struct set_precise_binary_< Name,
00065 algebra::h_vec<d, C>, algebra::h_vec<d, Q> >
00066 {
00067 typedef mln_trait_binary(Name, C, Q) V;
00068 typedef algebra::h_vec<d, V> ret;
00069 };
00070
00071 template < template <class, class> class Name,
00072 unsigned d, typename C,
00073 typename S >
00074 struct set_precise_binary_< Name,
00075 algebra::h_vec<d, C>, mln::value::scalar_<S> >
00076 {
00077 typedef mln_trait_binary(Name, C, S) V;
00078 typedef algebra::h_vec<d, V> ret;
00079 };
00080
00081 }
00082
00083
00084
00085 namespace algebra
00086 {
00087
00088
00092 template <unsigned d, typename C>
00093 struct h_vec : public vec<d + 1, C>
00094 {
00096 enum { dim = d };
00097
00099 h_vec();
00101 h_vec(const vec<d+1, C>& other);
00102
00103 h_vec& operator=(const vec<d+1, C>& rhs);
00104
00106 vec<d,C> to_vec() const;
00107 };
00108
00109
00110
00111 # ifndef MLN_INCLUDE_ONLY
00112
00113 template <unsigned d, typename C>
00114 inline
00115 h_vec<d,C>::h_vec()
00116 {
00117
00118
00119
00120
00121 this->data_[d] = literal::one;
00122 }
00123
00124 template <unsigned d, typename C>
00125 inline
00126 h_vec<d,C>::h_vec(const vec<d+1, C>& other)
00127 : vec<d+1, C>(other)
00128 {
00129 }
00130
00131 template <unsigned d, typename C>
00132 inline
00133 h_vec<d,C>& h_vec<d,C>::operator=(const vec<d+1, C>& rhs)
00134 {
00135 if (& rhs == this)
00136 return *this;
00137 this->vec<d+1, C>::operator=(rhs);
00138 return *this;
00139 }
00140
00141 template <unsigned d, typename C>
00142 inline
00143 vec<d,C> h_vec<d,C>::to_vec() const
00144 {
00145 const C w = this->data_[d];
00146 mln_assertion(w != 0);
00147
00148 vec<d,C> tmp;
00149 for (unsigned i = 0; i < d; ++i)
00150 tmp[i] = static_cast<C>(this->data_[i] / w);
00151 return tmp;
00152 }
00153
00154
00155
00156 template <unsigned n, typename T>
00157 inline
00158 h_vec<n, T>
00159 vec<n,T>::to_h_vec() const
00160 {
00161 h_vec<n, T> tmp;
00162 for (unsigned i = 0; i < n; ++i)
00163 tmp[i] = this->data_[i];
00164 tmp[n] = literal::one;
00165 return tmp;
00166 }
00167
00168 # endif // ! MLN_INCLUDE_ONLY
00169
00170 }
00171
00172 }
00173
00174
00175 #endif // ! MLN_ALGEBRA_H_VEC_HH