⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix_assign.hpp

📁 CGAL is a collaborative effort of several sites in Europe and Israel. The goal is to make the most i
💻 HPP
📖 第 1 页 / 共 5 页
字号:
                }                ++ 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 + -