1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <vector>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class... Args> void emplace_back(Args&&... args);
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <vector>
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "../../../stack_allocator.h"
17061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h"
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1973d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass A
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int i_;
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    double d_;
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    A(const A&);
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    A& operator=(const A&);
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    A(int i, double d)
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : i_(i), d_(d) {}
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    A(A&& a)
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : i_(a.i_),
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant          d_(a.d_)
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        a.i_ = 0;
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        a.d_ = 0;
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    A& operator=(A&& a)
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        i_ = a.i_;
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        d_ = a.d_;
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        a.i_ = 0;
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        a.d_ = 0;
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return *this;
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int geti() const {return i_;}
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    double getd() const {return d_;}
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5373d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5773d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::vector<A> c;
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.emplace_back(2, 3.5);
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.size() == 1);
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.front().geti() == 2);
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.front().getd() == 3.5);
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.emplace_back(3, 4.5);
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.size() == 2);
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.front().geti() == 2);
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.front().getd() == 3.5);
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.back().geti() == 3);
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.back().getd() == 4.5);
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::vector<A, stack_allocator<A, 4> > c;
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.emplace_back(2, 3.5);
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.size() == 1);
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.front().geti() == 2);
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.front().getd() == 3.5);
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.emplace_back(3, 4.5);
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.size() == 2);
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.front().geti() == 2);
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.front().getd() == 3.5);
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.back().geti() == 3);
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.back().getd() == 4.5);
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
842c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant#if __cplusplus >= 201103L
852c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant    {
862c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant        std::vector<A, min_allocator<A>> c;
872c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant        c.emplace_back(2, 3.5);
882c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant        assert(c.size() == 1);
892c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant        assert(c.front().geti() == 2);
902c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant        assert(c.front().getd() == 3.5);
912c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant        c.emplace_back(3, 4.5);
922c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant        assert(c.size() == 2);
932c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant        assert(c.front().geti() == 2);
942c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant        assert(c.front().getd() == 3.5);
952c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant        assert(c.back().geti() == 3);
962c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant        assert(c.back().getd() == 4.5);
972c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant    }
982c39cbe0207908bca2e1da40e16cbc443d2e7438Howard Hinnant#endif
9973d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
101