1//===----------------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is dual licensed under the MIT and the University of Illinois Open 6// Source Licenses. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10// <iterator> 11 12// template<class Category, class T, class Distance = ptrdiff_t, 13// class Pointer = T*, class Reference = T&> 14// struct iterator 15// { 16// typedef T value_type; 17// typedef Distance difference_type; 18// typedef Pointer pointer; 19// typedef Reference reference; 20// typedef Category iterator_category; 21// }; 22 23#include <iterator> 24#include <type_traits> 25 26struct A {}; 27 28template <class T> 29void 30test2() 31{ 32 typedef std::iterator<std::forward_iterator_tag, T> It; 33 static_assert((std::is_same<typename It::value_type, T>::value), ""); 34 static_assert((std::is_same<typename It::difference_type, std::ptrdiff_t>::value), ""); 35 static_assert((std::is_same<typename It::pointer, T*>::value), ""); 36 static_assert((std::is_same<typename It::reference, T&>::value), ""); 37 static_assert((std::is_same<typename It::iterator_category, std::forward_iterator_tag>::value), ""); 38} 39 40template <class T> 41void 42test3() 43{ 44 typedef std::iterator<std::bidirectional_iterator_tag, T, short> It; 45 static_assert((std::is_same<typename It::value_type, T>::value), ""); 46 static_assert((std::is_same<typename It::difference_type, short>::value), ""); 47 static_assert((std::is_same<typename It::pointer, T*>::value), ""); 48 static_assert((std::is_same<typename It::reference, T&>::value), ""); 49 static_assert((std::is_same<typename It::iterator_category, std::bidirectional_iterator_tag>::value), ""); 50} 51 52template <class T> 53void 54test4() 55{ 56 typedef std::iterator<std::random_access_iterator_tag, T, int, const T*> It; 57 static_assert((std::is_same<typename It::value_type, T>::value), ""); 58 static_assert((std::is_same<typename It::difference_type, int>::value), ""); 59 static_assert((std::is_same<typename It::pointer, const T*>::value), ""); 60 static_assert((std::is_same<typename It::reference, T&>::value), ""); 61 static_assert((std::is_same<typename It::iterator_category, std::random_access_iterator_tag>::value), ""); 62} 63 64template <class T> 65void 66test5() 67{ 68 typedef std::iterator<std::input_iterator_tag, T, long, const T*, const T&> It; 69 static_assert((std::is_same<typename It::value_type, T>::value), ""); 70 static_assert((std::is_same<typename It::difference_type, long>::value), ""); 71 static_assert((std::is_same<typename It::pointer, const T*>::value), ""); 72 static_assert((std::is_same<typename It::reference, const T&>::value), ""); 73 static_assert((std::is_same<typename It::iterator_category, std::input_iterator_tag>::value), ""); 74} 75 76int main() 77{ 78 test2<A>(); 79 test3<A>(); 80 test4<A>(); 81 test5<A>(); 82} 83