📄 matrix_assign.hpp
字号:
} ++ it1; } } else { it1 = it1_end; }#if BOOST_UBLAS_TYPE_CHECK if (! disable_type_check<bool>::value) BOOST_UBLAS_CHECK (equals (m, cm), external_logic ());#endif } // Sparse proxy column major case template<class F1, class F2, class M, class E> // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE void matrix_assign (F1, F2, M &m, const matrix_expression<E> &e, sparse_proxy_tag, column_major_tag) { BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ()); BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ()); typedef F1 functor1_type; typedef F2 functor2_type; typedef typename M::size_type size_type; typedef typename M::difference_type difference_type; typedef typename M::value_type value_type;#if BOOST_UBLAS_TYPE_CHECK matrix<value_type, column_major> cm (m.size1 (), m.size2 ());#ifndef BOOST_UBLAS_NO_ELEMENT_PROXIES indexing_matrix_assign (scalar_assign<typename matrix<value_type, column_major>::reference, value_type> (), cm, m, column_major_tag ()); indexing_matrix_assign (functor1_type::template make_debug_functor<typename matrix<value_type, column_major>::reference, value_type> (), cm, e, column_major_tag ());#else indexing_matrix_assign (scalar_assign<value_type&, value_type> (), cm, m, column_major_tag ()); indexing_matrix_assign (functor1_type (), cm, e, column_major_tag ());#endif#endif#ifdef BOOST_UBLAS_NON_CONFORMANT_PROXIES make_conformant (m, e, column_major_tag (), functor2_type ());#endif typename M::iterator2 it2 (m.begin2 ()); typename M::iterator2 it2_end (m.end2 ()); typename E::const_iterator2 it2e (e ().begin2 ()); typename E::const_iterator2 it2e_end (e ().end2 ()); while (it2 != it2_end && it2e != it2e_end) { difference_type compare = it2.index2 () - it2e.index2 (); if (compare == 0) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator1 it1 (it2.begin ()); typename M::iterator1 it1_end (it2.end ()); typename E::const_iterator1 it1e (it2e.begin ()); typename E::const_iterator1 it1e_end (it2e.end ());#else typename M::iterator1 it1 (begin (it2, iterator2_tag ())); typename M::iterator1 it1_end (end (it2, iterator2_tag ())); typename E::const_iterator1 it1e (begin (it2e, iterator2_tag ())); typename E::const_iterator1 it1e_end (end (it2e, iterator2_tag ()));#endif if (it1 != it1_end && it1e != it1e_end) { size_type it1_index = it1.index1 (), it1e_index = it1e.index1 (); while (true) { difference_type compare = it1_index - it1e_index; if (compare == 0) { functor1_type::apply (*it1, *it1e); ++ it1, ++ it1e; if (it1 != it1_end && it1e != it1e_end) { it1_index = it1.index1 (); it1e_index = it1e.index1 (); } else break; } else if (compare < 0) { if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) { functor1_type::apply (*it1, value_type (0)); ++ it1; } else increment (it1, it1_end, - compare); if (it1 != it1_end) it1_index = it1.index1 (); else break; } else if (compare > 0) { increment (it1e, it1e_end, compare); if (it1e != it1e_end) it1e_index = it1e.index1 (); else break; } } } if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) { while (it1 != it1_end) { functor1_type::apply (*it1, value_type (0)); ++ it1; } } else { it1 = it1_end; } ++ it2, ++ it2e; } else if (compare < 0) { if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator1 it1 (it2.begin ()); typename M::iterator1 it1_end (it2.end ());#else typename M::iterator1 it1 (begin (it2, iterator2_tag ())); typename M::iterator1 it1_end (end (it2, iterator2_tag ()));#endif while (it1 != it1_end) { functor1_type::apply (*it1, value_type (0)); ++ it1; } ++ it2; } else { increment (it2, it2_end, - compare); } } else if (compare > 0) { increment (it2e, it2e_end, compare); } } if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) { while (it2 != it2_end) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator1 it1 (it2.begin ()); typename M::iterator1 it1_end (it2.end ());#else typename M::iterator1 it1 (begin (it2, iterator2_tag ())); typename M::iterator1 it1_end (end (it2, iterator2_tag ()));#endif while (it1 != it1_end) { functor1_type::apply (*it1, value_type (0)); ++ it1; } ++ it2; } } else { it2 = it2_end; }#if BOOST_UBLAS_TYPE_CHECK if (! disable_type_check<bool>::value) BOOST_UBLAS_CHECK (equals (m, cm), external_logic ());#endif } // Dispatcher template<class F, class M, class E> BOOST_UBLAS_INLINE void matrix_assign (F, M &m, const matrix_expression<E> &e) { typedef F functor_type; typedef typename matrix_assign_traits<BOOST_UBLAS_TYPENAME M::storage_category, BOOST_UBLAS_TYPENAME F::assign_category, BOOST_UBLAS_TYPENAME E::const_iterator1::iterator_category, BOOST_UBLAS_TYPENAME E::const_iterator2::iterator_category>::storage_category storage_category; // give preference to expressions orientation if known typedef typename boost::mpl::if_<boost::is_same<BOOST_UBLAS_TYPENAME E::orientation_category, unknown_orientation_tag>, BOOST_UBLAS_TYPENAME M::orientation_category , BOOST_UBLAS_TYPENAME E::orientation_category >::type orientation_category; matrix_assign (functor_type (), full (), m, e, storage_category (), orientation_category ()); } template<class F1, class F2, class M, class E> BOOST_UBLAS_INLINE void matrix_assign (F1, F2, M &m, const matrix_expression<E> &e) { typedef F1 functor1_type; typedef F2 functor2_type; typedef typename matrix_assign_traits<BOOST_UBLAS_TYPENAME M::storage_category, BOOST_UBLAS_TYPENAME F1::assign_category, BOOST_UBLAS_TYPENAME E::const_iterator1::iterator_category, BOOST_UBLAS_TYPENAME E::const_iterator2::iterator_category>::storage_category storage_category; // give preference to expressions orientation if known typedef typename boost::mpl::if_<boost::is_same<BOOST_UBLAS_TYPENAME E::orientation_category, unknown_orientation_tag>, BOOST_UBLAS_TYPENAME M::orientation_category , BOOST_UBLAS_TYPENAME E::orientation_category >::type orientation_category; matrix_assign (functor1_type (), functor2_type (), m, e, storage_category (), orientation_category ()); } template<class LS, class RI1, class RI2> struct matrix_swap_traits { typedef LS storage_category; }; template<> struct matrix_swap_traits<dense_proxy_tag, sparse_bidirectional_iterator_tag, sparse_bidirectional_iterator_tag> { typedef sparse_proxy_tag storage_category; }; template<> struct matrix_swap_traits<packed_proxy_tag, sparse_bidirectional_iterator_tag, sparse_bidirectional_iterator_tag> { typedef sparse_proxy_tag storage_category; }; // Dense (proxy) row major case template<class F, class M, class E> // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE void matrix_swap (F, full, M &m, matrix_expression<E> &e, dense_proxy_tag, row_major_tag) { typedef F functor_type; typedef typename M::size_type size_type; typedef typename M::difference_type difference_type; typename M::iterator1 it1 (m.begin1 ()); typename E::iterator1 it1e (e ().begin1 ()); difference_type size1 (BOOST_UBLAS_SAME (m.size1 (), size_type (e ().end1 () - it1e))); while (-- size1 >= 0) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename E::iterator2 it2e (it1e.begin ()); difference_type size2 (BOOST_UBLAS_SAME (m.size2 (), size_type (it1e.end () - it2e)));#else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename E::iterator2 it2e (begin (it1e, iterator1_tag ())); difference_type size2 (BOOST_UBLAS_SAME (m.size2 (), size_type (end (it1e, iterator1_tag ()) - it2e)));#endif while (-- size2 >= 0) functor_type::apply (*it2, *it2e), ++ it2, ++ it2e; ++ it1, ++ it1e; } } // Dense (proxy) column major case template<class F, class M, class E> // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE void matrix_swap (F, full, M &m, matrix_expression<E> &e, dense_proxy_tag, column_major_tag) { typedef F functor_type; typedef typename M::size_type size_type; typedef typename M::difference_type difference_type; typename M::iterator2 it2 (m.begin2 ()); typename E::iterator2 it2e (e ().begin2 ()); difference_type size2 (BOOST_UBLAS_SAME (m.size2 (), size_type (e ().end2 () - it2e))); while (-- size2 >= 0) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator1 it1 (it2.begin ()); typename E::iterator1 it1e (it2e.begin ()); difference_type size1 (BOOST_UBLAS_SAME (m.size1 (), size_type (it2e.end () - it1e)));#else typename M::iterator1 it1 (begin (it2, iterator2_tag ())); typename E::iterator1 it1e (begin (it2e, iterator2_tag ())); difference_type size1 (BOOST_UBLAS_SAME (m.size1 (), size_type (end (it2e, iterator2_tag ()) - it1e)));#endif while (-- size1 >= 0) functor_type::apply (*it1, *it1e), ++ it1, ++ it1e; ++ it2, ++ it2e; } } // Packed (proxy) row major case template<class F1, class F2, class M, class E> // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE void matrix_swap (F1, F2, M &m, matrix_expression<E> &e, packed_proxy_tag, row_major_tag) { typedef F1 functor1_type; typedef F2 functor2_type; typedef typename M::size_type size_type; typedef typename M::difference_type difference_type; typename M::iterator1 it1 (m.begin1 ()); typename E::iterator1 it1e (e ().begin1 ()); difference_type size1 (BOOST_UBLAS_SAME (m.end1 () - it1, e ().end1 () - it1e)); while (-- size1 >= 0) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename E::iterator2 it2e (it1e.begin ()); difference_type size2 (BOOST_UBLAS_SAME (it1.end () - it2, it1e.end () - it2e));#else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename E::iterator2 it2e (begin (it1e, iterator1_tag ())); difference_type size2 (BOOST_UBLAS_SAME (end (it1, iterator1_tag ()) - it2, end (it1e, iterator1_tag ()) - it2e));#endif while (-- size2 >= 0) functor1_type::apply (*it2, *it2e), ++ it2, ++ it2e; ++ it1, ++ it1e; } } // Packed (proxy) column major case template<class F1, class F2, class M, class E> // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE void matrix_swap (F1, F2, M &m, matrix_expression<E> &e, packed_proxy_tag, column_major_tag) { typedef F1 functor1_type; typedef F2 functor2_type; typedef typename M::size_type size_type; typedef typename M::difference_type difference_type; typename M::iterator2 it2 (m.begin2 ()); typename E::iterator2 it2e (e ().begin2 ()); difference_type size2 (BOOST_UBLAS_SAME
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -