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// <map>
11
12// class map
13
14// map(const map& m);
15
16#include <map>
17#include <cassert>
18
19#include "../../../test_compare.h"
20#include "test_allocator.h"
21#include "min_allocator.h"
22
23int main()
24{
25    {
26        typedef std::pair<const int, double> V;
27        V ar[] =
28        {
29            V(1, 1),
30            V(1, 1.5),
31            V(1, 2),
32            V(2, 1),
33            V(2, 1.5),
34            V(2, 2),
35            V(3, 1),
36            V(3, 1.5),
37            V(3, 2),
38        };
39        typedef test_compare<std::less<int> > C;
40        typedef test_allocator<V> A;
41        std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(7));
42        std::map<int, double, C, A> m = mo;
43        assert(m.get_allocator() == A(7));
44        assert(m.key_comp() == C(5));
45        assert(m.size() == 3);
46        assert(distance(m.begin(), m.end()) == 3);
47        assert(*m.begin() == V(1, 1));
48        assert(*next(m.begin()) == V(2, 1));
49        assert(*next(m.begin(), 2) == V(3, 1));
50
51        assert(mo.get_allocator() == A(7));
52        assert(mo.key_comp() == C(5));
53        assert(mo.size() == 3);
54        assert(distance(mo.begin(), mo.end()) == 3);
55        assert(*mo.begin() == V(1, 1));
56        assert(*next(mo.begin()) == V(2, 1));
57        assert(*next(mo.begin(), 2) == V(3, 1));
58    }
59#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE
60    {
61        typedef std::pair<const int, double> V;
62        V ar[] =
63        {
64            V(1, 1),
65            V(1, 1.5),
66            V(1, 2),
67            V(2, 1),
68            V(2, 1.5),
69            V(2, 2),
70            V(3, 1),
71            V(3, 1.5),
72            V(3, 2),
73        };
74        typedef test_compare<std::less<int> > C;
75        typedef other_allocator<V> A;
76        std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(7));
77        std::map<int, double, C, A> m = mo;
78        assert(m.get_allocator() == A(-2));
79        assert(m.key_comp() == C(5));
80        assert(m.size() == 3);
81        assert(distance(m.begin(), m.end()) == 3);
82        assert(*m.begin() == V(1, 1));
83        assert(*next(m.begin()) == V(2, 1));
84        assert(*next(m.begin(), 2) == V(3, 1));
85
86        assert(mo.get_allocator() == A(7));
87        assert(mo.key_comp() == C(5));
88        assert(mo.size() == 3);
89        assert(distance(mo.begin(), mo.end()) == 3);
90        assert(*mo.begin() == V(1, 1));
91        assert(*next(mo.begin()) == V(2, 1));
92        assert(*next(mo.begin(), 2) == V(3, 1));
93    }
94#endif  // _LIBCPP_HAS_NO_ADVANCED_SFINAE
95#if __cplusplus >= 201103L
96    {
97        typedef std::pair<const int, double> V;
98        V ar[] =
99        {
100            V(1, 1),
101            V(1, 1.5),
102            V(1, 2),
103            V(2, 1),
104            V(2, 1.5),
105            V(2, 2),
106            V(3, 1),
107            V(3, 1.5),
108            V(3, 2),
109        };
110        typedef test_compare<std::less<int> > C;
111        typedef min_allocator<V> A;
112        std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A());
113        std::map<int, double, C, A> m = mo;
114        assert(m.get_allocator() == A());
115        assert(m.key_comp() == C(5));
116        assert(m.size() == 3);
117        assert(distance(m.begin(), m.end()) == 3);
118        assert(*m.begin() == V(1, 1));
119        assert(*next(m.begin()) == V(2, 1));
120        assert(*next(m.begin(), 2) == V(3, 1));
121
122        assert(mo.get_allocator() == A());
123        assert(mo.key_comp() == C(5));
124        assert(mo.size() == 3);
125        assert(distance(mo.begin(), mo.end()) == 3);
126        assert(*mo.begin() == V(1, 1));
127        assert(*next(mo.begin()) == V(2, 1));
128        assert(*next(mo.begin(), 2) == V(3, 1));
129    }
130#endif
131}
132