add Enabler template argument to range_iterator, range_const_iterator and range_mutable_iterator extension points.

This commit is contained in:
Neil Groves
2014-06-04 12:23:40 +01:00
parent 698a083e65
commit 60025220f5
6 changed files with 194 additions and 30 deletions

View File

@ -31,37 +31,47 @@ namespace boost
// default
//////////////////////////////////////////////////////////////////////////
namespace range_detail {
BOOST_RANGE_EXTRACT_OPTIONAL_TYPE( iterator )
}
template< typename C >
struct range_mutable_iterator
: range_detail::extract_iterator<
BOOST_DEDUCED_TYPENAME remove_reference<C>::type>
{};
//////////////////////////////////////////////////////////////////////////
// pair
//////////////////////////////////////////////////////////////////////////
template< typename Iterator >
struct range_mutable_iterator< std::pair<Iterator,Iterator> >
namespace range_detail
{
typedef Iterator type;
};
//////////////////////////////////////////////////////////////////////////
// array
//////////////////////////////////////////////////////////////////////////
BOOST_RANGE_EXTRACT_OPTIONAL_TYPE( iterator )
template< typename T, std::size_t sz >
struct range_mutable_iterator< T[sz] >
{
typedef T* type;
};
template< typename C >
struct range_mutable_iterator
: range_detail::extract_iterator<
BOOST_DEDUCED_TYPENAME remove_reference<C>::type>
{};
//////////////////////////////////////////////////////////////////////////
// pair
//////////////////////////////////////////////////////////////////////////
template< typename Iterator >
struct range_mutable_iterator< std::pair<Iterator,Iterator> >
{
typedef Iterator type;
};
//////////////////////////////////////////////////////////////////////////
// array
//////////////////////////////////////////////////////////////////////////
template< typename T, std::size_t sz >
struct range_mutable_iterator< T[sz] >
{
typedef T* type;
};
} // namespace range_detail
template<typename C, typename Enabler=void>
struct range_mutable_iterator
: range_detail::range_mutable_iterator<
BOOST_DEDUCED_TYPENAME remove_reference<C>::type
>
{
};
} // namespace boost
#endif