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 #ifndef SET_ALLOCATOR_REQUIREMENT_TEST_TEMPLATES_H 10 #define SET_ALLOCATOR_REQUIREMENT_TEST_TEMPLATES_H 11 12 // <set> 13 // <unordered_set> 14 15 // class set 16 // class unordered_set 17 18 // insert(...); 19 // emplace(...); 20 // emplace_hint(...); 21 22 23 #include <cassert> 24 25 #include "test_macros.h" 26 #include "count_new.hpp" 27 #include "container_test_types.h" 28 #include "assert_checkpoint.h" 29 30 31 template <class Container> 32 void testSetInsert() 33 { 34 typedef typename Container::value_type ValueTp; 35 ConstructController* cc = getConstructController(); 36 cc->reset(); 37 { 38 CHECKPOINT("Testing C::insert(const value_type&)"); 39 Container c; 40 const ValueTp v(42); 41 cc->expect<const ValueTp&>(); 42 assert(c.insert(v).second); 43 assert(!cc->unchecked()); 44 { 45 DisableAllocationGuard g; 46 const ValueTp v2(42); 47 assert(c.insert(v2).second == false); 48 } 49 } 50 { 51 CHECKPOINT("Testing C::insert(value_type&)"); 52 Container c; 53 ValueTp v(42); 54 cc->expect<const ValueTp&>(); 55 assert(c.insert(v).second); 56 assert(!cc->unchecked()); 57 { 58 DisableAllocationGuard g; 59 ValueTp v2(42); 60 assert(c.insert(v2).second == false); 61 } 62 } 63 { 64 CHECKPOINT("Testing C::insert(value_type&&)"); 65 Container c; 66 ValueTp v(42); 67 cc->expect<ValueTp&&>(); 68 assert(c.insert(std::move(v)).second); 69 assert(!cc->unchecked()); 70 { 71 DisableAllocationGuard g; 72 ValueTp v2(42); 73 assert(c.insert(std::move(v2)).second == false); 74 } 75 } 76 { 77 CHECKPOINT("Testing C::insert(const value_type&&)"); 78 Container c; 79 const ValueTp v(42); 80 cc->expect<const ValueTp&>(); 81 assert(c.insert(std::move(v)).second); 82 assert(!cc->unchecked()); 83 { 84 DisableAllocationGuard g; 85 const ValueTp v2(42); 86 assert(c.insert(std::move(v2)).second == false); 87 } 88 } 89 { 90 CHECKPOINT("Testing C::insert(std::initializer_list<ValueTp>)"); 91 Container c; 92 std::initializer_list<ValueTp> il = { ValueTp(1), ValueTp(2) }; 93 cc->expect<ValueTp const&>(2); 94 c.insert(il); 95 assert(!cc->unchecked()); 96 { 97 DisableAllocationGuard g; 98 c.insert(il); 99 } 100 } 101 { 102 CHECKPOINT("Testing C::insert(Iter, Iter) for *Iter = value_type const&"); 103 Container c; 104 const ValueTp ValueList[] = { ValueTp(1), ValueTp(2), ValueTp(3) }; 105 cc->expect<ValueTp const&>(3); 106 c.insert(std::begin(ValueList), std::end(ValueList)); 107 assert(!cc->unchecked()); 108 { 109 DisableAllocationGuard g; 110 c.insert(std::begin(ValueList), std::end(ValueList)); 111 } 112 } 113 { 114 CHECKPOINT("Testing C::insert(Iter, Iter) for *Iter = value_type&&"); 115 Container c; 116 ValueTp ValueList[] = { ValueTp(1), ValueTp(2) , ValueTp(3) }; 117 cc->expect<ValueTp&&>(3); 118 c.insert(std::move_iterator<ValueTp*>(std::begin(ValueList)), 119 std::move_iterator<ValueTp*>(std::end(ValueList))); 120 assert(!cc->unchecked()); 121 { 122 DisableAllocationGuard g; 123 ValueTp ValueList2[] = { ValueTp(1), ValueTp(2) , ValueTp(3) }; 124 c.insert(std::move_iterator<ValueTp*>(std::begin(ValueList2)), 125 std::move_iterator<ValueTp*>(std::end(ValueList2))); 126 } 127 } 128 { 129 CHECKPOINT("Testing C::insert(Iter, Iter) for *Iter = value_type&"); 130 Container c; 131 ValueTp ValueList[] = { ValueTp(1), ValueTp(2) , ValueTp(3) }; 132 cc->expect<ValueTp const&>(3); 133 c.insert(std::begin(ValueList), std::end(ValueList)); 134 assert(!cc->unchecked()); 135 { 136 DisableAllocationGuard g; 137 c.insert(std::begin(ValueList), std::end(ValueList)); 138 } 139 } 140 } 141 142 143 template <class Container> 144 void testSetEmplace() 145 { 146 typedef typename Container::value_type ValueTp; 147 ConstructController* cc = getConstructController(); 148 cc->reset(); 149 { 150 CHECKPOINT("Testing C::emplace(const value_type&)"); 151 Container c; 152 const ValueTp v(42); 153 cc->expect<const ValueTp&>(); 154 assert(c.emplace(v).second); 155 assert(!cc->unchecked()); 156 { 157 DisableAllocationGuard g; 158 const ValueTp v2(42); 159 assert(c.emplace(v2).second == false); 160 } 161 } 162 { 163 CHECKPOINT("Testing C::emplace(value_type&)"); 164 Container c; 165 ValueTp v(42); 166 cc->expect<ValueTp&>(); 167 assert(c.emplace(v).second); 168 assert(!cc->unchecked()); 169 { 170 DisableAllocationGuard g; 171 ValueTp v2(42); 172 assert(c.emplace(v2).second == false); 173 } 174 } 175 { 176 CHECKPOINT("Testing C::emplace(value_type&&)"); 177 Container c; 178 ValueTp v(42); 179 cc->expect<ValueTp&&>(); 180 assert(c.emplace(std::move(v)).second); 181 assert(!cc->unchecked()); 182 { 183 DisableAllocationGuard g; 184 ValueTp v2(42); 185 assert(c.emplace(std::move(v2)).second == false); 186 } 187 } 188 { 189 CHECKPOINT("Testing C::emplace(const value_type&&)"); 190 Container c; 191 const ValueTp v(42); 192 cc->expect<const ValueTp&&>(); 193 assert(c.emplace(std::move(v)).second); 194 assert(!cc->unchecked()); 195 { 196 DisableAllocationGuard g; 197 const ValueTp v2(42); 198 assert(c.emplace(std::move(v2)).second == false); 199 } 200 } 201 } 202 203 204 template <class Container> 205 void testSetEmplaceHint() 206 { 207 typedef typename Container::value_type ValueTp; 208 typedef Container C; 209 typedef typename C::iterator It; 210 ConstructController* cc = getConstructController(); 211 cc->reset(); 212 { 213 CHECKPOINT("Testing C::emplace_hint(p, const value_type&)"); 214 Container c; 215 const ValueTp v(42); 216 cc->expect<const ValueTp&>(); 217 It ret = c.emplace_hint(c.end(), v); 218 assert(ret != c.end()); 219 assert(c.size() == 1); 220 assert(!cc->unchecked()); 221 { 222 DisableAllocationGuard g; 223 const ValueTp v2(42); 224 It ret2 = c.emplace_hint(c.begin(), v2); 225 assert(&(*ret2) == &(*ret)); 226 assert(c.size() == 1); 227 } 228 } 229 { 230 CHECKPOINT("Testing C::emplace_hint(p, value_type&)"); 231 Container c; 232 ValueTp v(42); 233 cc->expect<ValueTp&>(); 234 It ret = c.emplace_hint(c.end(), v); 235 assert(ret != c.end()); 236 assert(c.size() == 1); 237 assert(!cc->unchecked()); 238 { 239 DisableAllocationGuard g; 240 ValueTp v2(42); 241 It ret2 = c.emplace_hint(c.begin(), v2); 242 assert(&(*ret2) == &(*ret)); 243 assert(c.size() == 1); 244 } 245 } 246 { 247 CHECKPOINT("Testing C::emplace_hint(p, value_type&&)"); 248 Container c; 249 ValueTp v(42); 250 cc->expect<ValueTp&&>(); 251 It ret = c.emplace_hint(c.end(), std::move(v)); 252 assert(ret != c.end()); 253 assert(c.size() == 1); 254 assert(!cc->unchecked()); 255 { 256 DisableAllocationGuard g; 257 ValueTp v2(42); 258 It ret2 = c.emplace_hint(c.begin(), std::move(v2)); 259 assert(&(*ret2) == &(*ret)); 260 assert(c.size() == 1); 261 } 262 } 263 { 264 CHECKPOINT("Testing C::emplace_hint(p, const value_type&&)"); 265 Container c; 266 const ValueTp v(42); 267 cc->expect<const ValueTp&&>(); 268 It ret = c.emplace_hint(c.end(), std::move(v)); 269 assert(ret != c.end()); 270 assert(c.size() == 1); 271 assert(!cc->unchecked()); 272 { 273 DisableAllocationGuard g; 274 const ValueTp v2(42); 275 It ret2 = c.emplace_hint(c.begin(), std::move(v2)); 276 assert(&(*ret2) == &(*ret)); 277 assert(c.size() == 1); 278 } 279 } 280 } 281 282 283 template <class Container> 284 void testMultisetInsert() 285 { 286 typedef typename Container::value_type ValueTp; 287 ConstructController* cc = getConstructController(); 288 cc->reset(); 289 { 290 CHECKPOINT("Testing C::insert(const value_type&)"); 291 Container c; 292 const ValueTp v(42); 293 cc->expect<const ValueTp&>(); 294 c.insert(v); 295 assert(!cc->unchecked()); 296 } 297 { 298 CHECKPOINT("Testing C::insert(value_type&)"); 299 Container c; 300 ValueTp v(42); 301 cc->expect<const ValueTp&>(); 302 c.insert(v); 303 assert(!cc->unchecked()); 304 } 305 { 306 CHECKPOINT("Testing C::insert(value_type&&)"); 307 Container c; 308 ValueTp v(42); 309 cc->expect<ValueTp&&>(); 310 c.insert(std::move(v)); 311 assert(!cc->unchecked()); 312 } 313 { 314 CHECKPOINT("Testing C::insert(std::initializer_list<ValueTp>)"); 315 Container c; 316 std::initializer_list<ValueTp> il = { ValueTp(1), ValueTp(2) }; 317 cc->expect<ValueTp const&>(2); 318 c.insert(il); 319 assert(!cc->unchecked()); 320 } 321 { 322 CHECKPOINT("Testing C::insert(Iter, Iter) for *Iter = value_type const&"); 323 Container c; 324 const ValueTp ValueList[] = { ValueTp(1), ValueTp(2), ValueTp(3) }; 325 cc->expect<ValueTp const&>(3); 326 c.insert(std::begin(ValueList), std::end(ValueList)); 327 assert(!cc->unchecked()); 328 } 329 { 330 CHECKPOINT("Testing C::insert(Iter, Iter) for *Iter = value_type&&"); 331 Container c; 332 ValueTp ValueList[] = { ValueTp(1), ValueTp(2) , ValueTp(3) }; 333 cc->expect<ValueTp&&>(3); 334 c.insert(std::move_iterator<ValueTp*>(std::begin(ValueList)), 335 std::move_iterator<ValueTp*>(std::end(ValueList))); 336 assert(!cc->unchecked()); 337 } 338 { 339 CHECKPOINT("Testing C::insert(Iter, Iter) for *Iter = value_type&"); 340 Container c; 341 ValueTp ValueList[] = { ValueTp(1), ValueTp(2) , ValueTp(1) }; 342 cc->expect<ValueTp&>(3); 343 c.insert(std::begin(ValueList), std::end(ValueList)); 344 assert(!cc->unchecked()); 345 } 346 } 347 348 349 template <class Container> 350 void testMultisetEmplace() 351 { 352 typedef typename Container::value_type ValueTp; 353 ConstructController* cc = getConstructController(); 354 cc->reset(); 355 { 356 CHECKPOINT("Testing C::emplace(const value_type&)"); 357 Container c; 358 const ValueTp v(42); 359 cc->expect<const ValueTp&>(); 360 c.emplace(v); 361 assert(!cc->unchecked()); 362 } 363 { 364 CHECKPOINT("Testing C::emplace(value_type&)"); 365 Container c; 366 ValueTp v(42); 367 cc->expect<ValueTp&>(); 368 c.emplace(v); 369 assert(!cc->unchecked()); 370 } 371 { 372 CHECKPOINT("Testing C::emplace(value_type&&)"); 373 Container c; 374 ValueTp v(42); 375 cc->expect<ValueTp&&>(); 376 c.emplace(std::move(v)); 377 assert(!cc->unchecked()); 378 } 379 { 380 CHECKPOINT("Testing C::emplace(const value_type&&)"); 381 Container c; 382 const ValueTp v(42); 383 cc->expect<const ValueTp&&>(); 384 c.emplace(std::move(v)); 385 assert(!cc->unchecked()); 386 } 387 } 388 389 #endif 390