149 lines
4.1 KiB
C++
149 lines
4.1 KiB
C++
//
|
|
// Test for boost/detail/iterator.hpp
|
|
//
|
|
// Copyright 2014 Peter Dimov
|
|
//
|
|
// 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/detail/iterator.hpp>
|
|
#include <boost/core/is_same.hpp>
|
|
#include <boost/core/lightweight_test_trait.hpp>
|
|
#include <cstddef>
|
|
#include <list>
|
|
|
|
/*
|
|
|
|
namespace boost {
|
|
namespace detail {
|
|
|
|
template <class Iterator> struct iterator_traits: std::iterator_traits<Iterator>
|
|
{
|
|
};
|
|
|
|
using std::distance;
|
|
|
|
} // namespace detail
|
|
} // namespace boost
|
|
|
|
*/
|
|
|
|
// struct C {} doesn't wotk with libc++.
|
|
typedef std::forward_iterator_tag C;
|
|
|
|
struct T
|
|
{
|
|
};
|
|
|
|
struct D
|
|
{
|
|
};
|
|
|
|
struct P
|
|
{
|
|
};
|
|
|
|
struct R
|
|
{
|
|
};
|
|
|
|
template< class Category, class T, class Distance = std::ptrdiff_t, class Pointer = T*, class Reference = T& >
|
|
struct iterator
|
|
{
|
|
typedef T value_type;
|
|
typedef Distance difference_type;
|
|
typedef Pointer pointer;
|
|
typedef Reference reference;
|
|
typedef Category iterator_category;
|
|
};
|
|
|
|
int main()
|
|
{
|
|
using boost::core::is_same;
|
|
|
|
/*
|
|
template<class Iterator> struct iterator_traits {
|
|
typedef typename Iterator::difference_type difference_type;
|
|
typedef typename Iterator::value_type value_type;
|
|
typedef typename Iterator::pointer pointer;
|
|
typedef typename Iterator::reference reference;
|
|
typedef typename Iterator::iterator_category iterator_category;
|
|
};
|
|
*/
|
|
{
|
|
typedef ::iterator<C,T,D,P,R> It;
|
|
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::iterator_category,C>));
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::value_type,T>));
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::difference_type,D>));
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::pointer,P>));
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::reference,R>));
|
|
}
|
|
/*
|
|
template<class T> struct iterator_traits<T*> {
|
|
typedef ptrdiff_t difference_type;
|
|
typedef T value_type;
|
|
typedef T* pointer;
|
|
typedef T& reference;
|
|
typedef random_access_iterator_tag iterator_category;
|
|
};
|
|
*/
|
|
{
|
|
typedef T* It;
|
|
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::iterator_category,std::random_access_iterator_tag>));
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::value_type,T>));
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::difference_type,std::ptrdiff_t>));
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::pointer,T*>));
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::reference,T&>));
|
|
}
|
|
|
|
/*
|
|
template<class T> struct iterator_traits<const T*> {
|
|
typedef ptrdiff_t difference_type;
|
|
typedef T value_type;
|
|
typedef const T* pointer;
|
|
typedef const T& reference;
|
|
typedef random_access_iterator_tag iterator_category;
|
|
};
|
|
*/
|
|
{
|
|
typedef T const* It;
|
|
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::iterator_category,std::random_access_iterator_tag>));
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::value_type,T>));
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::difference_type,std::ptrdiff_t>));
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::pointer,T const*>));
|
|
BOOST_TEST_TRAIT_TRUE((is_same<boost::detail::iterator_traits<It>::reference,T const&>));
|
|
}
|
|
/*
|
|
template<class InputIterator>
|
|
typename iterator_traits<InputIterator>::difference_type
|
|
distance( InputIterator first, InputIterator last );
|
|
*/
|
|
{
|
|
int const N = 5;
|
|
T x[ N ] = {};
|
|
|
|
BOOST_TEST_EQ( boost::detail::distance( x, x + N ), N );
|
|
}
|
|
|
|
{
|
|
int const N = 5;
|
|
T const x[ N ] = {};
|
|
|
|
BOOST_TEST_EQ( boost::detail::distance( x, x + N ), N );
|
|
}
|
|
|
|
{
|
|
int const N = 5;
|
|
std::list<T> x( N );
|
|
|
|
BOOST_TEST_EQ( boost::detail::distance( x.begin(), x.end() ), x.size() );
|
|
}
|
|
|
|
return boost::report_errors();
|
|
}
|