upper_bound.pass.cpp revision 4a0a98166c0ca6117c74592eaeb12833c9913b49
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//       iterator upper_bound(const key_type& k);
15// const_iterator upper_bound(const key_type& k) const;
16
17#include <set>
18#include <cassert>
19
20#include "../../min_allocator.h"
21#include "private_constructor.hpp"
22
23int main()
24{
25    {
26    typedef int V;
27    typedef std::multiset<int> M;
28    {
29        typedef M::iterator R;
30        V ar[] =
31        {
32            5,
33            5,
34            5,
35            7,
36            7,
37            7,
38            9,
39            9,
40            9
41        };
42        M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
43        R r = m.upper_bound(4);
44        assert(r == next(m.begin(), 0));
45        r = m.upper_bound(5);
46        assert(r == next(m.begin(), 3));
47        r = m.upper_bound(6);
48        assert(r == next(m.begin(), 3));
49        r = m.upper_bound(7);
50        assert(r == next(m.begin(), 6));
51        r = m.upper_bound(8);
52        assert(r == next(m.begin(), 6));
53        r = m.upper_bound(9);
54        assert(r == next(m.begin(), 9));
55        r = m.upper_bound(11);
56        assert(r == next(m.begin(), 9));
57    }
58    {
59        typedef M::const_iterator R;
60        V ar[] =
61        {
62            5,
63            5,
64            5,
65            7,
66            7,
67            7,
68            9,
69            9,
70            9
71        };
72        const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
73        R r = m.upper_bound(4);
74        assert(r == next(m.begin(), 0));
75        r = m.upper_bound(5);
76        assert(r == next(m.begin(), 3));
77        r = m.upper_bound(6);
78        assert(r == next(m.begin(), 3));
79        r = m.upper_bound(7);
80        assert(r == next(m.begin(), 6));
81        r = m.upper_bound(8);
82        assert(r == next(m.begin(), 6));
83        r = m.upper_bound(9);
84        assert(r == next(m.begin(), 9));
85        r = m.upper_bound(11);
86        assert(r == next(m.begin(), 9));
87    }
88    }
89#if __cplusplus >= 201103L
90    {
91    typedef int V;
92    typedef std::multiset<int, std::less<int>, min_allocator<int>> M;
93    {
94        typedef M::iterator R;
95        V ar[] =
96        {
97            5,
98            5,
99            5,
100            7,
101            7,
102            7,
103            9,
104            9,
105            9
106        };
107        M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
108        R r = m.upper_bound(4);
109        assert(r == next(m.begin(), 0));
110        r = m.upper_bound(5);
111        assert(r == next(m.begin(), 3));
112        r = m.upper_bound(6);
113        assert(r == next(m.begin(), 3));
114        r = m.upper_bound(7);
115        assert(r == next(m.begin(), 6));
116        r = m.upper_bound(8);
117        assert(r == next(m.begin(), 6));
118        r = m.upper_bound(9);
119        assert(r == next(m.begin(), 9));
120        r = m.upper_bound(11);
121        assert(r == next(m.begin(), 9));
122    }
123    {
124        typedef M::const_iterator R;
125        V ar[] =
126        {
127            5,
128            5,
129            5,
130            7,
131            7,
132            7,
133            9,
134            9,
135            9
136        };
137        const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
138        R r = m.upper_bound(4);
139        assert(r == next(m.begin(), 0));
140        r = m.upper_bound(5);
141        assert(r == next(m.begin(), 3));
142        r = m.upper_bound(6);
143        assert(r == next(m.begin(), 3));
144        r = m.upper_bound(7);
145        assert(r == next(m.begin(), 6));
146        r = m.upper_bound(8);
147        assert(r == next(m.begin(), 6));
148        r = m.upper_bound(9);
149        assert(r == next(m.begin(), 9));
150        r = m.upper_bound(11);
151        assert(r == next(m.begin(), 9));
152    }
153    }
154#endif
155#if _LIBCPP_STD_VER > 11
156    {
157    typedef int V;
158    typedef std::multiset<V, std::less<>> M;
159
160    typedef M::iterator R;
161    V ar[] =
162    {
163        5,
164        5,
165        5,
166        7,
167        7,
168        7,
169        9,
170        9,
171        9
172    };
173    M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
174    R r = m.upper_bound(4);
175    assert(r == next(m.begin(), 0));
176    r = m.upper_bound(5);
177    assert(r == next(m.begin(), 3));
178    r = m.upper_bound(6);
179    assert(r == next(m.begin(), 3));
180    r = m.upper_bound(7);
181    assert(r == next(m.begin(), 6));
182    r = m.upper_bound(8);
183    assert(r == next(m.begin(), 6));
184    r = m.upper_bound(9);
185    assert(r == next(m.begin(), 9));
186    r = m.upper_bound(11);
187    assert(r == next(m.begin(), 9));
188    }
189
190    {
191    typedef PrivateConstructor V;
192    typedef std::multiset<V, std::less<>> M;
193
194    typedef M::iterator R;
195    M m;
196    m.insert ( V::make ( 5 ));
197    m.insert ( V::make ( 5 ));
198    m.insert ( V::make ( 5 ));
199    m.insert ( V::make ( 7 ));
200    m.insert ( V::make ( 7 ));
201    m.insert ( V::make ( 7 ));
202    m.insert ( V::make ( 9 ));
203    m.insert ( V::make ( 9 ));
204    m.insert ( V::make ( 9 ));
205
206    R r = m.upper_bound(4);
207    assert(r == next(m.begin(), 0));
208    r = m.upper_bound(5);
209    assert(r == next(m.begin(), 3));
210    r = m.upper_bound(6);
211    assert(r == next(m.begin(), 3));
212    r = m.upper_bound(7);
213    assert(r == next(m.begin(), 6));
214    r = m.upper_bound(8);
215    assert(r == next(m.begin(), 6));
216    r = m.upper_bound(9);
217    assert(r == next(m.begin(), 9));
218    r = m.upper_bound(11);
219    assert(r == next(m.begin(), 9));
220    }
221#endif
222}
223