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