Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / libc++ / trunk / test / containers / sequences / vector / vector.modifiers / emplace_back.pass.cpp
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 #include "asan_testing.h"
19
20 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
21
22 class A
23 {
24     int i_;
25     double d_;
26
27     A(const A&);
28     A& operator=(const A&);
29 public:
30     A(int i, double d)
31         : i_(i), d_(d) {}
32
33     A(A&& a)
34         : i_(a.i_),
35           d_(a.d_)
36     {
37         a.i_ = 0;
38         a.d_ = 0;
39     }
40
41     A& operator=(A&& a)
42     {
43         i_ = a.i_;
44         d_ = a.d_;
45         a.i_ = 0;
46         a.d_ = 0;
47         return *this;
48     }
49
50     int geti() const {return i_;}
51     double getd() const {return d_;}
52 };
53
54 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
55
56 int main()
57 {
58 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
59     {
60         std::vector<A> c;
61         c.emplace_back(2, 3.5);
62         assert(c.size() == 1);
63         assert(c.front().geti() == 2);
64         assert(c.front().getd() == 3.5);
65         assert(is_contiguous_container_asan_correct(c)); 
66         c.emplace_back(3, 4.5);
67         assert(c.size() == 2);
68         assert(c.front().geti() == 2);
69         assert(c.front().getd() == 3.5);
70         assert(c.back().geti() == 3);
71         assert(c.back().getd() == 4.5);
72         assert(is_contiguous_container_asan_correct(c)); 
73     }
74     {
75         std::vector<A, stack_allocator<A, 4> > c;
76         c.emplace_back(2, 3.5);
77         assert(c.size() == 1);
78         assert(c.front().geti() == 2);
79         assert(c.front().getd() == 3.5);
80         assert(is_contiguous_container_asan_correct(c)); 
81         c.emplace_back(3, 4.5);
82         assert(c.size() == 2);
83         assert(c.front().geti() == 2);
84         assert(c.front().getd() == 3.5);
85         assert(c.back().geti() == 3);
86         assert(c.back().getd() == 4.5);
87         assert(is_contiguous_container_asan_correct(c)); 
88     }
89 #if __cplusplus >= 201103L
90     {
91         std::vector<A, min_allocator<A>> c;
92         c.emplace_back(2, 3.5);
93         assert(c.size() == 1);
94         assert(c.front().geti() == 2);
95         assert(c.front().getd() == 3.5);
96         assert(is_contiguous_container_asan_correct(c)); 
97         c.emplace_back(3, 4.5);
98         assert(c.size() == 2);
99         assert(c.front().geti() == 2);
100         assert(c.front().getd() == 3.5);
101         assert(c.back().geti() == 3);
102         assert(c.back().getd() == 4.5);
103         assert(is_contiguous_container_asan_correct(c)); 
104     }
105 #endif
106 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
107 }