Handle non-lvalue iterators properly

[SVN r20585]
This commit is contained in:
Dave Abrahams
2003-11-02 05:37:38 +00:00
parent 187c393d0c
commit d562044910

View File

@ -173,6 +173,13 @@ BOOST_MPL_HAS_XXX_TRAIT_DEF(iterator_category)
template <class T> template <class T>
type_traits::yes_type is_mutable_iterator_helper(T const*, BOOST_DEDUCED_TYPENAME T::value_type*); type_traits::yes_type is_mutable_iterator_helper(T const*, BOOST_DEDUCED_TYPENAME T::value_type*);
// Since you can't take the address of an rvalue, the guts of
// is_mutable_iterator_impl will fail if we use &*t directly. This
// makes sure we can still work with non-lvalue iterators.
template <class T> T* mutable_iterator_lvalue_helper(T& x);
int mutable_iterator_lvalue_helper(...);
// This one detects output iterators such as ostream_iterator which // This one detects output iterators such as ostream_iterator which
// return references to themselves. // return references to themselves.
template <class T> template <class T>
@ -185,10 +192,14 @@ struct is_mutable_iterator_impl
{ {
static T t; static T t;
BOOST_STATIC_CONSTANT(bool, value = sizeof( BOOST_STATIC_CONSTANT(
detail::is_mutable_iterator_helper((T*)0, &*t)) bool, value = sizeof(
== sizeof(type_traits::yes_type) detail::is_mutable_iterator_helper(
); (T*)0
, mutable_iterator_lvalue_helper(*t) // like &*t
))
== sizeof(type_traits::yes_type)
);
}; };
BOOST_TT_AUX_BOOL_TRAIT_DEF1( BOOST_TT_AUX_BOOL_TRAIT_DEF1(