forked from boostorg/range
[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:
@ -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
|
||||||
|
Reference in New Issue
Block a user