forked from boostorg/range
[boost][range] - merge from trunk of miscellaneous defect fixes
[SVN r72427]
This commit is contained in:
16
include/boost/range/detail/demote_iterator_traversal_tag.hpp
Executable file → Normal file
16
include/boost/range/detail/demote_iterator_traversal_tag.hpp
Executable file → Normal file
@ -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 supplied a fix to supply the level of interoperability I had
|
||||
// originally intended, but failed to implement.
|
||||
//
|
||||
// For more information, see http://www.boost.org/libs/range/
|
||||
//
|
||||
@ -19,12 +22,12 @@ namespace boost
|
||||
{
|
||||
|
||||
template<class IteratorTraversalTag1, class IteratorTraversalTag2>
|
||||
struct demote_iterator_traversal_tag
|
||||
struct inner_demote_iterator_traversal_tag
|
||||
{
|
||||
};
|
||||
|
||||
#define BOOST_DEMOTE_TRAVERSAL_TAG( Tag1, Tag2, ResultTag ) \
|
||||
template<> struct demote_iterator_traversal_tag< Tag1 , Tag2 > \
|
||||
template<> struct inner_demote_iterator_traversal_tag< Tag1 , Tag2 > \
|
||||
{ \
|
||||
typedef ResultTag type; \
|
||||
};
|
||||
@ -73,6 +76,15 @@ BOOST_DEMOTE_TRAVERSAL_TAG( random_access_traversal_tag, random_access_traversal
|
||||
|
||||
#undef BOOST_DEMOTE_TRAVERSAL_TAG
|
||||
|
||||
template<class IteratorTraversalTag1, class IteratorTraversalTag2>
|
||||
struct demote_iterator_traversal_tag
|
||||
: inner_demote_iterator_traversal_tag<
|
||||
typename boost::detail::pure_traversal_tag< IteratorTraversalTag1 >::type,
|
||||
typename boost::detail::pure_traversal_tag< IteratorTraversalTag2 >::type
|
||||
>
|
||||
{
|
||||
};
|
||||
|
||||
} // namespace range_detail
|
||||
} // namespace boost
|
||||
|
||||
|
4
include/boost/range/detail/detail_str.hpp
Executable file → Normal file
4
include/boost/range/detail/detail_str.hpp
Executable file → Normal file
@ -134,8 +134,8 @@ namespace boost
|
||||
|
||||
#include <boost/range/detail/begin.hpp>
|
||||
#include <boost/range/detail/end.hpp>
|
||||
#include <boost/range/detail/size_type>
|
||||
#include <boost/range/detail/value_type>
|
||||
#include <boost/range/detail/size_type.hpp>
|
||||
#include <boost/range/detail/value_type.hpp>
|
||||
#include <boost/range/detail/common.hpp>
|
||||
|
||||
namespace boost
|
||||
|
@ -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<typename Iterator1
|
||||
, typename Iterator2
|
||||
, 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 iterator_traversal<Iterator1>::type
|
||||
, typename iterator_traversal<Iterator2>::type>::type
|
||||
|
Reference in New Issue
Block a user