mirror of
https://github.com/boostorg/iterator.git
synced 2026-01-28 01:12:20 +01:00
Add static_assert messages.
This commit is contained in:
committed by
Georgy Guminov
parent
82b5c44cd3
commit
4ab19e045f
@@ -34,7 +34,7 @@ namespace detail
|
||||
struct is_numeric_impl
|
||||
{
|
||||
// For a while, this wasn't true, but we rely on it below. This is a regression assert.
|
||||
static_assert(std::is_integral<char>::value, "");
|
||||
static_assert(std::is_integral<char>::value, "std::is_integral<char> is expected to be true");
|
||||
|
||||
# ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
|
||||
|
||||
|
||||
@@ -136,13 +136,15 @@ struct iterator_category_with_traversal
|
||||
!std::is_convertible<
|
||||
typename iterator_category_to_traversal<Category>::type
|
||||
, Traversal
|
||||
>::value, "");
|
||||
>::value,
|
||||
"Category transformed to corresponding traversal must be convertible to Traversal."
|
||||
);
|
||||
|
||||
static_assert(is_iterator_category<Category>::value, "");
|
||||
static_assert(!is_iterator_category<Traversal>::value, "");
|
||||
static_assert(!is_iterator_traversal<Category>::value, "");
|
||||
static_assert(is_iterator_category<Category>::value, "Category must be an STL iterator category.");
|
||||
static_assert(!is_iterator_category<Traversal>::value, "Traversal must not be an STL iterator category.");
|
||||
static_assert(!is_iterator_traversal<Category>::value, "Category must not be a traversal tag.");
|
||||
# if !BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
|
||||
static_assert(is_iterator_traversal<Traversal>::value, "");
|
||||
static_assert(is_iterator_traversal<Traversal>::value, "Traversal must be a traversal tag.");
|
||||
# endif
|
||||
};
|
||||
|
||||
@@ -151,7 +153,7 @@ struct iterator_category_with_traversal
|
||||
template <class Traversal, class ValueParam, class Reference>
|
||||
struct facade_iterator_category_impl
|
||||
{
|
||||
static_assert(!is_iterator_category<Traversal>::value, "");
|
||||
static_assert(!is_iterator_category<Traversal>::value, "Traversal must not be an STL iterator category.");
|
||||
|
||||
typedef typename iterator_facade_default_category<
|
||||
Traversal,ValueParam,Reference
|
||||
|
||||
@@ -69,7 +69,7 @@ namespace iterators {
|
||||
#if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
|
||||
// Don't allow use of this constructor if Predicate is a
|
||||
// function pointer type, since it will be 0.
|
||||
static_assert(std::is_class<Predicate>::value, "");
|
||||
static_assert(std::is_class<Predicate>::value, "Predicate must be a class.");
|
||||
#endif
|
||||
satisfy_predicate();
|
||||
}
|
||||
|
||||
@@ -155,13 +155,6 @@ namespace iterators {
|
||||
>
|
||||
type;
|
||||
};
|
||||
|
||||
// workaround for aC++ CR JAGaf33512
|
||||
template <class Tr1, class Tr2>
|
||||
inline void iterator_adaptor_assert_traversal ()
|
||||
{
|
||||
static_assert(std::is_convertible<Tr1, Tr2>::value, "");
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
@@ -260,12 +253,12 @@ namespace iterators {
|
||||
typename super_t::iterator_category
|
||||
>::type my_traversal;
|
||||
|
||||
# define BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL(cat) \
|
||||
boost::iterators::detail::iterator_adaptor_assert_traversal<my_traversal, cat>();
|
||||
|
||||
void advance(typename super_t::difference_type n)
|
||||
{
|
||||
BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL(random_access_traversal_tag)
|
||||
static_assert(
|
||||
std::is_convertible<my_traversal, random_access_traversal_tag>::value,
|
||||
"Super iterator must have a random_access_traversal_tag."
|
||||
);
|
||||
m_iterator += n;
|
||||
}
|
||||
|
||||
@@ -273,7 +266,10 @@ namespace iterators {
|
||||
|
||||
void decrement()
|
||||
{
|
||||
BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL(bidirectional_traversal_tag)
|
||||
static_assert(
|
||||
std::is_convertible<my_traversal, bidirectional_traversal_tag>::value,
|
||||
"Super iterator must have a bidirectional_traversal_tag."
|
||||
);
|
||||
--m_iterator;
|
||||
}
|
||||
|
||||
@@ -283,7 +279,10 @@ namespace iterators {
|
||||
typename super_t::difference_type distance_to(
|
||||
iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const
|
||||
{
|
||||
BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL(random_access_traversal_tag)
|
||||
static_assert(
|
||||
std::is_convertible<my_traversal, random_access_traversal_tag>::value,
|
||||
"Super iterator must have a random_access_traversal_tag."
|
||||
);
|
||||
// Maybe readd with same_distance
|
||||
// BOOST_STATIC_ASSERT(
|
||||
// (detail::same_category_and_difference<Derived,OtherDerived>::value)
|
||||
@@ -291,8 +290,6 @@ namespace iterators {
|
||||
return y.base() - m_iterator;
|
||||
}
|
||||
|
||||
# undef BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL
|
||||
|
||||
private: // data members
|
||||
Base m_iterator;
|
||||
};
|
||||
|
||||
@@ -324,7 +324,7 @@ struct iterator_access_archetype_impl<
|
||||
template <class Value>
|
||||
struct archetype
|
||||
{
|
||||
static_assert(!std::is_const<Value>::value, "");
|
||||
static_assert(!std::is_const<Value>::value, "Value type must be const.");
|
||||
typedef void value_type;
|
||||
typedef void reference;
|
||||
typedef void pointer;
|
||||
@@ -375,7 +375,7 @@ struct iterator_access_archetype_impl<archetypes::writable_lvalue_iterator_t>
|
||||
Value, archetypes::readable_lvalue_iterator_t
|
||||
>
|
||||
{
|
||||
static_assert(!std::is_const<Value>::value, "");
|
||||
static_assert(!std::is_const<Value>::value, "Value type must be const.");
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -104,7 +104,7 @@ namespace detail
|
||||
template <class Cat>
|
||||
struct iterator_category_to_traversal
|
||||
: mpl::eval_if< // if already convertible to a traversal tag, we're done.
|
||||
std::is_convertible<Cat,incrementable_traversal_tag>
|
||||
std::is_convertible<Cat, incrementable_traversal_tag>
|
||||
, mpl::identity<Cat>
|
||||
, boost::iterators::detail::old_category_to_traversal<Cat>
|
||||
>
|
||||
|
||||
@@ -136,8 +136,8 @@ namespace boost_concepts
|
||||
{
|
||||
typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
|
||||
|
||||
static_assert(std::is_integral<difference_type>::value, "");
|
||||
static_assert(std::numeric_limits<difference_type>::is_signed, "");
|
||||
static_assert(std::is_integral<difference_type>::value, "difference_type must be integral.");
|
||||
static_assert(std::numeric_limits<difference_type>::is_signed, "difference_type must be signed.");
|
||||
|
||||
BOOST_CONCEPT_ASSERT((
|
||||
boost::Convertible<
|
||||
|
||||
@@ -907,7 +907,10 @@ namespace iterators {
|
||||
BOOST_ITERATOR_FACADE_INTEROP_HEAD(inline, op, result_type) \
|
||||
{ \
|
||||
/* For those compilers that do not support enable_if */ \
|
||||
static_assert(is_interoperable<Derived1, Derived2>::value, ""); \
|
||||
static_assert( \
|
||||
is_interoperable<Derived1, Derived2>::value, \
|
||||
"Derived1 & Derived2 types must be interoperable." \
|
||||
); \
|
||||
return_prefix iterator_core_access::base_op( \
|
||||
*static_cast<Derived1 const*>(&lhs) \
|
||||
, *static_cast<Derived2 const*>(&rhs) \
|
||||
@@ -934,10 +937,10 @@ namespace iterators {
|
||||
{ \
|
||||
/* For those compilers that do not support enable_if */ \
|
||||
static_assert( \
|
||||
is_interoperable< Derived1, Derived2 >::value && \
|
||||
boost::iterators::detail::is_traversal_at_least< typename iterator_category< Derived1 >::type, random_access_traversal_tag >::value && \
|
||||
boost::iterators::detail::is_traversal_at_least< typename iterator_category< Derived2 >::type, random_access_traversal_tag >::value, \
|
||||
"" \
|
||||
is_interoperable<Derived1, Derived2>::value && \
|
||||
boost::iterators::detail::is_traversal_at_least<typename iterator_category<Derived1>::type, random_access_traversal_tag>::value && \
|
||||
boost::iterators::detail::is_traversal_at_least<typename iterator_category<Derived2>::type, random_access_traversal_tag>::value, \
|
||||
"Derived1 & Derived2 types must be interoperable and must both have random_access_traversal_tag." \
|
||||
); \
|
||||
return_prefix iterator_core_access::base_op( \
|
||||
*static_cast<Derived1 const*>(&lhs) \
|
||||
|
||||
@@ -42,7 +42,10 @@ struct minimum_category_impl<true,true>
|
||||
{
|
||||
template <class T1, class T2> struct apply
|
||||
{
|
||||
static_assert(std::is_same<T1,T2>::value, "");
|
||||
static_assert(
|
||||
std::is_same<T1,T2>::value,
|
||||
"Types must be same when they are convertible to each other."
|
||||
);
|
||||
typedef T1 type;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -88,7 +88,7 @@ void readable_iterator_test(const Iterator i1, T v)
|
||||
|
||||
// I think we don't really need this as it checks the same things as
|
||||
// the above code.
|
||||
static_assert(is_readable_iterator<Iterator>::value, "");
|
||||
static_assert(is_readable_iterator<Iterator>::value, "Iterator must be readable.");
|
||||
# endif
|
||||
}
|
||||
|
||||
@@ -123,12 +123,15 @@ void constant_lvalue_iterator_test(Iterator i, T v1)
|
||||
Iterator i2(i);
|
||||
typedef typename std::iterator_traits<Iterator>::value_type value_type;
|
||||
typedef typename std::iterator_traits<Iterator>::reference reference;
|
||||
static_assert(std::is_same<const value_type&, reference>::value, "");
|
||||
static_assert(
|
||||
std::is_same<const value_type&, reference>::value,
|
||||
"reference type must be the same as const value_type& for constant lvalue iterator."
|
||||
);
|
||||
const T& v2 = *i2;
|
||||
BOOST_TEST(v1 == v2);
|
||||
# ifndef BOOST_NO_LVALUE_RETURN_DETECTION
|
||||
static_assert(is_lvalue_iterator<Iterator>::value, "");
|
||||
static_assert(!is_non_const_lvalue_iterator<Iterator>::value, "");
|
||||
static_assert(is_lvalue_iterator<Iterator>::value, "Iterator must be lvalue.");
|
||||
static_assert(!is_non_const_lvalue_iterator<Iterator>::value, "Iterator must be const.");
|
||||
# endif
|
||||
}
|
||||
|
||||
@@ -138,7 +141,10 @@ void non_const_lvalue_iterator_test(Iterator i, T v1, T v2)
|
||||
Iterator i2(i);
|
||||
typedef typename std::iterator_traits<Iterator>::value_type value_type;
|
||||
typedef typename std::iterator_traits<Iterator>::reference reference;
|
||||
static_assert(std::is_same<value_type&, reference>::value, "");
|
||||
static_assert(
|
||||
std::is_same<value_type&, reference>::value,
|
||||
"reference type must be the same as value_type& for non-constant lvalue iterator."
|
||||
);
|
||||
T& v3 = *i2;
|
||||
BOOST_TEST(v1 == v3);
|
||||
|
||||
@@ -149,8 +155,8 @@ void non_const_lvalue_iterator_test(Iterator i, T v1, T v2)
|
||||
T& v4 = *i2;
|
||||
BOOST_TEST(v2 == v4);
|
||||
# ifndef BOOST_NO_LVALUE_RETURN_DETECTION
|
||||
static_assert(is_lvalue_iterator<Iterator>::value, "");
|
||||
static_assert(is_non_const_lvalue_iterator<Iterator>::value, "");
|
||||
static_assert(is_lvalue_iterator<Iterator>::value, "Iterator must be lvalue.");
|
||||
static_assert(is_non_const_lvalue_iterator<Iterator>::value, "Iterator must be non-const.");
|
||||
# endif
|
||||
}
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ namespace iterators {
|
||||
#if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
|
||||
// don't provide this constructor if UnaryFunc is a
|
||||
// function pointer type, since it will be 0. Too dangerous.
|
||||
static_assert(std::is_class<UnaryFunc>::value, "");
|
||||
static_assert(std::is_class<UnaryFunc>::value, "Transform function must not be a function pointer.");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -140,9 +140,11 @@ template <bool is_pointer> struct lvalue_test
|
||||
typedef typename Iterator::reference reference;
|
||||
typedef typename Iterator::value_type value_type;
|
||||
# endif
|
||||
static_assert(std::is_reference<reference>::value, "");
|
||||
static_assert(std::is_same<reference,value_type&>::value
|
||||
|| std::is_same<reference,const value_type&>::value, "");
|
||||
static_assert(std::is_reference<reference>::value, "reference must be a reference type.");
|
||||
static_assert(
|
||||
std::is_same<reference, value_type&>::value || std::is_same<reference, const value_type&>::value,
|
||||
"reference must either be a reference to value_type or constant reference to value_type."
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user