insert_hint_rvalue.pass.cpp revision 7a6b7cedcb3359ad7d77e355b02ab982d9d2b25b
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// <unordered_map> 11 12// template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, 13// class Alloc = allocator<pair<const Key, T>>> 14// class unordered_map 15 16// template <class P, 17// class = typename enable_if<is_convertible<P, value_type>::value>::type> 18// iterator insert(const_iterator p, P&& x); 19 20#include <unordered_map> 21#include <cassert> 22 23#include "../../../MoveOnly.h" 24#include "../../../min_allocator.h" 25 26int main() 27{ 28 { 29 typedef std::unordered_map<double, int> C; 30 typedef C::iterator R; 31 typedef std::pair<double, short> P; 32 C c; 33 C::const_iterator e = c.end(); 34 R r = c.insert(e, P(3.5, 3)); 35 assert(c.size() == 1); 36 assert(r->first == 3.5); 37 assert(r->second == 3); 38 39 r = c.insert(e, P(3.5, 4)); 40 assert(c.size() == 1); 41 assert(r->first == 3.5); 42 assert(r->second == 3); 43 44 r = c.insert(e, P(4.5, 4)); 45 assert(c.size() == 2); 46 assert(r->first == 4.5); 47 assert(r->second == 4); 48 49 r = c.insert(e, P(5.5, 4)); 50 assert(c.size() == 3); 51 assert(r->first == 5.5); 52 assert(r->second == 4); 53 } 54#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 55 { 56 typedef std::unordered_map<MoveOnly, MoveOnly> C; 57 typedef C::iterator R; 58 typedef std::pair<MoveOnly, MoveOnly> P; 59 C c; 60 C::const_iterator e = c.end(); 61 R r = c.insert(e, P(3, 3)); 62 assert(c.size() == 1); 63 assert(r->first == 3); 64 assert(r->second == 3); 65 66 r = c.insert(e, P(3, 4)); 67 assert(c.size() == 1); 68 assert(r->first == 3); 69 assert(r->second == 3); 70 71 r = c.insert(e, P(4, 4)); 72 assert(c.size() == 2); 73 assert(r->first == 4); 74 assert(r->second == 4); 75 76 r = c.insert(e, P(5, 4)); 77 assert(c.size() == 3); 78 assert(r->first == 5); 79 assert(r->second == 4); 80 } 81#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 82#if __cplusplus >= 201103L 83 { 84 typedef std::unordered_map<double, int, std::hash<double>, std::equal_to<double>, 85 min_allocator<std::pair<const double, int>>> C; 86 typedef C::iterator R; 87 typedef std::pair<double, short> P; 88 C c; 89 C::const_iterator e = c.end(); 90 R r = c.insert(e, P(3.5, 3)); 91 assert(c.size() == 1); 92 assert(r->first == 3.5); 93 assert(r->second == 3); 94 95 r = c.insert(e, P(3.5, 4)); 96 assert(c.size() == 1); 97 assert(r->first == 3.5); 98 assert(r->second == 3); 99 100 r = c.insert(e, P(4.5, 4)); 101 assert(c.size() == 2); 102 assert(r->first == 4.5); 103 assert(r->second == 4); 104 105 r = c.insert(e, P(5.5, 4)); 106 assert(c.size() == 3); 107 assert(r->first == 5.5); 108 assert(r->second == 4); 109 } 110#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 111 { 112 typedef std::unordered_map<MoveOnly, MoveOnly, std::hash<MoveOnly>, std::equal_to<MoveOnly>, 113 min_allocator<std::pair<const MoveOnly, MoveOnly>>> C; 114 typedef C::iterator R; 115 typedef std::pair<MoveOnly, MoveOnly> P; 116 C c; 117 C::const_iterator e = c.end(); 118 R r = c.insert(e, P(3, 3)); 119 assert(c.size() == 1); 120 assert(r->first == 3); 121 assert(r->second == 3); 122 123 r = c.insert(e, P(3, 4)); 124 assert(c.size() == 1); 125 assert(r->first == 3); 126 assert(r->second == 3); 127 128 r = c.insert(e, P(4, 4)); 129 assert(c.size() == 2); 130 assert(r->first == 4); 131 assert(r->second == 4); 132 133 r = c.insert(e, P(5, 4)); 134 assert(c.size() == 3); 135 assert(r->first == 5); 136 assert(r->second == 4); 137 } 138#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 139#endif 140} 141