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