DriveHQ Start Menu
Cloud Drive Mapping
Folder Sync
Cloud Backup
True Drop Box
FTP/SFTP Hosting
Group Account
DriveHQ Start Menu
Online File Server
My Storage
|
Manage Shares
|
Publishes
|
Drop Boxes
|
Group Account
WebDAV Drive Mapping
Cloud Drive Home
|
WebDAV Guide
|
Drive Mapping Tool
|
Drive Mapping URL
Complete Data Backup
Backup Guide
|
Online Backup Tool
|
Cloud-to-Cloud Backup
FTP, Email & Web Service
FTP Home
|
FTP Hosting FAQ
|
Email Hosting
|
EmailManager
|
Web Hosting
Help & Resources
About
|
Enterprise Service
|
Partnership
|
Comparisons
|
Support
Quick Links
Security and Privacy
Download Software
Service Manual
Use Cases
Group Account
Online Help
Blog
Contact
Cloud Surveillance
Sign Up
Login
Features
Business Features
Online File Server
FTP Hosting
Cloud Drive Mapping
Cloud File Backup
Email Backup & Hosting
Cloud File Sharing
Folder Synchronization
Group Management
True Drop Box
Full-text Search
AD Integration/SSO
Mobile Access
IP Camera & DVR Solution
More...
Personal Features
Personal Cloud Drive
Backup All Devices
Mobile APPs
Personal Web Hosting
Sub-Account (for Kids)
Home/PC/Kids Monitoring
More...
Software
DriveHQ Drive Mapping Tool
DriveHQ FileManager
DriveHQ Online Backup
DriveHQ Mobile Apps
Pricing
Business Plans & Pricing
Personal Plans & Pricing
Price Comparison with Others
Feature Comparison with Others
Install Mobile App
Sign up
Creating account...
Invalid character in username! Only 0-9, a-z, A-Z, _, -, . allowed.
Username is required!
Invalid email address!
E-mail is required!
Password is required!
Password is invalid!
Password and confirmation do not match.
Confirm password is required!
I accept
Membership Agreement
Please read the Membership Agreement and check "I accept"!
Free Quick Sign-up
Sign-up Page
Log in
Signing in...
Username or e-mail address is required!
Password is required!
Keep me logged in
Quick Login
Forgot Password
Up
Upload
Download
Share
Publish
New Folder
New File
Copy
Cut
Delete
Paste
Rate
Upgrade
Rotate
Effect
Edit
Slide
History
// // Copyright (c) 2000-2002 // Joerg Walter, Mathias Koch // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // The authors gratefully acknowledge the support of // GeNeSys mbH & Co. KG in producing this work. // #ifndef _BOOST_UBLAS_MATRIX_ASSIGN_ #define _BOOST_UBLAS_MATRIX_ASSIGN_ // Required for make_conformant storage #include
// Iterators based on ideas of Jeremy Siek namespace boost { namespace numeric { namespace ublas { namespace detail { // Weak equality check - useful to compare equality two arbitary matrix expression results. // Since the actual expressions are unknown, we check for and arbitary error bound // on the relative error. // For a linear expression the infinity norm makes sense as we do not know how the elements will be // combined in the expression. False positive results are inevitable for arbirary expressions! template
BOOST_UBLAS_INLINE bool equals (const matrix_expression
&e1, const matrix_expression
&e2, S epsilon, S min_norm) { return norm_inf (e1 - e2) < epsilon * std::max
(std::max
(norm_inf (e1), norm_inf (e2)), min_norm); } template
BOOST_UBLAS_INLINE bool expression_type_check (const matrix_expression
&e1, const matrix_expression
&e2) { typedef typename type_traits
::promote_type>::real_type real_type; return equals (e1, e2, BOOST_UBLAS_TYPE_CHECK_EPSILON, BOOST_UBLAS_TYPE_CHECK_MIN); } template
// BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void make_conformant (M &m, const matrix_expression
&e, row_major_tag, R) { BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ()); BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ()); typedef R conformant_restrict_type; typedef typename M::size_type size_type; typedef typename M::difference_type difference_type; typedef typename M::value_type value_type; // FIXME unbounded_array with push_back maybe better std::vector
> index; typename M::iterator1 it1 (m.begin1 ()); typename M::iterator1 it1_end (m.end1 ()); typename E::const_iterator1 it1e (e ().begin1 ()); typename E::const_iterator1 it1e_end (e ().end1 ()); while (it1 != it1_end && it1e != it1e_end) { difference_type compare = it1.index1 () - it1e.index1 (); if (compare == 0) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename M::iterator2 it2_end (it1.end ()); typename E::const_iterator2 it2e (it1e.begin ()); typename E::const_iterator2 it2e_end (it1e.end ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename M::iterator2 it2_end (end (it1, iterator1_tag ())); typename E::const_iterator2 it2e (begin (it1e, iterator1_tag ())); typename E::const_iterator2 it2e_end (end (it1e, iterator1_tag ())); #endif if (it2 != it2_end && it2e != it2e_end) { size_type it2_index = it2.index2 (), it2e_index = it2e.index2 (); while (true) { difference_type compare = it2_index - it2e_index; if (compare == 0) { ++ it2, ++ it2e; if (it2 != it2_end && it2e != it2e_end) { it2_index = it2.index2 (); it2e_index = it2e.index2 (); } else break; } else if (compare < 0) { increment (it2, it2_end, - compare); if (it2 != it2_end) it2_index = it2.index2 (); else break; } else if (compare > 0) { if (conformant_restrict_type::other (it2e.index1 (), it2e.index2 ())) if (*it2e != value_type/*zero*/()) index.push_back (std::pair
(it2e.index1 (), it2e.index2 ())); ++ it2e; if (it2e != it2e_end) it2e_index = it2e.index2 (); else break; } } } while (it2e != it2e_end) { if (conformant_restrict_type::other (it2e.index1 (), it2e.index2 ())) if (*it2e != value_type/*zero*/()) index.push_back (std::pair
(it2e.index1 (), it2e.index2 ())); ++ it2e; } ++ it1, ++ it1e; } else if (compare < 0) { increment (it1, it1_end, - compare); } else if (compare > 0) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename E::const_iterator2 it2e (it1e.begin ()); typename E::const_iterator2 it2e_end (it1e.end ()); #else typename E::const_iterator2 it2e (begin (it1e, iterator1_tag ())); typename E::const_iterator2 it2e_end (end (it1e, iterator1_tag ())); #endif while (it2e != it2e_end) { if (conformant_restrict_type::other (it2e.index1 (), it2e.index2 ())) if (*it2e != value_type/*zero*/()) index.push_back (std::pair
(it2e.index1 (), it2e.index2 ())); ++ it2e; } ++ it1e; } } while (it1e != it1e_end) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename E::const_iterator2 it2e (it1e.begin ()); typename E::const_iterator2 it2e_end (it1e.end ()); #else typename E::const_iterator2 it2e (begin (it1e, iterator1_tag ())); typename E::const_iterator2 it2e_end (end (it1e, iterator1_tag ())); #endif while (it2e != it2e_end) { if (conformant_restrict_type::other (it2e.index1 (), it2e.index2 ())) if (*it2e != value_type/*zero*/()) index.push_back (std::pair
(it2e.index1 (), it2e.index2 ())); ++ it2e; } ++ it1e; } // ISSUE proxies require insert_element for (size_type k = 0; k < index.size (); ++ k) m (index [k].first, index [k].second) = value_type/*zero*/(); } template
// BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void make_conformant (M &m, const matrix_expression
&e, column_major_tag, R) { BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ()); BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ()); typedef R conformant_restrict_type; typedef typename M::size_type size_type; typedef typename M::difference_type difference_type; typedef typename M::value_type value_type; std::vector
> index; 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) { ++ it1, ++ it1e; if (it1 != it1_end && it1e != it1e_end) { it1_index = it1.index1 (); it1e_index = it1e.index1 (); } else break; } else if (compare < 0) { increment (it1, it1_end, - compare); if (it1 != it1_end) it1_index = it1.index1 (); else break; } else if (compare > 0) { if (conformant_restrict_type::other (it1e.index1 (), it1e.index2 ())) if (*it1e != value_type/*zero*/()) index.push_back (std::pair
(it1e.index1 (), it1e.index2 ())); ++ it1e; if (it1e != it1e_end) it1e_index = it1e.index1 (); else break; } } } while (it1e != it1e_end) { if (conformant_restrict_type::other (it1e.index1 (), it1e.index2 ())) if (*it1e != value_type/*zero*/()) index.push_back (std::pair
(it1e.index1 (), it1e.index2 ())); ++ it1e; } ++ it2, ++ it2e; } else if (compare < 0) { increment (it2, it2_end, - compare); } else if (compare > 0) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename E::const_iterator1 it1e (it2e.begin ()); typename E::const_iterator1 it1e_end (it2e.end ()); #else typename E::const_iterator1 it1e (begin (it2e, iterator2_tag ())); typename E::const_iterator1 it1e_end (end (it2e, iterator2_tag ())); #endif while (it1e != it1e_end) { if (conformant_restrict_type::other (it1e.index1 (), it1e.index2 ())) if (*it1e != value_type/*zero*/()) index.push_back (std::pair
(it1e.index1 (), it1e.index2 ())); ++ it1e; } ++ it2e; } } while (it2e != it2e_end) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename E::const_iterator1 it1e (it2e.begin ()); typename E::const_iterator1 it1e_end (it2e.end ()); #else typename E::const_iterator1 it1e (begin (it2e, iterator2_tag ())); typename E::const_iterator1 it1e_end (end (it2e, iterator2_tag ())); #endif while (it1e != it1e_end) { if (conformant_restrict_type::other (it1e.index1 (), it1e.index2 ())) if (*it1e != value_type/*zero*/()) index.push_back (std::pair
(it1e.index1 (), it1e.index2 ())); ++ it1e; } ++ it2e; } // ISSUE proxies require insert_element for (size_type k = 0; k < index.size (); ++ k) m (index [k].first, index [k].second) = value_type/*zero*/(); } }//namespace detail // Explicitly iterating row major template
class F, class M, class T> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void iterating_matrix_assign_scalar (M &m, const T &t, row_major_tag) { typedef F
functor_type; typedef typename M::difference_type difference_type; difference_type size1 (m.size1 ()); difference_type size2 (m.size2 ()); typename M::iterator1 it1 (m.begin1 ()); BOOST_UBLAS_CHECK (size2 == 0 || m.end1 () - it1 == size1, bad_size ()); while (-- size1 >= 0) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); #endif BOOST_UBLAS_CHECK (it1.end () - it2 == size2, bad_size ()); difference_type temp_size2 (size2); #ifndef BOOST_UBLAS_USE_DUFF_DEVICE while (-- temp_size2 >= 0) functor_type::apply (*it2, t), ++ it2; #else DD (temp_size2, 4, r, (functor_type::apply (*it2, t), ++ it2)); #endif ++ it1; } } // Explicitly iterating column major template
class F, class M, class T> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void iterating_matrix_assign_scalar (M &m, const T &t, column_major_tag) { typedef F
functor_type; typedef typename M::difference_type difference_type; difference_type size2 (m.size2 ()); difference_type size1 (m.size1 ()); typename M::iterator2 it2 (m.begin2 ()); BOOST_UBLAS_CHECK (size1 == 0 || m.end2 () - it2 == size2, bad_size ()); while (-- size2 >= 0) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator1 it1 (it2.begin ()); #else typename M::iterator1 it1 (begin (it2, iterator2_tag ())); #endif BOOST_UBLAS_CHECK (it2.end () - it1 == size1, bad_size ()); difference_type temp_size1 (size1); #ifndef BOOST_UBLAS_USE_DUFF_DEVICE while (-- temp_size1 >= 0) functor_type::apply (*it1, t), ++ it1; #else DD (temp_size1, 4, r, (functor_type::apply (*it1, t), ++ it1)); #endif ++ it2; } } // Explicitly indexing row major template
class F, class M, class T> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void indexing_matrix_assign_scalar (M &m, const T &t, row_major_tag) { typedef F
functor_type; typedef typename M::size_type size_type; size_type size1 (m.size1 ()); size_type size2 (m.size2 ()); for (size_type i = 0; i < size1; ++ i) { #ifndef BOOST_UBLAS_USE_DUFF_DEVICE for (size_type j = 0; j < size2; ++ j) functor_type::apply (m (i, j), t); #else size_type j (0); DD (size2, 4, r, (functor_type::apply (m (i, j), t), ++ j)); #endif } } // Explicitly indexing column major template
class F, class M, class T> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void indexing_matrix_assign_scalar (M &m, const T &t, column_major_tag) { typedef F
functor_type; typedef typename M::size_type size_type; size_type size2 (m.size2 ()); size_type size1 (m.size1 ()); for (size_type j = 0; j < size2; ++ j) { #ifndef BOOST_UBLAS_USE_DUFF_DEVICE for (size_type i = 0; i < size1; ++ i) functor_type::apply (m (i, j), t); #else size_type i (0); DD (size1, 4, r, (functor_type::apply (m (i, j), t), ++ i)); #endif } } // Dense (proxy) case template
class F, class M, class T, class C> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_assign_scalar (M &m, const T &t, dense_proxy_tag, C) { typedef C orientation_category; #ifdef BOOST_UBLAS_USE_INDEXING indexing_matrix_assign_scalar
(m, t, orientation_category ()); #elif BOOST_UBLAS_USE_ITERATING iterating_matrix_assign_scalar
(m, t, orientation_category ()); #else typedef typename M::size_type size_type; size_type size1 (m.size1 ()); size_type size2 (m.size2 ()); if (size1 >= BOOST_UBLAS_ITERATOR_THRESHOLD && size2 >= BOOST_UBLAS_ITERATOR_THRESHOLD) iterating_matrix_assign_scalar
(m, t, orientation_category ()); else indexing_matrix_assign_scalar
(m, t, orientation_category ()); #endif } // Packed (proxy) row major case template
class F, class M, class T> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_assign_scalar (M &m, const T &t, packed_proxy_tag, row_major_tag) { typedef F
functor_type; typedef typename M::difference_type difference_type; typename M::iterator1 it1 (m.begin1 ()); difference_type size1 (m.end1 () - it1); while (-- size1 >= 0) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); difference_type size2 (it1.end () - it2); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); difference_type size2 (end (it1, iterator1_tag ()) - it2); #endif while (-- size2 >= 0) functor_type::apply (*it2, t), ++ it2; ++ it1; } } // Packed (proxy) column major case template
class F, class M, class T> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_assign_scalar (M &m, const T &t, packed_proxy_tag, column_major_tag) { typedef F
functor_type; typedef typename M::difference_type difference_type; typename M::iterator2 it2 (m.begin2 ()); difference_type size2 (m.end2 () - it2); while (-- size2 >= 0) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator1 it1 (it2.begin ()); difference_type size1 (it2.end () - it1); #else typename M::iterator1 it1 (begin (it2, iterator2_tag ())); difference_type size1 (end (it2, iterator2_tag ()) - it1); #endif while (-- size1 >= 0) functor_type::apply (*it1, t), ++ it1; ++ it2; } } // Sparse (proxy) row major case template
class F, class M, class T> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_assign_scalar (M &m, const T &t, sparse_proxy_tag, row_major_tag) { typedef F
functor_type; typename M::iterator1 it1 (m.begin1 ()); typename M::iterator1 it1_end (m.end1 ()); while (it1 != it1_end) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename M::iterator2 it2_end (it1.end ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename M::iterator2 it2_end (end (it1, iterator1_tag ())); #endif while (it2 != it2_end) functor_type::apply (*it2, t), ++ it2; ++ it1; } } // Sparse (proxy) column major case template
class F, class M, class T> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_assign_scalar (M &m, const T &t, sparse_proxy_tag, column_major_tag) { typedef F
functor_type; typename M::iterator2 it2 (m.begin2 ()); typename M::iterator2 it2_end (m.end2 ()); 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) functor_type::apply (*it1, t), ++ it1; ++ it2; } } // Dispatcher template
class F, class M, class T> BOOST_UBLAS_INLINE void matrix_assign_scalar (M &m, const T &t) { typedef typename M::storage_category storage_category; typedef typename M::orientation_category orientation_category; matrix_assign_scalar
(m, t, storage_category (), orientation_category ()); } template
struct matrix_assign_traits { typedef SC storage_category; }; template
struct matrix_assign_traits
{ typedef packed_tag storage_category; }; template<> struct matrix_assign_traits
{ typedef sparse_tag storage_category; }; template<> struct matrix_assign_traits
{ typedef sparse_proxy_tag storage_category; }; template
struct matrix_assign_traits
{ typedef packed_proxy_tag storage_category; }; template
struct matrix_assign_traits
{ typedef sparse_proxy_tag storage_category; }; template<> struct matrix_assign_traits
{ typedef sparse_tag storage_category; }; template<> struct matrix_assign_traits
{ typedef sparse_proxy_tag storage_category; }; template
struct matrix_assign_traits
{ typedef sparse_proxy_tag storage_category; }; template<> struct matrix_assign_traits
{ typedef sparse_proxy_tag storage_category; }; template<> struct matrix_assign_traits
{ typedef sparse_proxy_tag storage_category; }; template<> struct matrix_assign_traits
{ typedef sparse_proxy_tag storage_category; }; // Explicitly iterating row major template
class F, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void iterating_matrix_assign (M &m, const matrix_expression
&e, row_major_tag) { typedef F
functor_type; typedef typename M::difference_type difference_type; difference_type size1 (BOOST_UBLAS_SAME (m.size1 (), e ().size1 ())); difference_type size2 (BOOST_UBLAS_SAME (m.size2 (), e ().size2 ())); typename M::iterator1 it1 (m.begin1 ()); BOOST_UBLAS_CHECK (size2 == 0 || m.end1 () - it1 == size1, bad_size ()); typename E::const_iterator1 it1e (e ().begin1 ()); BOOST_UBLAS_CHECK (size2 == 0 || e ().end1 () - it1e == size1, bad_size ()); while (-- size1 >= 0) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename E::const_iterator2 it2e (it1e.begin ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename E::const_iterator2 it2e (begin (it1e, iterator1_tag ())); #endif BOOST_UBLAS_CHECK (it1.end () - it2 == size2, bad_size ()); BOOST_UBLAS_CHECK (it1e.end () - it2e == size2, bad_size ()); difference_type temp_size2 (size2); #ifndef BOOST_UBLAS_USE_DUFF_DEVICE while (-- temp_size2 >= 0) functor_type::apply (*it2, *it2e), ++ it2, ++ it2e; #else DD (temp_size2, 2, r, (functor_type::apply (*it2, *it2e), ++ it2, ++ it2e)); #endif ++ it1, ++ it1e; } } // Explicitly iterating column major template
class F, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void iterating_matrix_assign (M &m, const matrix_expression
&e, column_major_tag) { typedef F
functor_type; typedef typename M::difference_type difference_type; difference_type size2 (BOOST_UBLAS_SAME (m.size2 (), e ().size2 ())); difference_type size1 (BOOST_UBLAS_SAME (m.size1 (), e ().size1 ())); typename M::iterator2 it2 (m.begin2 ()); BOOST_UBLAS_CHECK (size1 == 0 || m.end2 () - it2 == size2, bad_size ()); typename E::const_iterator2 it2e (e ().begin2 ()); BOOST_UBLAS_CHECK (size1 == 0 || e ().end2 () - it2e == size2, bad_size ()); while (-- size2 >= 0) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator1 it1 (it2.begin ()); typename E::const_iterator1 it1e (it2e.begin ()); #else typename M::iterator1 it1 (begin (it2, iterator2_tag ())); typename E::const_iterator1 it1e (begin (it2e, iterator2_tag ())); #endif BOOST_UBLAS_CHECK (it2.end () - it1 == size1, bad_size ()); BOOST_UBLAS_CHECK (it2e.end () - it1e == size1, bad_size ()); difference_type temp_size1 (size1); #ifndef BOOST_UBLAS_USE_DUFF_DEVICE while (-- temp_size1 >= 0) functor_type::apply (*it1, *it1e), ++ it1, ++ it1e; #else DD (temp_size1, 2, r, (functor_type::apply (*it1, *it1e), ++ it1, ++ it1e)); #endif ++ it2, ++ it2e; } } // Explicitly indexing row major template
class F, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void indexing_matrix_assign (M &m, const matrix_expression
&e, row_major_tag) { typedef F
functor_type; typedef typename M::size_type size_type; size_type size1 (BOOST_UBLAS_SAME (m.size1 (), e ().size1 ())); size_type size2 (BOOST_UBLAS_SAME (m.size2 (), e ().size2 ())); for (size_type i = 0; i < size1; ++ i) { #ifndef BOOST_UBLAS_USE_DUFF_DEVICE for (size_type j = 0; j < size2; ++ j) functor_type::apply (m (i, j), e () (i, j)); #else size_type j (0); DD (size2, 2, r, (functor_type::apply (m (i, j), e () (i, j)), ++ j)); #endif } } // Explicitly indexing column major template
class F, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void indexing_matrix_assign (M &m, const matrix_expression
&e, column_major_tag) { typedef F
functor_type; typedef typename M::size_type size_type; size_type size2 (BOOST_UBLAS_SAME (m.size2 (), e ().size2 ())); size_type size1 (BOOST_UBLAS_SAME (m.size1 (), e ().size1 ())); for (size_type j = 0; j < size2; ++ j) { #ifndef BOOST_UBLAS_USE_DUFF_DEVICE for (size_type i = 0; i < size1; ++ i) functor_type::apply (m (i, j), e () (i, j)); #else size_type i (0); DD (size1, 2, r, (functor_type::apply (m (i, j), e () (i, j)), ++ i)); #endif } } // Dense (proxy) case template
class F, class R, class M, class E, class C> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_assign (M &m, const matrix_expression
&e, dense_proxy_tag, C) { // R unnecessary, make_conformant not required typedef C orientation_category; #ifdef BOOST_UBLAS_USE_INDEXING indexing_matrix_assign
(m, e, orientation_category ()); #elif BOOST_UBLAS_USE_ITERATING iterating_matrix_assign
(m, e, orientation_category ()); #else typedef typename M::difference_type difference_type; size_type size1 (BOOST_UBLAS_SAME (m.size1 (), e ().size1 ())); size_type size2 (BOOST_UBLAS_SAME (m.size2 (), e ().size2 ())); if (size1 >= BOOST_UBLAS_ITERATOR_THRESHOLD && size2 >= BOOST_UBLAS_ITERATOR_THRESHOLD) iterating_matrix_assign
(m, e, orientation_category ()); else indexing_matrix_assign
(m, e, orientation_category ()); #endif } // Packed (proxy) row major case template
class F, class R, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_assign (M &m, const matrix_expression
&e, packed_proxy_tag, row_major_tag) { typedef F
functor_type; // R unnecessary, make_conformant not required typedef typename M::difference_type difference_type; typedef typename M::value_type value_type; BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ()); BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ()); #if BOOST_UBLAS_TYPE_CHECK matrix
cm (m.size1 (), m.size2 ()); indexing_matrix_assign
(cm, m, row_major_tag ()); indexing_matrix_assign
(cm, e, row_major_tag ()); #endif typename M::iterator1 it1 (m.begin1 ()); typename M::iterator1 it1_end (m.end1 ()); typename E::const_iterator1 it1e (e ().begin1 ()); typename E::const_iterator1 it1e_end (e ().end1 ()); difference_type it1_size (it1_end - it1); difference_type it1e_size (it1e_end - it1e); difference_type diff1 (0); if (it1_size > 0 && it1e_size > 0) diff1 = it1.index1 () - it1e.index1 (); if (diff1 != 0) { difference_type size1 = (std::min) (diff1, it1e_size); if (size1 > 0) { it1e += size1; it1e_size -= size1; diff1 -= size1; } size1 = (std::min) (- diff1, it1_size); if (size1 > 0) { it1_size -= size1; if (!functor_type::computed) { while (-- size1 >= 0) { // zeroing #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename M::iterator2 it2_end (it1.end ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename M::iterator2 it2_end (end (it1, iterator1_tag ())); #endif difference_type size2 (it2_end - it2); while (-- size2 >= 0) functor_type::apply (*it2, value_type/*zero*/()), ++ it2; ++ it1; } } else { it1 += size1; } diff1 += size1; } } difference_type size1 ((std::min) (it1_size, it1e_size)); it1_size -= size1; it1e_size -= size1; while (-- size1 >= 0) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename M::iterator2 it2_end (it1.end ()); typename E::const_iterator2 it2e (it1e.begin ()); typename E::const_iterator2 it2e_end (it1e.end ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename M::iterator2 it2_end (end (it1, iterator1_tag ())); typename E::const_iterator2 it2e (begin (it1e, iterator1_tag ())); typename E::const_iterator2 it2e_end (end (it1e, iterator1_tag ())); #endif difference_type it2_size (it2_end - it2); difference_type it2e_size (it2e_end - it2e); difference_type diff2 (0); if (it2_size > 0 && it2e_size > 0) { diff2 = it2.index2 () - it2e.index2 (); difference_type size2 = (std::min) (diff2, it2e_size); if (size2 > 0) { it2e += size2; it2e_size -= size2; diff2 -= size2; } size2 = (std::min) (- diff2, it2_size); if (size2 > 0) { it2_size -= size2; if (!functor_type::computed) { while (-- size2 >= 0) // zeroing functor_type::apply (*it2, value_type/*zero*/()), ++ it2; } else { it2 += size2; } diff2 += size2; } } difference_type size2 ((std::min) (it2_size, it2e_size)); it2_size -= size2; it2e_size -= size2; while (-- size2 >= 0) functor_type::apply (*it2, *it2e), ++ it2, ++ it2e; size2 = it2_size; if (!functor_type::computed) { while (-- size2 >= 0) // zeroing functor_type::apply (*it2, value_type/*zero*/()), ++ it2; } else { it2 += size2; } ++ it1, ++ it1e; } size1 = it1_size; if (!functor_type::computed) { while (-- size1 >= 0) { // zeroing #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename M::iterator2 it2_end (it1.end ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename M::iterator2 it2_end (end (it1, iterator1_tag ())); #endif difference_type size2 (it2_end - it2); while (-- size2 >= 0) functor_type::apply (*it2, value_type/*zero*/()), ++ it2; ++ it1; } } else { it1 += size1; } #if BOOST_UBLAS_TYPE_CHECK if (! disable_type_check
::value) BOOST_UBLAS_CHECK (detail::expression_type_check (m, cm), external_logic ()); #endif } // Packed (proxy) column major case template
class F, class R, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_assign (M &m, const matrix_expression
&e, packed_proxy_tag, column_major_tag) { typedef F
functor_type; // R unnecessary, make_conformant not required typedef typename M::difference_type difference_type; typedef typename M::value_type value_type; BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ()); BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ()); #if BOOST_UBLAS_TYPE_CHECK matrix
cm (m.size1 (), m.size2 ()); indexing_matrix_assign
(cm, m, column_major_tag ()); indexing_matrix_assign
(cm, e, column_major_tag ()); #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 ()); difference_type it2_size (it2_end - it2); difference_type it2e_size (it2e_end - it2e); difference_type diff2 (0); if (it2_size > 0 && it2e_size > 0) diff2 = it2.index2 () - it2e.index2 (); if (diff2 != 0) { difference_type size2 = (std::min) (diff2, it2e_size); if (size2 > 0) { it2e += size2; it2e_size -= size2; diff2 -= size2; } size2 = (std::min) (- diff2, it2_size); if (size2 > 0) { it2_size -= size2; if (!functor_type::computed) { while (-- size2 >= 0) { // zeroing #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 difference_type size1 (it1_end - it1); while (-- size1 >= 0) functor_type::apply (*it1, value_type/*zero*/()), ++ it1; ++ it2; } } else { it2 += size2; } diff2 += size2; } } difference_type size2 ((std::min) (it2_size, it2e_size)); it2_size -= size2; it2e_size -= size2; while (-- size2 >= 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 difference_type it1_size (it1_end - it1); difference_type it1e_size (it1e_end - it1e); difference_type diff1 (0); if (it1_size > 0 && it1e_size > 0) { diff1 = it1.index1 () - it1e.index1 (); difference_type size1 = (std::min) (diff1, it1e_size); if (size1 > 0) { it1e += size1; it1e_size -= size1; diff1 -= size1; } size1 = (std::min) (- diff1, it1_size); if (size1 > 0) { it1_size -= size1; if (!functor_type::computed) { while (-- size1 >= 0) // zeroing functor_type::apply (*it1, value_type/*zero*/()), ++ it1; } else { it1 += size1; } diff1 += size1; } } difference_type size1 ((std::min) (it1_size, it1e_size)); it1_size -= size1; it1e_size -= size1; while (-- size1 >= 0) functor_type::apply (*it1, *it1e), ++ it1, ++ it1e; size1 = it1_size; if (!functor_type::computed) { while (-- size1 >= 0) // zeroing functor_type::apply (*it1, value_type/*zero*/()), ++ it1; } else { it1 += size1; } ++ it2, ++ it2e; } size2 = it2_size; if (!functor_type::computed) { while (-- size2 >= 0) { // zeroing #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 difference_type size1 (it1_end - it1); while (-- size1 >= 0) functor_type::apply (*it1, value_type/*zero*/()), ++ it1; ++ it2; } } else { it2 += size2; } #if BOOST_UBLAS_TYPE_CHECK if (! disable_type_check
::value) BOOST_UBLAS_CHECK (detail::expression_type_check (m, cm), external_logic ()); #endif } // Sparse row major case template
class F, class R, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_assign (M &m, const matrix_expression
&e, sparse_tag, row_major_tag) { typedef F
functor_type; // R unnecessary, make_conformant not required BOOST_STATIC_ASSERT ((!functor_type::computed)); BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ()); BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ()); typedef typename M::value_type value_type; // Sparse type has no numeric constraints to check m.clear (); typename E::const_iterator1 it1e (e ().begin1 ()); typename E::const_iterator1 it1e_end (e ().end1 ()); while (it1e != it1e_end) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename E::const_iterator2 it2e (it1e.begin ()); typename E::const_iterator2 it2e_end (it1e.end ()); #else typename E::const_iterator2 it2e (begin (it1e, iterator1_tag ())); typename E::const_iterator2 it2e_end (end (it1e, iterator1_tag ())); #endif while (it2e != it2e_end) { value_type t (*it2e); if (t != value_type/*zero*/()) m.insert_element (it2e.index1 (), it2e.index2 (), t); ++ it2e; } ++ it1e; } } // Sparse column major case template
class F, class R, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_assign (M &m, const matrix_expression
&e, sparse_tag, column_major_tag) { typedef F
functor_type; // R unnecessary, make_conformant not required BOOST_STATIC_ASSERT ((!functor_type::computed)); BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ()); BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ()); typedef typename M::value_type value_type; // Sparse type has no numeric constraints to check m.clear (); typename E::const_iterator2 it2e (e ().begin2 ()); typename E::const_iterator2 it2e_end (e ().end2 ()); while (it2e != it2e_end) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename E::const_iterator1 it1e (it2e.begin ()); typename E::const_iterator1 it1e_end (it2e.end ()); #else typename E::const_iterator1 it1e (begin (it2e, iterator2_tag ())); typename E::const_iterator1 it1e_end (end (it2e, iterator2_tag ())); #endif while (it1e != it1e_end) { value_type t (*it1e); if (t != value_type/*zero*/()) m.insert_element (it1e.index1 (), it1e.index2 (), t); ++ it1e; } ++ it2e; } } // Sparse proxy or functional row major case template
class F, class R, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_assign (M &m, const matrix_expression
&e, sparse_proxy_tag, row_major_tag) { typedef F
functor_type; typedef R conformant_restrict_type; typedef typename M::size_type size_type; typedef typename M::difference_type difference_type; typedef typename M::value_type value_type; BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ()); BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ()); #if BOOST_UBLAS_TYPE_CHECK matrix
cm (m.size1 (), m.size2 ()); indexing_matrix_assign
(cm, m, row_major_tag ()); indexing_matrix_assign
(cm, e, row_major_tag ()); #endif detail::make_conformant (m, e, row_major_tag (), conformant_restrict_type ()); typename M::iterator1 it1 (m.begin1 ()); typename M::iterator1 it1_end (m.end1 ()); typename E::const_iterator1 it1e (e ().begin1 ()); typename E::const_iterator1 it1e_end (e ().end1 ()); while (it1 != it1_end && it1e != it1e_end) { difference_type compare = it1.index1 () - it1e.index1 (); if (compare == 0) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename M::iterator2 it2_end (it1.end ()); typename E::const_iterator2 it2e (it1e.begin ()); typename E::const_iterator2 it2e_end (it1e.end ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename M::iterator2 it2_end (end (it1, iterator1_tag ())); typename E::const_iterator2 it2e (begin (it1e, iterator1_tag ())); typename E::const_iterator2 it2e_end (end (it1e, iterator1_tag ())); #endif if (it2 != it2_end && it2e != it2e_end) { size_type it2_index = it2.index2 (), it2e_index = it2e.index2 (); while (true) { difference_type compare = it2_index - it2e_index; if (compare == 0) { functor_type::apply (*it2, *it2e); ++ it2, ++ it2e; if (it2 != it2_end && it2e != it2e_end) { it2_index = it2.index2 (); it2e_index = it2e.index2 (); } else break; } else if (compare < 0) { if (!functor_type::computed) { functor_type::apply (*it2, value_type/*zero*/()); ++ it2; } else increment (it2, it2_end, - compare); if (it2 != it2_end) it2_index = it2.index2 (); else break; } else if (compare > 0) { increment (it2e, it2e_end, compare); if (it2e != it2e_end) it2e_index = it2e.index2 (); else break; } } } if (!functor_type::computed) { while (it2 != it2_end) { // zeroing functor_type::apply (*it2, value_type/*zero*/()); ++ it2; } } else { it2 = it2_end; } ++ it1, ++ it1e; } else if (compare < 0) { if (!functor_type::computed) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename M::iterator2 it2_end (it1.end ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename M::iterator2 it2_end (end (it1, iterator1_tag ())); #endif while (it2 != it2_end) { // zeroing functor_type::apply (*it2, value_type/*zero*/()); ++ it2; } ++ it1; } else { increment (it1, it1_end, - compare); } } else if (compare > 0) { increment (it1e, it1e_end, compare); } } if (!functor_type::computed) { while (it1 != it1_end) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename M::iterator2 it2_end (it1.end ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename M::iterator2 it2_end (end (it1, iterator1_tag ())); #endif while (it2 != it2_end) { // zeroing functor_type::apply (*it2, value_type/*zero*/()); ++ it2; } ++ it1; } } else { it1 = it1_end; } #if BOOST_UBLAS_TYPE_CHECK if (! disable_type_check
::value) BOOST_UBLAS_CHECK (detail::expression_type_check (m, cm), external_logic ()); #endif } // Sparse proxy or functional column major case template
class F, class R, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_assign (M &m, const matrix_expression
&e, sparse_proxy_tag, column_major_tag) { typedef F
functor_type; typedef R conformant_restrict_type; typedef typename M::size_type size_type; typedef typename M::difference_type difference_type; typedef typename M::value_type value_type; BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ()); BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ()); #if BOOST_UBLAS_TYPE_CHECK matrix
cm (m.size1 (), m.size2 ()); indexing_matrix_assign
(cm, m, column_major_tag ()); indexing_matrix_assign
(cm, e, column_major_tag ()); #endif detail::make_conformant (m, e, column_major_tag (), conformant_restrict_type ()); 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) { functor_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 (!functor_type::computed) { functor_type::apply (*it1, value_type/*zero*/()); // zeroing ++ 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 (!functor_type::computed) { while (it1 != it1_end) { // zeroing functor_type::apply (*it1, value_type/*zero*/()); ++ it1; } } else { it1 = it1_end; } ++ it2, ++ it2e; } else if (compare < 0) { if (!functor_type::computed) { #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) { // zeroing functor_type::apply (*it1, value_type/*zero*/()); ++ it1; } ++ it2; } else { increment (it2, it2_end, - compare); } } else if (compare > 0) { increment (it2e, it2e_end, compare); } } if (!functor_type::computed) { 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) { // zeroing functor_type::apply (*it1, value_type/*zero*/()); ++ it1; } ++ it2; } } else { it2 = it2_end; } #if BOOST_UBLAS_TYPE_CHECK if (! disable_type_check
::value) BOOST_UBLAS_CHECK (detail::expression_type_check (m, cm), external_logic ()); #endif } // Dispatcher template
class F, class M, class E> BOOST_UBLAS_INLINE void matrix_assign (M &m, const matrix_expression
&e) { typedef typename matrix_assign_traits
::computed, typename E::const_iterator1::iterator_category, typename E::const_iterator2::iterator_category>::storage_category storage_category; // give preference to matrix M's orientation if known typedef typename boost::mpl::if_
, typename E::orientation_category , typename M::orientation_category >::type orientation_category; typedef basic_full
unrestricted; matrix_assign
(m, e, storage_category (), orientation_category ()); } template
class F, class R, class M, class E> BOOST_UBLAS_INLINE void matrix_assign (M &m, const matrix_expression
&e) { typedef R conformant_restrict_type; typedef typename matrix_assign_traits
::computed, typename E::const_iterator1::iterator_category, typename E::const_iterator2::iterator_category>::storage_category storage_category; // give preference to matrix M's orientation if known typedef typename boost::mpl::if_
, typename E::orientation_category , typename M::orientation_category >::type orientation_category; matrix_assign
(m, e, storage_category (), orientation_category ()); } template
struct matrix_swap_traits { typedef SC storage_category; }; template<> struct matrix_swap_traits
{ typedef sparse_proxy_tag storage_category; }; template<> struct matrix_swap_traits
{ typedef sparse_proxy_tag storage_category; }; // Dense (proxy) row major case template
class F, class R, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_swap (M &m, matrix_expression
&e, dense_proxy_tag, row_major_tag) { typedef F
functor_type; // R unnecessary, make_conformant not required 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 R, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_swap (M &m, matrix_expression
&e, dense_proxy_tag, column_major_tag) { typedef F
functor_type; // R unnecessary, make_conformant not required 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 F, class R, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_swap (M &m, matrix_expression
&e, packed_proxy_tag, row_major_tag) { typedef F
functor_type; // R unnecessary, make_conformant not required 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) functor_type::apply (*it2, *it2e), ++ it2, ++ it2e; ++ it1, ++ it1e; } } // Packed (proxy) column major case template
class F, class R, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_swap (M &m, matrix_expression
&e, packed_proxy_tag, column_major_tag) { typedef F
functor_type; // R unnecessary, make_conformant not required 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.end2 () - it2, 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 (it2.end () - it1, 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 (end (it2, iterator2_tag ()) - it1, end (it2e, iterator2_tag ()) - it1e)); #endif while (-- size1 >= 0) functor_type::apply (*it1, *it1e), ++ it1, ++ it1e; ++ it2, ++ it2e; } } // Sparse (proxy) row major case template
class F, class R, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_swap (M &m, matrix_expression
&e, sparse_proxy_tag, row_major_tag) { typedef F
functor_type; typedef R conformant_restrict_type; typedef typename M::size_type size_type; typedef typename M::difference_type difference_type; typedef typename M::value_type value_type; BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ()); BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ()); detail::make_conformant (m, e, row_major_tag (), conformant_restrict_type ()); // FIXME should be a seperate restriction for E detail::make_conformant (e (), m, row_major_tag (), conformant_restrict_type ()); typename M::iterator1 it1 (m.begin1 ()); typename M::iterator1 it1_end (m.end1 ()); typename E::iterator1 it1e (e ().begin1 ()); typename E::iterator1 it1e_end (e ().end1 ()); while (it1 != it1_end && it1e != it1e_end) { difference_type compare = it1.index1 () - it1e.index1 (); if (compare == 0) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename M::iterator2 it2_end (it1.end ()); typename E::iterator2 it2e (it1e.begin ()); typename E::iterator2 it2e_end (it1e.end ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename M::iterator2 it2_end (end (it1, iterator1_tag ())); typename E::iterator2 it2e (begin (it1e, iterator1_tag ())); typename E::iterator2 it2e_end (end (it1e, iterator1_tag ())); #endif if (it2 != it2_end && it2e != it2e_end) { size_type it2_index = it2.index2 (), it2e_index = it2e.index2 (); while (true) { difference_type compare = it2_index - it2e_index; if (compare == 0) { functor_type::apply (*it2, *it2e); ++ it2, ++ it2e; if (it2 != it2_end && it2e != it2e_end) { it2_index = it2.index2 (); it2e_index = it2e.index2 (); } else break; } else if (compare < 0) { increment (it2, it2_end, - compare); if (it2 != it2_end) it2_index = it2.index2 (); else break; } else if (compare > 0) { increment (it2e, it2e_end, compare); if (it2e != it2e_end) it2e_index = it2e.index2 (); else break; } } } #if BOOST_UBLAS_TYPE_CHECK increment (it2e, it2e_end); increment (it2, it2_end); #endif ++ it1, ++ it1e; } else if (compare < 0) { #if BOOST_UBLAS_TYPE_CHECK while (it1.index1 () < it1e.index1 ()) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename M::iterator2 it2_end (it1.end ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename M::iterator2 it2_end (end (it1, iterator1_tag ())); #endif increment (it2, it2_end); ++ it1; } #else increment (it1, it1_end, - compare); #endif } else if (compare > 0) { #if BOOST_UBLAS_TYPE_CHECK while (it1e.index1 () < it1.index1 ()) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename E::iterator2 it2e (it1e.begin ()); typename E::iterator2 it2e_end (it1e.end ()); #else typename E::iterator2 it2e (begin (it1e, iterator1_tag ())); typename E::iterator2 it2e_end (end (it1e, iterator1_tag ())); #endif increment (it2e, it2e_end); ++ it1e; } #else increment (it1e, it1e_end, compare); #endif } } #if BOOST_UBLAS_TYPE_CHECK while (it1e != it1e_end) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename E::iterator2 it2e (it1e.begin ()); typename E::iterator2 it2e_end (it1e.end ()); #else typename E::iterator2 it2e (begin (it1e, iterator1_tag ())); typename E::iterator2 it2e_end (end (it1e, iterator1_tag ())); #endif increment (it2e, it2e_end); ++ it1e; } while (it1 != it1_end) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename M::iterator2 it2 (it1.begin ()); typename M::iterator2 it2_end (it1.end ()); #else typename M::iterator2 it2 (begin (it1, iterator1_tag ())); typename M::iterator2 it2_end (end (it1, iterator1_tag ())); #endif increment (it2, it2_end); ++ it1; } #endif } // Sparse (proxy) column major case template
class F, class R, class M, class E> // BOOST_UBLAS_INLINE This function seems to be big. So we do not let the compiler inline it. void matrix_swap (M &m, matrix_expression
&e, sparse_proxy_tag, column_major_tag) { typedef F
functor_type; typedef R conformant_restrict_type; typedef typename M::size_type size_type; typedef typename M::difference_type difference_type; typedef typename M::value_type value_type; BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ()); BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ()); detail::make_conformant (m, e, column_major_tag (), conformant_restrict_type ()); // FIXME should be a seperate restriction for E detail::make_conformant (e (), m, column_major_tag (), conformant_restrict_type ()); typename M::iterator2 it2 (m.begin2 ()); typename M::iterator2 it2_end (m.end2 ()); typename E::iterator2 it2e (e ().begin2 ()); typename E::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::iterator1 it1e (it2e.begin ()); typename E::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::iterator1 it1e (begin (it2e, iterator2_tag ())); typename E::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) { functor_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) { 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_UBLAS_TYPE_CHECK increment (it1e, it1e_end); increment (it1, it1_end); #endif ++ it2, ++ it2e; } else if (compare < 0) { #if BOOST_UBLAS_TYPE_CHECK while (it2.index2 () < it2e.index2 ()) { #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 increment (it1, it1_end); ++ it2; } #else increment (it2, it2_end, - compare); #endif } else if (compare > 0) { #if BOOST_UBLAS_TYPE_CHECK while (it2e.index2 () < it2.index2 ()) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename E::iterator1 it1e (it2e.begin ()); typename E::iterator1 it1e_end (it2e.end ()); #else typename E::iterator1 it1e (begin (it2e, iterator2_tag ())); typename E::iterator1 it1e_end (end (it2e, iterator2_tag ())); #endif increment (it1e, it1e_end); ++ it2e; } #else increment (it2e, it2e_end, compare); #endif } } #if BOOST_UBLAS_TYPE_CHECK while (it2e != it2e_end) { #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION typename E::iterator1 it1e (it2e.begin ()); typename E::iterator1 it1e_end (it2e.end ()); #else typename E::iterator1 it1e (begin (it2e, iterator2_tag ())); typename E::iterator1 it1e_end (end (it2e, iterator2_tag ())); #endif increment (it1e, it1e_end); ++ it2e; } 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 increment (it1, it1_end); ++ it2; } #endif } // Dispatcher template
class F, class M, class E> BOOST_UBLAS_INLINE void matrix_swap (M &m, matrix_expression
&e) { typedef typename matrix_swap_traits
::storage_category storage_category; // give preference to matrix M's orientation if known typedef typename boost::mpl::if_
, typename E::orientation_category , typename M::orientation_category >::type orientation_category; typedef basic_full
unrestricted; matrix_swap
(m, e, storage_category (), orientation_category ()); } template
class F, class R, class M, class E> BOOST_UBLAS_INLINE void matrix_swap (M &m, matrix_expression
&e) { typedef R conformant_restrict_type; typedef typename matrix_swap_traits
::storage_category storage_category; // give preference to matrix M's orientation if known typedef typename boost::mpl::if_
, typename E::orientation_category , typename M::orientation_category >::type orientation_category; matrix_swap
(m, e, storage_category (), orientation_category ()); } }}} #endif
matrix_assign.hpp
Page URL
File URL
Prev
7/11
Next
Download
( 77 KB )
Note: The DriveHQ service banners will NOT be displayed if the file owner is a paid member.
Comments
Total ratings:
0
Average rating:
Not Rated
Would you like to comment?
Join DriveHQ
for a free account, or
Logon
if you are already a member.