28 #ifndef SHARK_LINALG_BLAS_KERNELS_VECTOR_ASSIGN_HPP 29 #define SHARK_LINALG_BLAS_KERNELS_VECTOR_ASSIGN_HPP 31 #include "../detail/functional.hpp" 32 #include "../expression_types.hpp" 38 template<
template <
class T1,
class T2>
class F,
class V>
40 typedef F<typename V::iterator::reference, typename V::value_type> Function;
42 typedef typename V::iterator iterator;
43 iterator end = v().end();
44 for (iterator it = v().begin(); it != end; ++it){
54 template<
class V,
class E>
57 dense_random_access_iterator_tag, dense_random_access_iterator_tag
60 for(std::size_t i = 0; i != v().size(); ++i){
61 v()(i) = static_cast<typename V::value_type>(e()(i));
65 template<
class V,
class E>
68 dense_random_access_iterator_tag, packed_random_access_iterator_tag
71 typedef typename E::const_iterator EIterator;
72 typedef typename V::scalar_type scalar_type;
73 EIterator eiter = e.begin();
74 EIterator eend = e.end();
81 EIterator viter = v.begin();
82 EIterator vend = v.end();
85 for(;viter.index() != eiter.index(); ++viter){
86 *viter= scalar_type();
89 for(;eiter != eend; ++eiter,++viter){
93 for(;viter!= vend; ++viter){
94 *viter= scalar_type();
99 template<
class V,
class E>
102 packed_random_access_iterator_tag, packed_random_access_iterator_tag
105 typedef typename E::const_iterator EIterator;
106 EIterator eiter = e.begin();
107 EIterator eend = e.end();
114 EIterator viter = v.begin();
115 EIterator vend = v.end();
121 SIZE_CHECK(viter.index()+(vend-viter) >= eiter.index()+(eend-eiter));
124 viter += eiter.index()-viter.index();
125 for(;eiter != eend; ++eiter,++viter){
131 template<
class V,
class E>
135 dense_random_access_iterator_tag,
136 sparse_bidirectional_iterator_tag
139 typedef typename E::const_iterator iterator;
140 iterator end = e().end();
141 for(iterator it = e().begin(); it != end; ++it){
142 v()(it.index()) = *it;
146 template<
class V,
class E>
150 sparse_bidirectional_iterator_tag,
151 dense_random_access_iterator_tag
154 v().reserve(e().
size());
155 typename V::iterator targetPos = v().begin();
157 for(std::size_t i = 0; i != e().size(); ++i,++targetPos){
158 targetPos = v().set_element(targetPos,i,e()(i));
162 template<
class V,
class E>
166 sparse_bidirectional_iterator_tag,
167 sparse_bidirectional_iterator_tag
170 typedef typename E::const_iterator iteratorE;
171 typename V::iterator targetPos = v().begin();
173 iteratorE end = e().end();
174 for(iteratorE it = e().begin(); it != end; ++it,++targetPos){
175 targetPos = v().set_element(targetPos,it.index(),*it);
180 template<
class V,
class E>
183 typedef typename V::const_iterator::iterator_category CategoryV;
184 typedef typename E::const_iterator::iterator_category CategoryE;
185 assign(v, e, CategoryV(),CategoryE());
193 template<
class V,
class E,
class F>
198 dense_random_access_iterator_tag, dense_random_access_iterator_tag
201 for(std::size_t i = 0; i != v().size(); ++i){
207 template<
class V,
class E,
class F>
212 dense_random_access_iterator_tag, packed_random_access_iterator_tag
215 typedef typename E::const_iterator EIterator;
216 typedef typename V::const_iterator VIterator;
217 typedef typename V::scalar_type scalar_type;
218 EIterator eiter = e().begin();
219 EIterator eend = e().end();
220 VIterator viter = v().begin();
221 VIterator vend = v().end();
225 for(;viter.index() != eiter.index() &&!F::right_zero_identity; ++viter){
226 f(*viter,scalar_type());
229 for(;eiter != eend; ++eiter,++viter){
234 for(;viter!= vend &&!F::right_zero_identity; ++viter){
235 *viter= scalar_type();
240 template<
class V,
class E,
class F>
245 packed_random_access_iterator_tag, packed_random_access_iterator_tag
248 typedef typename E::const_iterator EIterator;
249 typedef typename V::const_iterator VIterator;
250 typedef typename V::scalar_type scalar_type;
251 EIterator eiter = e().begin();
252 EIterator eend = e().end();
253 VIterator viter = v().begin();
254 VIterator vend = v().end();
263 SIZE_CHECK(viter.index()+(vend-viter) >= eiter.index()+(eend-eiter));
266 for(;viter.index() != eiter.index() &&!F::right_zero_identity; ++viter){
267 f(*viter,scalar_type());
270 for(;eiter != eend; ++eiter,++viter){
275 for(;viter!= vend &&!F::right_zero_identity; ++viter){
276 *viter= scalar_type();
281 template<
class V,
class E,
class F>
286 dense_random_access_iterator_tag, sparse_bidirectional_iterator_tag
288 typedef typename E::const_iterator iterator;
289 iterator end = e().end();
290 for(iterator it = e().begin(); it != end; ++it){
291 f(v()(it.index()),*it);
296 template<
class V,
class E,
class F>
301 sparse_bidirectional_iterator_tag tag, dense_random_access_iterator_tag
303 typedef typename V::value_type value_type;
304 typedef typename V::size_type size_type;
305 value_type zero = value_type();
306 size_type
size = e().size();
308 typename V::iterator it = v().begin();
309 for(size_type i = 0; i !=
size; ++i,++it){
310 if(it == v().end() || it.index() != i){
311 it = v().set_element(it,i,zero);
327 template<
class V,
class E,
class F>
333 typedef typename V::value_type value_type;
334 typedef typename V::size_type size_type;
335 value_type zero = value_type();
336 size_type
size = v().size();
338 typename V::iterator it = v().begin();
339 typename E::const_iterator ite = e().begin();
340 typename E::const_iterator ite_end = e().end();
341 while(it != v().end() && ite != ite_end) {
342 size_type it_index = it.index();
343 size_type ite_index = ite.index();
344 if (it_index == ite_index) {
347 }
else if (it_index < ite_index) {
350 it = v().set_element(it,ite_index,zero);
357 for(;it != v().end();++it) {
361 for(;ite != ite_end;++it,++ite) {
362 it = v().set_element(it,ite.index(),zero);
367 template<
class V,
class E,
class F>
372 sparse_bidirectional_iterator_tag tag, sparse_bidirectional_iterator_tag
376 template<
class V,
class E,
class F>
381 sparse_bidirectional_iterator_tag tag, sparse_bidirectional_iterator_tag
385 template<
class V,
class E,
class F>
390 sparse_bidirectional_iterator_tag tag, sparse_bidirectional_iterator_tag
399 template<
class V,
class E,
class F>
404 sparse_bidirectional_iterator_tag tag, sparse_bidirectional_iterator_tag
406 typename vector_temporary<V>::type temporary(v());
413 template<
template <
class T1,
class T2>
class F,
class V,
class E>
416 typedef typename V::const_iterator::iterator_category CategoryV;
417 typedef typename E::const_iterator::iterator_category CategoryE;
418 typedef F<typename V::iterator::reference, typename E::value_type> functor_type;
419 assign(v(), e(), functor_type(), CategoryV(),CategoryE());