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