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 // <vector> 11 12 // template <class... Args> iterator emplace(const_iterator pos, Args&&... args); 13 14 #if _LIBCPP_DEBUG >= 1 15 #define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0)) 16 #endif 17 18 #include <vector> 19 #include <cassert> 20 #include "../../../stack_allocator.h" 21 #include "min_allocator.h" 22 #include "asan_testing.h" 23 24 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 25 26 class A 27 { 28 int i_; 29 double d_; 30 31 A(const A&); 32 A& operator=(const A&); 33 public: 34 A(int i, double d) 35 : i_(i), d_(d) {} 36 37 A(A&& a) 38 : i_(a.i_), 39 d_(a.d_) 40 { 41 a.i_ = 0; 42 a.d_ = 0; 43 } 44 45 A& operator=(A&& a) 46 { 47 i_ = a.i_; 48 d_ = a.d_; 49 a.i_ = 0; 50 a.d_ = 0; 51 return *this; 52 } 53 54 int geti() const {return i_;} 55 double getd() const {return d_;} 56 }; 57 58 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 59 60 int main() 61 { 62 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 63 { 64 std::vector<A> c; 65 std::vector<A>::iterator i = c.emplace(c.cbegin(), 2, 3.5); 66 assert(i == c.begin()); 67 assert(c.size() == 1); 68 assert(c.front().geti() == 2); 69 assert(c.front().getd() == 3.5); 70 assert(is_contiguous_container_asan_correct(c)); 71 i = c.emplace(c.cend(), 3, 4.5); 72 assert(i == c.end()-1); 73 assert(c.size() == 2); 74 assert(c.front().geti() == 2); 75 assert(c.front().getd() == 3.5); 76 assert(c.back().geti() == 3); 77 assert(c.back().getd() == 4.5); 78 assert(is_contiguous_container_asan_correct(c)); 79 i = c.emplace(c.cbegin()+1, 4, 6.5); 80 assert(i == c.begin()+1); 81 assert(c.size() == 3); 82 assert(c.front().geti() == 2); 83 assert(c.front().getd() == 3.5); 84 assert(c[1].geti() == 4); 85 assert(c[1].getd() == 6.5); 86 assert(c.back().geti() == 3); 87 assert(c.back().getd() == 4.5); 88 assert(is_contiguous_container_asan_correct(c)); 89 } 90 { 91 std::vector<A, stack_allocator<A, 7> > c; 92 std::vector<A, stack_allocator<A, 7> >::iterator i = c.emplace(c.cbegin(), 2, 3.5); 93 assert(i == c.begin()); 94 assert(c.size() == 1); 95 assert(c.front().geti() == 2); 96 assert(c.front().getd() == 3.5); 97 assert(is_contiguous_container_asan_correct(c)); 98 i = c.emplace(c.cend(), 3, 4.5); 99 assert(i == c.end()-1); 100 assert(c.size() == 2); 101 assert(c.front().geti() == 2); 102 assert(c.front().getd() == 3.5); 103 assert(c.back().geti() == 3); 104 assert(c.back().getd() == 4.5); 105 assert(is_contiguous_container_asan_correct(c)); 106 i = c.emplace(c.cbegin()+1, 4, 6.5); 107 assert(i == c.begin()+1); 108 assert(c.size() == 3); 109 assert(c.front().geti() == 2); 110 assert(c.front().getd() == 3.5); 111 assert(c[1].geti() == 4); 112 assert(c[1].getd() == 6.5); 113 assert(c.back().geti() == 3); 114 assert(c.back().getd() == 4.5); 115 assert(is_contiguous_container_asan_correct(c)); 116 } 117 #if _LIBCPP_DEBUG >= 1 118 { 119 std::vector<A> c1; 120 std::vector<A> c2; 121 std::vector<A>::iterator i = c1.emplace(c2.cbegin(), 2, 3.5); 122 assert(false); 123 } 124 #endif 125 #if __cplusplus >= 201103L 126 { 127 std::vector<A, min_allocator<A>> c; 128 std::vector<A, min_allocator<A>>::iterator i = c.emplace(c.cbegin(), 2, 3.5); 129 assert(i == c.begin()); 130 assert(c.size() == 1); 131 assert(c.front().geti() == 2); 132 assert(c.front().getd() == 3.5); 133 i = c.emplace(c.cend(), 3, 4.5); 134 assert(i == c.end()-1); 135 assert(c.size() == 2); 136 assert(c.front().geti() == 2); 137 assert(c.front().getd() == 3.5); 138 assert(c.back().geti() == 3); 139 assert(c.back().getd() == 4.5); 140 i = c.emplace(c.cbegin()+1, 4, 6.5); 141 assert(i == c.begin()+1); 142 assert(c.size() == 3); 143 assert(c.front().geti() == 2); 144 assert(c.front().getd() == 3.5); 145 assert(c[1].geti() == 4); 146 assert(c[1].getd() == 6.5); 147 assert(c.back().geti() == 3); 148 assert(c.back().getd() == 4.5); 149 } 150 #if _LIBCPP_DEBUG >= 1 151 { 152 std::vector<A, min_allocator<A>> c1; 153 std::vector<A, min_allocator<A>> c2; 154 std::vector<A, min_allocator<A>>::iterator i = c1.emplace(c2.cbegin(), 2, 3.5); 155 assert(false); 156 } 157 #endif 158 #endif 159 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 160 } 161