diff options
Diffstat (limited to 'boost/numeric/ublas/matrix_sparse.hpp')
-rw-r--r-- | boost/numeric/ublas/matrix_sparse.hpp | 412 |
1 files changed, 408 insertions, 4 deletions
diff --git a/boost/numeric/ublas/matrix_sparse.hpp b/boost/numeric/ublas/matrix_sparse.hpp index 9324108eb1..b702743349 100644 --- a/boost/numeric/ublas/matrix_sparse.hpp +++ b/boost/numeric/ublas/matrix_sparse.hpp @@ -742,6 +742,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator2 cbegin () const { + return begin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_iterator2 end () const { const self_type &m = (*this) (); return m.find2 (1, index1 (), m.size2 ()); @@ -750,6 +757,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator2 cend () const { + return end (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator2 rbegin () const { return const_reverse_iterator2 (end ()); } @@ -757,9 +771,23 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_reverse_iterator2 crbegin () const { + return rbegin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator2 rend () const { return const_reverse_iterator2 (begin ()); } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif + const_reverse_iterator2 crend () const { + return rend (); + } #endif // Indices @@ -820,9 +848,17 @@ namespace boost { namespace numeric { namespace ublas { return find1 (0, 0, 0); } BOOST_UBLAS_INLINE + const_iterator1 cbegin1 () const { + return begin1 (); + } + BOOST_UBLAS_INLINE const_iterator1 end1 () const { return find1 (0, size1_, 0); } + BOOST_UBLAS_INLINE + const_iterator1 cend1 () const { + return end1 (); + } class iterator1: public container_reference<mapped_matrix>, @@ -1039,6 +1075,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator1 cbegin () const { + return begin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_iterator1 end () const { const self_type &m = (*this) (); return m.find1 (1, m.size1 (), index2 ()); @@ -1047,6 +1090,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator1 cend () const { + return end (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator1 rbegin () const { return const_reverse_iterator1 (end ()); } @@ -1054,9 +1104,23 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_reverse_iterator1 crbegin () const { + return rbegin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator1 rend () const { return const_reverse_iterator1 (begin ()); } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif + const_reverse_iterator1 crend () const { + return rend (); + } #endif // Indices @@ -1117,9 +1181,17 @@ namespace boost { namespace numeric { namespace ublas { return find2 (0, 0, 0); } BOOST_UBLAS_INLINE + const_iterator2 cbegin2 () const { + return begin2 (); + } + BOOST_UBLAS_INLINE const_iterator2 end2 () const { return find2 (0, 0, size2_); } + BOOST_UBLAS_INLINE + const_iterator2 cend2 () const { + return end2 (); + } class iterator2: public container_reference<mapped_matrix>, @@ -1276,9 +1348,17 @@ namespace boost { namespace numeric { namespace ublas { return const_reverse_iterator1 (end1 ()); } BOOST_UBLAS_INLINE + const_reverse_iterator1 crbegin1 () const { + return rbegin1 (); + } + BOOST_UBLAS_INLINE const_reverse_iterator1 rend1 () const { return const_reverse_iterator1 (begin1 ()); } + BOOST_UBLAS_INLINE + const_reverse_iterator1 crend1 () const { + return rend1 (); + } BOOST_UBLAS_INLINE reverse_iterator1 rbegin1 () { @@ -1294,9 +1374,17 @@ namespace boost { namespace numeric { namespace ublas { return const_reverse_iterator2 (end2 ()); } BOOST_UBLAS_INLINE + const_reverse_iterator2 crbegin2 () const { + return rbegin2 (); + } + BOOST_UBLAS_INLINE const_reverse_iterator2 rend2 () const { return const_reverse_iterator2 (begin2 ()); } + BOOST_UBLAS_INLINE + const_reverse_iterator2 crend2 () const { + return rend2 (); + } BOOST_UBLAS_INLINE reverse_iterator2 rbegin2 () { @@ -1359,7 +1447,7 @@ namespace boost { namespace numeric { namespace ublas { #endif typedef const matrix_reference<const self_type> const_closure_type; typedef matrix_reference<self_type> closure_type; - typedef mapped_vector<T, typename A::value_type> vector_temporary_type; + typedef mapped_vector<T> vector_temporary_type; typedef self_type matrix_temporary_type; typedef typename A::value_type::second_type vector_data_value_type; typedef sparse_tag storage_category; @@ -1530,7 +1618,7 @@ namespace boost { namespace numeric { namespace ublas { template<class C> // Container assignment without temporary BOOST_UBLAS_INLINE mapped_vector_of_mapped_vector &operator = (const matrix_container<C> &m) { - resize (m ().size1 (), m ().size2 ()); + resize (m ().size1 (), m ().size2 (), false); assign (m); return *this; } @@ -1940,6 +2028,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator2 cbegin () const { + return begin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_iterator2 end () const { const self_type &m = (*this) (); return m.find2 (1, index1 (), m.size2 ()); @@ -1948,6 +2043,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator2 cend () const { + return end (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator2 rbegin () const { return const_reverse_iterator2 (end ()); } @@ -1955,9 +2057,23 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_reverse_iterator2 crbegin () const { + return rbegin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator2 rend () const { return const_reverse_iterator2 (begin ()); } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif + const_reverse_iterator2 crend () const { + return rend (); + } #endif // Indices @@ -2018,9 +2134,17 @@ namespace boost { namespace numeric { namespace ublas { return find1 (0, 0, 0); } BOOST_UBLAS_INLINE + const_iterator1 cbegin1 () const { + return begin1 (); + } + BOOST_UBLAS_INLINE const_iterator1 end1 () const { return find1 (0, size1_, 0); } + BOOST_UBLAS_INLINE + const_iterator1 cend1 () const { + return end1 (); + } class iterator1: public container_reference<mapped_vector_of_mapped_vector>, @@ -2295,6 +2419,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator1 cbegin () const { + return begin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_iterator1 end () const { const self_type &m = (*this) (); return m.find1 (1, m.size1 (), index2 ()); @@ -2303,6 +2434,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator1 cend () const { + return end (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator1 rbegin () const { return const_reverse_iterator1 (end ()); } @@ -2310,9 +2448,23 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_reverse_iterator1 crbegin () const { + return rbegin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator1 rend () const { return const_reverse_iterator1 (begin ()); } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif + const_reverse_iterator1 crend () const { + return rend (); + } #endif // Indices @@ -2373,9 +2525,17 @@ namespace boost { namespace numeric { namespace ublas { return find2 (0, 0, 0); } BOOST_UBLAS_INLINE + const_iterator2 cbegin2 () const { + return begin2 (); + } + BOOST_UBLAS_INLINE const_iterator2 end2 () const { return find2 (0, 0, size2_); } + BOOST_UBLAS_INLINE + const_iterator2 cend2 () const { + return end2 (); + } class iterator2: public container_reference<mapped_vector_of_mapped_vector>, @@ -2561,9 +2721,17 @@ namespace boost { namespace numeric { namespace ublas { return const_reverse_iterator1 (end1 ()); } BOOST_UBLAS_INLINE + const_reverse_iterator1 crbegin1 () const { + return rbegin1 (); + } + BOOST_UBLAS_INLINE const_reverse_iterator1 rend1 () const { return const_reverse_iterator1 (begin1 ()); } + BOOST_UBLAS_INLINE + const_reverse_iterator1 crend1 () const { + return rend1 (); + } BOOST_UBLAS_INLINE reverse_iterator1 rbegin1 () { @@ -2579,9 +2747,17 @@ namespace boost { namespace numeric { namespace ublas { return const_reverse_iterator2 (end2 ()); } BOOST_UBLAS_INLINE + const_reverse_iterator2 crbegin2 () const { + return rbegin2 (); + } + BOOST_UBLAS_INLINE const_reverse_iterator2 rend2 () const { return const_reverse_iterator2 (begin2 ()); } + BOOST_UBLAS_INLINE + const_reverse_iterator2 crend2 () const { + return rend2 (); + } BOOST_UBLAS_INLINE reverse_iterator2 rbegin2 () { @@ -3356,6 +3532,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator2 cbegin () const { + return begin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_iterator2 end () const { const self_type &m = (*this) (); return m.find2 (1, index1 (), m.size2 ()); @@ -3364,6 +3547,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator2 cend () const { + return end (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator2 rbegin () const { return const_reverse_iterator2 (end ()); } @@ -3371,9 +3561,23 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_reverse_iterator2 crbegin () const { + return rbegin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator2 rend () const { return const_reverse_iterator2 (begin ()); } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif + const_reverse_iterator2 crend () const { + return rend (); + } #endif // Indices @@ -3434,9 +3638,17 @@ namespace boost { namespace numeric { namespace ublas { return find1 (0, 0, 0); } BOOST_UBLAS_INLINE + const_iterator1 cbegin1 () const { + return begin1 (); + } + BOOST_UBLAS_INLINE const_iterator1 end1 () const { return find1 (0, size1_, 0); } + BOOST_UBLAS_INLINE + const_iterator1 cend1 () const { + return end1 (); + } class iterator1: public container_reference<compressed_matrix>, @@ -3665,6 +3877,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator1 cbegin () const { + return begin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_iterator1 end () const { const self_type &m = (*this) (); return m.find1 (1, m.size1 (), index2 ()); @@ -3673,6 +3892,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator1 cend () const { + return end (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator1 rbegin () const { return const_reverse_iterator1 (end ()); } @@ -3680,9 +3906,23 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_reverse_iterator1 crbegin () const { + return rbegin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator1 rend () const { return const_reverse_iterator1 (begin ()); } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif + const_reverse_iterator1 crend () const { + return rend (); + } #endif // Indices @@ -3743,9 +3983,17 @@ namespace boost { namespace numeric { namespace ublas { return find2 (0, 0, 0); } BOOST_UBLAS_INLINE + const_iterator2 cbegin2 () const { + return begin2 (); + } + BOOST_UBLAS_INLINE const_iterator2 end2 () const { return find2 (0, 0, size2_); } + BOOST_UBLAS_INLINE + const_iterator2 cend2 () const { + return end2 (); + } class iterator2: public container_reference<compressed_matrix>, @@ -3908,9 +4156,17 @@ namespace boost { namespace numeric { namespace ublas { return const_reverse_iterator1 (end1 ()); } BOOST_UBLAS_INLINE + const_reverse_iterator1 crbegin1 () const { + return rbegin1 (); + } + BOOST_UBLAS_INLINE const_reverse_iterator1 rend1 () const { return const_reverse_iterator1 (begin1 ()); } + BOOST_UBLAS_INLINE + const_reverse_iterator1 crend1 () const { + return rend1 (); + } BOOST_UBLAS_INLINE reverse_iterator1 rbegin1 () { @@ -3926,9 +4182,17 @@ namespace boost { namespace numeric { namespace ublas { return const_reverse_iterator2 (end2 ()); } BOOST_UBLAS_INLINE + const_reverse_iterator2 crbegin2 () const { + return rbegin2 (); + } + BOOST_UBLAS_INLINE const_reverse_iterator2 rend2 () const { return const_reverse_iterator2 (begin2 ()); } + BOOST_UBLAS_INLINE + const_reverse_iterator2 crend2 () const { + return rend2 (); + } BOOST_UBLAS_INLINE reverse_iterator2 rbegin2 () { @@ -4391,17 +4655,69 @@ namespace boost { namespace numeric { namespace ublas { m1.swap (m2); } + // replacement if STL lower bound algorithm for use of inplace_merge + array_size_type lower_bound (array_size_type beg, array_size_type end, array_size_type target) const { + while (end > beg) { + array_size_type mid = (beg + end) / 2; + if (((index1_data_[mid] < index1_data_[target]) || + ((index1_data_[mid] == index1_data_[target]) && + (index2_data_[mid] < index2_data_[target])))) { + beg = mid + 1; + } else { + end = mid; + } + } + return beg; + } + + // specialized replacement of STL inplace_merge to avoid compilation + // problems with respect to the array_triple iterator + void inplace_merge (array_size_type beg, array_size_type mid, array_size_type end) const { + array_size_type len_lef = mid - beg; + array_size_type len_rig = end - mid; + + if (len_lef == 1 && len_rig == 1) { + if ((index1_data_[mid] < index1_data_[beg]) || + ((index1_data_[mid] == index1_data_[beg]) && (index2_data_[mid] < index2_data_[beg]))) + { + std::swap(index1_data_[beg], index1_data_[mid]); + std::swap(index2_data_[beg], index2_data_[mid]); + std::swap(value_data_[beg], value_data_[mid]); + } + } else if (len_lef > 0 && len_rig > 0) { + array_size_type lef_mid, rig_mid; + if (len_lef >= len_rig) { + lef_mid = (beg + mid) / 2; + rig_mid = lower_bound(mid, end, lef_mid); + } else { + rig_mid = (mid + end) / 2; + lef_mid = lower_bound(beg, mid, rig_mid); + } + std::rotate(&index1_data_[0] + lef_mid, &index1_data_[0] + mid, &index1_data_[0] + rig_mid); + std::rotate(&index2_data_[0] + lef_mid, &index2_data_[0] + mid, &index2_data_[0] + rig_mid); + std::rotate(&value_data_[0] + lef_mid, &value_data_[0] + mid, &value_data_[0] + rig_mid); + + array_size_type new_mid = lef_mid + rig_mid - mid; + inplace_merge(beg, lef_mid, new_mid); + inplace_merge(new_mid, rig_mid, end); + } + } + // Sorting and summation of duplicates BOOST_UBLAS_INLINE void sort () const { if (! sorted_ && filled_ > 0) { typedef index_triple_array<index_array_type, index_array_type, value_array_type> array_triple; array_triple ita (filled_, index1_data_, index2_data_, value_data_); +#ifndef BOOST_UBLAS_COO_ALWAYS_DO_FULL_SORT const typename array_triple::iterator iunsorted = ita.begin () + sorted_filled_; // sort new elements and merge std::sort (iunsorted, ita.end ()); - std::inplace_merge (ita.begin (), iunsorted, ita.end ()); - + inplace_merge(0, sorted_filled_, filled_); +#else + const typename array_triple::iterator iunsorted = ita.begin (); + std::sort (iunsorted, ita.end ()); +#endif // sum duplicates with += and remove array_size_type filled = 0; for (array_size_type i = 1; i < filled_; ++ i) { @@ -4720,6 +5036,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator2 cbegin () const { + return begin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_iterator2 end () const { const self_type &m = (*this) (); return m.find2 (1, index1 (), m.size2 ()); @@ -4728,6 +5051,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator2 cend () const { + return end (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator2 rbegin () const { return const_reverse_iterator2 (end ()); } @@ -4735,9 +5065,23 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_reverse_iterator2 crbegin () const { + return rbegin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator2 rend () const { return const_reverse_iterator2 (begin ()); } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif + const_reverse_iterator2 crend () const { + return rend (); + } #endif // Indices @@ -4798,9 +5142,17 @@ namespace boost { namespace numeric { namespace ublas { return find1 (0, 0, 0); } BOOST_UBLAS_INLINE + const_iterator1 cbegin1 () const { + return begin1 (); + } + BOOST_UBLAS_INLINE const_iterator1 end1 () const { return find1 (0, size1_, 0); } + BOOST_UBLAS_INLINE + const_iterator1 cend1 () const { + return end1 (); + } class iterator1: public container_reference<coordinate_matrix>, @@ -5029,6 +5381,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator1 cbegin () const { + return begin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_iterator1 end () const { const self_type &m = (*this) (); return m.find1 (1, m.size1 (), index2 ()); @@ -5037,6 +5396,13 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_iterator1 cend () const { + return end (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator1 rbegin () const { return const_reverse_iterator1 (end ()); } @@ -5044,9 +5410,23 @@ namespace boost { namespace numeric { namespace ublas { #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION typename self_type:: #endif + const_reverse_iterator1 crbegin () const { + return rbegin (); + } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif const_reverse_iterator1 rend () const { return const_reverse_iterator1 (begin ()); } + BOOST_UBLAS_INLINE +#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION + typename self_type:: +#endif + const_reverse_iterator1 crend () const { + return rend (); + } #endif // Indices @@ -5107,9 +5487,17 @@ namespace boost { namespace numeric { namespace ublas { return find2 (0, 0, 0); } BOOST_UBLAS_INLINE + const_iterator2 cbegin2 () const { + return begin2 (); + } + BOOST_UBLAS_INLINE const_iterator2 end2 () const { return find2 (0, 0, size2_); } + BOOST_UBLAS_INLINE + const_iterator2 cend2 () const { + return end2 (); + } class iterator2: public container_reference<coordinate_matrix>, @@ -5272,9 +5660,17 @@ namespace boost { namespace numeric { namespace ublas { return const_reverse_iterator1 (end1 ()); } BOOST_UBLAS_INLINE + const_reverse_iterator1 crbegin1 () const { + return rbegin1 (); + } + BOOST_UBLAS_INLINE const_reverse_iterator1 rend1 () const { return const_reverse_iterator1 (begin1 ()); } + BOOST_UBLAS_INLINE + const_reverse_iterator1 crend1 () const { + return rend1 (); + } BOOST_UBLAS_INLINE reverse_iterator1 rbegin1 () { @@ -5290,9 +5686,17 @@ namespace boost { namespace numeric { namespace ublas { return const_reverse_iterator2 (end2 ()); } BOOST_UBLAS_INLINE + const_reverse_iterator2 crbegin2 () const { + return rbegin2 (); + } + BOOST_UBLAS_INLINE const_reverse_iterator2 rend2 () const { return const_reverse_iterator2 (begin2 ()); } + BOOST_UBLAS_INLINE + const_reverse_iterator2 crend2 () const { + return rend2 (); + } BOOST_UBLAS_INLINE reverse_iterator2 rbegin2 () { |