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 map 13 14 // pair<iterator, bool> insert( value_type&& v); // C++17 and later 15 // template <class P> 16 // pair<iterator, bool> insert(P&& p); 17 18 #include <map> 19 #include <cassert> 20 21 #include "MoveOnly.h" 22 #include "min_allocator.h" 23 #include "test_macros.h" 24 25 int main() 26 { 27 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 28 { 29 typedef std::map<int, MoveOnly> M; 30 typedef std::pair<M::iterator, bool> R; 31 M m; 32 R r = m.insert(M::value_type(2, 2)); 33 assert(r.second); 34 assert(r.first == m.begin()); 35 assert(m.size() == 1); 36 assert(r.first->first == 2); 37 assert(r.first->second == 2); 38 39 r = m.insert(M::value_type(1, 1)); 40 assert(r.second); 41 assert(r.first == m.begin()); 42 assert(m.size() == 2); 43 assert(r.first->first == 1); 44 assert(r.first->second == 1); 45 46 r = m.insert(M::value_type(3, 3)); 47 assert(r.second); 48 assert(r.first == prev(m.end())); 49 assert(m.size() == 3); 50 assert(r.first->first == 3); 51 assert(r.first->second == 3); 52 53 r = m.insert(M::value_type(3, 3)); 54 assert(!r.second); 55 assert(r.first == prev(m.end())); 56 assert(m.size() == 3); 57 assert(r.first->first == 3); 58 assert(r.first->second == 3); 59 } 60 #if TEST_STD_VER >= 11 61 { 62 typedef std::map<int, MoveOnly, std::less<int>, min_allocator<std::pair<const int, MoveOnly>>> M; 63 typedef std::pair<M::iterator, bool> R; 64 M m; 65 R r = m.insert(M::value_type(2, 2)); 66 assert(r.second); 67 assert(r.first == m.begin()); 68 assert(m.size() == 1); 69 assert(r.first->first == 2); 70 assert(r.first->second == 2); 71 72 r = m.insert(M::value_type(1, 1)); 73 assert(r.second); 74 assert(r.first == m.begin()); 75 assert(m.size() == 2); 76 assert(r.first->first == 1); 77 assert(r.first->second == 1); 78 79 r = m.insert(M::value_type(3, 3)); 80 assert(r.second); 81 assert(r.first == prev(m.end())); 82 assert(m.size() == 3); 83 assert(r.first->first == 3); 84 assert(r.first->second == 3); 85 86 r = m.insert(M::value_type(3, 3)); 87 assert(!r.second); 88 assert(r.first == prev(m.end())); 89 assert(m.size() == 3); 90 assert(r.first->first == 3); 91 assert(r.first->second == 3); 92 } 93 #endif 94 #if TEST_STD_VER > 14 95 { 96 typedef std::map<int, MoveOnly> M; 97 typedef std::pair<M::iterator, bool> R; 98 M m; 99 R r = m.insert({2, MoveOnly(2)}); 100 assert(r.second); 101 assert(r.first == m.begin()); 102 assert(m.size() == 1); 103 assert(r.first->first == 2); 104 assert(r.first->second == 2); 105 106 r = m.insert({1, MoveOnly(1)}); 107 assert(r.second); 108 assert(r.first == m.begin()); 109 assert(m.size() == 2); 110 assert(r.first->first == 1); 111 assert(r.first->second == 1); 112 113 r = m.insert({3, MoveOnly(3)}); 114 assert(r.second); 115 assert(r.first == prev(m.end())); 116 assert(m.size() == 3); 117 assert(r.first->first == 3); 118 assert(r.first->second == 3); 119 120 r = m.insert({3, MoveOnly(3)}); 121 assert(!r.second); 122 assert(r.first == prev(m.end())); 123 assert(m.size() == 3); 124 assert(r.first->first == 3); 125 assert(r.first->second == 3); 126 } 127 #endif 128 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 129 } 130