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> void emplace_back(Args&&... args);
13 
14 #include <vector>
15 #include <cassert>
16 #include "../../../stack_allocator.h"
17 #include "../../../min_allocator.h"
18 
19 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
20 
21 class A
22 {
23     int i_;
24     double d_;
25 
26     A(const A&);
27     A& operator=(const A&);
28 public:
29     A(int i, double d)
30         : i_(i), d_(d) {}
31 
32     A(A&& a)
33         : i_(a.i_),
34           d_(a.d_)
35     {
36         a.i_ = 0;
37         a.d_ = 0;
38     }
39 
40     A& operator=(A&& a)
41     {
42         i_ = a.i_;
43         d_ = a.d_;
44         a.i_ = 0;
45         a.d_ = 0;
46         return *this;
47     }
48 
49     int geti() const {return i_;}
50     double getd() const {return d_;}
51 };
52 
53 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
54 
55 int main()
56 {
57 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
58     {
59         std::vector<A> c;
60         c.emplace_back(2, 3.5);
61         assert(c.size() == 1);
62         assert(c.front().geti() == 2);
63         assert(c.front().getd() == 3.5);
64         c.emplace_back(3, 4.5);
65         assert(c.size() == 2);
66         assert(c.front().geti() == 2);
67         assert(c.front().getd() == 3.5);
68         assert(c.back().geti() == 3);
69         assert(c.back().getd() == 4.5);
70     }
71     {
72         std::vector<A, stack_allocator<A, 4> > c;
73         c.emplace_back(2, 3.5);
74         assert(c.size() == 1);
75         assert(c.front().geti() == 2);
76         assert(c.front().getd() == 3.5);
77         c.emplace_back(3, 4.5);
78         assert(c.size() == 2);
79         assert(c.front().geti() == 2);
80         assert(c.front().getd() == 3.5);
81         assert(c.back().geti() == 3);
82         assert(c.back().getd() == 4.5);
83     }
84 #if __cplusplus >= 201103L
85     {
86         std::vector<A, min_allocator<A>> c;
87         c.emplace_back(2, 3.5);
88         assert(c.size() == 1);
89         assert(c.front().geti() == 2);
90         assert(c.front().getd() == 3.5);
91         c.emplace_back(3, 4.5);
92         assert(c.size() == 2);
93         assert(c.front().geti() == 2);
94         assert(c.front().getd() == 3.5);
95         assert(c.back().geti() == 3);
96         assert(c.back().getd() == 4.5);
97     }
98 #endif
99 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
100 }
101