From f8bb8aafbfce1f8ca8876fe4f27badd2e73b1282 Mon Sep 17 00:00:00 2001 From: Neil Groves Date: Wed, 16 Mar 2011 23:55:25 +0000 Subject: [PATCH] [range] - Improved default Reference type deduction for the join_iterator as implemented by aschoedl in Trac issue 5061. [SVN r70041] --- include/boost/range/detail/join_iterator.hpp | 30 +++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/include/boost/range/detail/join_iterator.hpp b/include/boost/range/detail/join_iterator.hpp index d22292b..ce86467 100644 --- a/include/boost/range/detail/join_iterator.hpp +++ b/include/boost/range/detail/join_iterator.hpp @@ -5,6 +5,9 @@ // 1.0. (See accompanying file LICENSE_1_0.txt or copy at // 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/ // @@ -120,7 +123,32 @@ private: template::type - , typename Reference = typename iterator_reference::type + // find least demanding, commonly supported reference type, in the order &, const&, and by-value: + , typename Reference = typename mpl::if_c< + !is_reference::type>::value + || !is_reference::type>::value, + typename remove_const< + typename remove_reference< + typename iterator_reference::type + >::type + >::type, + typename mpl::if_c< + is_const< + typename remove_reference< + typename iterator_reference::type + >::type + >::value + || is_const< + typename remove_reference< + typename iterator_reference::type + >::type + >::value, + typename add_const< + typename iterator_reference::type + >::type, + typename iterator_reference::type + >::type + >::type , typename Traversal = typename demote_iterator_traversal_tag< typename iterator_traversal::type , typename iterator_traversal::type>::type