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