iterator/test/pointee.cpp
Dave Abrahams 6c62f31f0a Updated pointee and indirect_reference so that pointee represents the
immutability of the pointed-to type via const qualification.  The
pointee of a proxy-based iterator will be const qualified unless a
mutable reference to the value_type can be bound to the returned
proxy.

Added a test for pointee

Fixed iterator_facade so operator[] result type computation didn't
cause a problem with abstract types.

Updated iterator_facade operator[] docs for accuracy.

Allowed Borland to simply fail the indirect_iterator_member_types test
because of its lame const-dropping, instead of trying to work around
it.


[SVN r21579]
2004-01-11 00:03:09 +00:00

73 lines
2.4 KiB
C++
Executable File

// Copyright David Abrahams 2004. Use, modification and distribution is
// subject to the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/pointee.hpp>
#include <boost/type_traits/add_const.hpp>
#include "static_assert_same.hpp"
#include <memory>
#include <list>
template <class T, class Ref>
struct proxy_ptr
{
typedef T element_type;
struct proxy
{
operator Ref() const;
};
proxy operator*() const;
};
template <class T>
struct proxy_ref_ptr : proxy_ptr<T,T&>
{
};
template <class T>
struct proxy_value_ptr : proxy_ptr<T,T>
{
typedef typename boost::add_const<T>::type element_type;
};
struct X {
template <class T> X(T const&);
template <class T> operator T&() const;
};
BOOST_TT_BROKEN_COMPILER_SPEC(X)
int main()
{
STATIC_ASSERT_SAME(boost::pointee<proxy_ref_ptr<int> >::type, int);
STATIC_ASSERT_SAME(boost::pointee<proxy_ref_ptr<X> >::type, X);
STATIC_ASSERT_SAME(boost::pointee<proxy_ref_ptr<int const> >::type, int const);
STATIC_ASSERT_SAME(boost::pointee<proxy_ref_ptr<X const> >::type, X const);
STATIC_ASSERT_SAME(boost::pointee<proxy_value_ptr<int> >::type, int const);
STATIC_ASSERT_SAME(boost::pointee<proxy_value_ptr<X> >::type, X const);
STATIC_ASSERT_SAME(boost::pointee<proxy_value_ptr<int const> >::type, int const);
STATIC_ASSERT_SAME(boost::pointee<proxy_value_ptr<X const> >::type, X const);
STATIC_ASSERT_SAME(boost::pointee<int*>::type, int);
STATIC_ASSERT_SAME(boost::pointee<int const*>::type, int const);
STATIC_ASSERT_SAME(boost::pointee<X*>::type, X);
STATIC_ASSERT_SAME(boost::pointee<X const*>::type, X const);
STATIC_ASSERT_SAME(boost::pointee<std::auto_ptr<int> >::type, int);
STATIC_ASSERT_SAME(boost::pointee<std::auto_ptr<X> >::type, X);
STATIC_ASSERT_SAME(boost::pointee<std::auto_ptr<int const> >::type, int const);
STATIC_ASSERT_SAME(boost::pointee<std::auto_ptr<X const> >::type, X const);
STATIC_ASSERT_SAME(boost::pointee<std::list<int>::iterator >::type, int);
STATIC_ASSERT_SAME(boost::pointee<std::list<X>::iterator >::type, X);
STATIC_ASSERT_SAME(boost::pointee<std::list<int>::const_iterator >::type, int const);
STATIC_ASSERT_SAME(boost::pointee<std::list<X>::const_iterator >::type, X const);
return 0;
}