1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03
10
11// <list>
12
13// template <class... Args> reference emplace_front(Args&&... args);
14// return type is 'reference' in C++17; 'void' before
15
16#include <list>
17#include <cassert>
18
19#include "test_macros.h"
20#include "min_allocator.h"
21
22class A {
23 int i_;
24 double d_;
25
26 A(const A&);
27 A& operator=(const A&);
28
29public:
30 A(int i, double d) : i_(i), d_(d) {}
31
32 int geti() const { return i_; }
33 double getd() const { return d_; }
34};
35
36int main(int, char**) {
37 {
38 std::list<A> c;
39#if TEST_STD_VER > 14
40 A& r1 = c.emplace_front(2, 3.5);
41 assert(c.size() == 1);
42 assert(&r1 == &c.front());
43 assert(c.front().geti() == 2);
44 assert(c.front().getd() == 3.5);
45 A& r2 = c.emplace_front(3, 4.5);
46 assert(c.size() == 2);
47 assert(&r2 == &c.front());
48#else
49 c.emplace_front(args: 2, args: 3.5);
50 assert(c.size() == 1);
51 assert(c.front().geti() == 2);
52 assert(c.front().getd() == 3.5);
53 c.emplace_front(args: 3, args: 4.5);
54 assert(c.size() == 2);
55#endif
56 assert(c.front().geti() == 3);
57 assert(c.front().getd() == 4.5);
58 assert(c.back().geti() == 2);
59 assert(c.back().getd() == 3.5);
60 }
61
62 {
63 std::list<A, min_allocator<A>> c;
64#if TEST_STD_VER > 14
65 A& r1 = c.emplace_front(2, 3.5);
66 assert(c.size() == 1);
67 assert(&r1 == &c.front());
68 assert(c.front().geti() == 2);
69 assert(c.front().getd() == 3.5);
70 A& r2 = c.emplace_front(3, 4.5);
71 assert(c.size() == 2);
72 assert(&r2 == &c.front());
73#else
74 c.emplace_front(2, 3.5);
75 assert(c.size() == 1);
76 assert(c.front().geti() == 2);
77 assert(c.front().getd() == 3.5);
78 c.emplace_front(3, 4.5);
79 assert(c.size() == 2);
80#endif
81 assert(c.front().geti() == 3);
82 assert(c.front().getd() == 4.5);
83 assert(c.back().geti() == 2);
84 assert(c.back().getd() == 3.5);
85 }
86
87 return 0;
88}
89

source code of libcxx/test/std/containers/sequences/list/list.modifiers/emplace_front.pass.cpp