mirror of
https://github.com/boostorg/iterator.git
synced 2025-07-16 22:22:19 +02:00
Workaround MSVC 14.1 problem with template specialization partial ordering that caused compilation failure when next/prior is used with pointers. Added a test.
This commit is contained in:
@ -46,13 +46,13 @@ namespace next_prior_detail {
|
|||||||
// Since C++17 we can test for iterator_traits<T>::iterator_category presence instead as it is
|
// Since C++17 we can test for iterator_traits<T>::iterator_category presence instead as it is
|
||||||
// required to be only present for iterators.
|
// required to be only present for iterators.
|
||||||
template< typename T, typename Void = void >
|
template< typename T, typename Void = void >
|
||||||
struct is_iterator
|
struct is_iterator_class
|
||||||
{
|
{
|
||||||
static BOOST_CONSTEXPR_OR_CONST bool value = false;
|
static BOOST_CONSTEXPR_OR_CONST bool value = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
template< typename T >
|
template< typename T >
|
||||||
struct is_iterator<
|
struct is_iterator_class<
|
||||||
T,
|
T,
|
||||||
typename enable_if_has_type<
|
typename enable_if_has_type<
|
||||||
#if !defined(BOOST_NO_CXX17_ITERATOR_TRAITS)
|
#if !defined(BOOST_NO_CXX17_ITERATOR_TRAITS)
|
||||||
@ -67,7 +67,13 @@ struct is_iterator<
|
|||||||
};
|
};
|
||||||
|
|
||||||
template< typename T >
|
template< typename T >
|
||||||
struct is_iterator< T*, void >
|
struct is_iterator :
|
||||||
|
public is_iterator_class< T >
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename T >
|
||||||
|
struct is_iterator< T* >
|
||||||
{
|
{
|
||||||
static BOOST_CONSTEXPR_OR_CONST bool value = true;
|
static BOOST_CONSTEXPR_OR_CONST bool value = true;
|
||||||
};
|
};
|
||||||
|
@ -92,6 +92,15 @@ int main(int, char*[])
|
|||||||
BOOST_TEST(minus_n_unsigned_test(x.rbegin(), x.rend(), x.size()));
|
BOOST_TEST(minus_n_unsigned_test(x.rbegin(), x.rend(), x.size()));
|
||||||
BOOST_TEST(minus_n_unsigned_test(x.rbegin(), x.rend(), y.size()));
|
BOOST_TEST(minus_n_unsigned_test(x.rbegin(), x.rend(), y.size()));
|
||||||
|
|
||||||
|
// Test with pointers
|
||||||
|
int arr[8] = {};
|
||||||
|
int* p = arr;
|
||||||
|
BOOST_TEST(plus_one_test(x.begin(), x.end(), p));
|
||||||
|
BOOST_TEST(plus_n_test(x.begin(), x.end(), p));
|
||||||
|
BOOST_TEST(minus_one_test(x.begin(), x.end(), p + sizeof(arr)));
|
||||||
|
BOOST_TEST(minus_n_test(x.begin(), x.end(), p + sizeof(arr)));
|
||||||
|
BOOST_TEST(minus_n_unsigned_test(p, p + sizeof(arr), sizeof(arr)));
|
||||||
|
|
||||||
// Tests with integers
|
// Tests with integers
|
||||||
BOOST_TEST(boost::next(5) == 6);
|
BOOST_TEST(boost::next(5) == 6);
|
||||||
BOOST_TEST(boost::next(5, 7) == 12);
|
BOOST_TEST(boost::next(5, 7) == 12);
|
||||||
|
Reference in New Issue
Block a user