types.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
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// insert_iterator
13
14// Test nested types and data members:
15
16// template <InsertionContainer Cont>
17// class insert_iterator {
18// protected:
19//   Cont* container;
20//   Cont::iterator iter;
21// public:
22//   typedef Cont                   container_type;
23//   typedef void                   value_type;
24//   typedef void                   difference_type;
25//   typedef insert_iterator<Cont>& reference;
26//   typedef void                   pointer;
27// };
28
29#include <iterator>
30#include <type_traits>
31#include <vector>
32
33template <class C>
34struct find_members
35    : private std::insert_iterator<C>
36{
37    explicit find_members(C& c) : std::insert_iterator<C>(c, c.begin()) {}
38    void test()
39    {
40        this->container = 0;
41        this->iter == this->iter;
42    }
43};
44
45template <class C>
46void
47test()
48{
49    typedef std::insert_iterator<C> R;
50    C c;
51    find_members<C> q(c);
52    q.test();
53    static_assert((std::is_same<typename R::container_type, C>::value), "");
54    static_assert((std::is_same<typename R::value_type, void>::value), "");
55    static_assert((std::is_same<typename R::difference_type, void>::value), "");
56    static_assert((std::is_same<typename R::reference, R&>::value), "");
57    static_assert((std::is_same<typename R::pointer, void>::value), "");
58    static_assert((std::is_same<typename R::iterator_category, std::output_iterator_tag>::value), "");
59}
60
61int main()
62{
63    test<std::vector<int> >();
64}
65