mirror of
https://github.com/boostorg/iterator.git
synced 2025-05-11 05:23:52 +00:00
Reverted: 2e099caceb9..21102938e8ccb I'm going to reapply some of them soon, but it's easier to revert them all first, as there are conflicts. Also the number of changes that were inserted since then, mean that there would be a huge gap between related changes.
111 lines
2.9 KiB
C++
111 lines
2.9 KiB
C++
// Copyright David Abrahams 2003.
|
|
// Distributed under 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/iterator/iterator_adaptor.hpp>
|
|
#include <boost/static_assert.hpp>
|
|
|
|
#include "static_assert_same.hpp"
|
|
|
|
#include <boost/type_traits/broken_compiler_spec.hpp>
|
|
|
|
#include <boost/iterator/detail/minimum_category.hpp>
|
|
|
|
struct X { int a; };
|
|
|
|
BOOST_TT_BROKEN_COMPILER_SPEC(X)
|
|
|
|
struct Xiter : boost::iterator_adaptor<Xiter,X*>
|
|
{
|
|
Xiter();
|
|
Xiter(X* p) : boost::iterator_adaptor<Xiter, X*>(p) {}
|
|
};
|
|
|
|
void take_xptr(X*) {}
|
|
void operator_arrow_test()
|
|
{
|
|
// check that the operator-> result is a pointer for lvalue iterators
|
|
X x;
|
|
take_xptr(Xiter(&x).operator->());
|
|
}
|
|
|
|
template <class T, class U, class Min>
|
|
struct static_assert_min_cat
|
|
: static_assert_same<
|
|
typename boost::detail::minimum_category<T,U>::type, Min
|
|
>
|
|
{};
|
|
|
|
void category_test()
|
|
{
|
|
using namespace boost;
|
|
using namespace boost::detail;
|
|
|
|
BOOST_STATIC_ASSERT((
|
|
!boost::is_convertible<
|
|
std::input_iterator_tag
|
|
, input_output_iterator_tag>::value));
|
|
|
|
BOOST_STATIC_ASSERT((
|
|
!boost::is_convertible<
|
|
std::output_iterator_tag
|
|
, input_output_iterator_tag>::value));
|
|
|
|
BOOST_STATIC_ASSERT((
|
|
boost::is_convertible<
|
|
input_output_iterator_tag
|
|
, std::input_iterator_tag>::value));
|
|
|
|
BOOST_STATIC_ASSERT((
|
|
boost::is_convertible<
|
|
input_output_iterator_tag
|
|
, std::output_iterator_tag>::value));
|
|
|
|
#if 0 // This seems wrong; we're not advertising
|
|
// input_output_iterator_tag are we?
|
|
BOOST_STATIC_ASSERT((
|
|
boost::is_convertible<
|
|
std::forward_iterator_tag
|
|
, input_output_iterator_tag>::value));
|
|
#endif
|
|
|
|
int test = static_assert_min_cat<
|
|
std::input_iterator_tag,input_output_iterator_tag, std::input_iterator_tag
|
|
>::value;
|
|
|
|
test = static_assert_min_cat<
|
|
input_output_iterator_tag,std::input_iterator_tag, std::input_iterator_tag
|
|
>::value;
|
|
|
|
#if 0
|
|
test = static_assert_min_cat<
|
|
input_output_iterator_tag,std::forward_iterator_tag, input_output_iterator_tag
|
|
>::value;
|
|
#endif
|
|
|
|
test = static_assert_min_cat<
|
|
std::input_iterator_tag,std::forward_iterator_tag, std::input_iterator_tag
|
|
>::value;
|
|
|
|
test = static_assert_min_cat<
|
|
std::input_iterator_tag,std::random_access_iterator_tag, std::input_iterator_tag
|
|
>::value;
|
|
|
|
#if 0 // This would be wrong: a random access iterator is not
|
|
// neccessarily writable, as is an output iterator.
|
|
test = static_assert_min_cat<
|
|
std::output_iterator_tag,std::random_access_iterator_tag, std::output_iterator_tag
|
|
>::value;
|
|
#endif
|
|
|
|
(void)test;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
category_test();
|
|
operator_arrow_test();
|
|
return 0;
|
|
}
|
|
|