[range] - Improved default Reference type deduction for the join_iterator as implemented by aschoedl in Trac issue 5061.

[SVN r70041]
This commit is contained in:
Neil Groves
2011-03-16 23:55:25 +00:00
parent c6a6a46db4
commit f8bb8aafbf

View File

@ -5,6 +5,9 @@
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt) // http://www.boost.org/LICENSE_1_0.txt)
// //
// Acknowledgements:
// aschoedl contributed an improvement to the determination
// of the Reference type parameter.
// //
// For more information, see http://www.boost.org/libs/range/ // For more information, see http://www.boost.org/libs/range/
// //
@ -120,7 +123,32 @@ private:
template<typename Iterator1 template<typename Iterator1
, typename Iterator2 , typename Iterator2
, typename ValueType = typename iterator_value<Iterator1>::type , typename ValueType = typename iterator_value<Iterator1>::type
, typename Reference = typename iterator_reference<Iterator1>::type // find least demanding, commonly supported reference type, in the order &, const&, and by-value:
, typename Reference = typename mpl::if_c<
!is_reference<typename iterator_reference<Iterator1>::type>::value
|| !is_reference<typename iterator_reference<Iterator2>::type>::value,
typename remove_const<
typename remove_reference<
typename iterator_reference<Iterator1>::type
>::type
>::type,
typename mpl::if_c<
is_const<
typename remove_reference<
typename iterator_reference<Iterator1>::type
>::type
>::value
|| is_const<
typename remove_reference<
typename iterator_reference<Iterator2>::type
>::type
>::value,
typename add_const<
typename iterator_reference<Iterator2>::type
>::type,
typename iterator_reference<Iterator1>::type
>::type
>::type
, typename Traversal = typename demote_iterator_traversal_tag< , typename Traversal = typename demote_iterator_traversal_tag<
typename iterator_traversal<Iterator1>::type typename iterator_traversal<Iterator1>::type
, typename iterator_traversal<Iterator2>::type>::type , typename iterator_traversal<Iterator2>::type>::type