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 
26 struct A {};
27 
28 template <class T>
29 void
test2()30 test2()
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 
40 template <class T>
41 void
test3()42 test3()
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 
52 template <class T>
53 void
test4()54 test4()
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 
64 template <class T>
65 void
test5()66 test5()
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 
main()76 int main()
77 {
78     test2<A>();
79     test3<A>();
80     test4<A>();
81     test5<A>();
82 }
83