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 // <forward_list>
11
12 // template <class... Args>
13 // iterator emplace_after(const_iterator p, Args&&... args);
14
15 #include <forward_list>
16 #include <cassert>
17
18 #include "../../../Emplaceable.h"
19 #include "min_allocator.h"
20
main()21 int main()
22 {
23 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
24 {
25 typedef Emplaceable T;
26 typedef std::forward_list<T> C;
27 typedef C::iterator I;
28 C c;
29 I i = c.emplace_after(c.cbefore_begin());
30 assert(i == c.begin());
31 assert(c.front() == Emplaceable());
32 assert(distance(c.begin(), c.end()) == 1);
33
34 i = c.emplace_after(c.cbegin(), 1, 2.5);
35 assert(i == next(c.begin()));
36 assert(c.front() == Emplaceable());
37 assert(*next(c.begin()) == Emplaceable(1, 2.5));
38 assert(distance(c.begin(), c.end()) == 2);
39
40 i = c.emplace_after(next(c.cbegin()), 2, 3.5);
41 assert(i == next(c.begin(), 2));
42 assert(c.front() == Emplaceable());
43 assert(*next(c.begin()) == Emplaceable(1, 2.5));
44 assert(*next(c.begin(), 2) == Emplaceable(2, 3.5));
45 assert(distance(c.begin(), c.end()) == 3);
46
47 i = c.emplace_after(c.cbegin(), 3, 4.5);
48 assert(i == next(c.begin()));
49 assert(c.front() == Emplaceable());
50 assert(*next(c.begin(), 1) == Emplaceable(3, 4.5));
51 assert(*next(c.begin(), 2) == Emplaceable(1, 2.5));
52 assert(*next(c.begin(), 3) == Emplaceable(2, 3.5));
53 assert(distance(c.begin(), c.end()) == 4);
54 }
55 #if __cplusplus >= 201103L
56 {
57 typedef Emplaceable T;
58 typedef std::forward_list<T, min_allocator<T>> C;
59 typedef C::iterator I;
60 C c;
61 I i = c.emplace_after(c.cbefore_begin());
62 assert(i == c.begin());
63 assert(c.front() == Emplaceable());
64 assert(distance(c.begin(), c.end()) == 1);
65
66 i = c.emplace_after(c.cbegin(), 1, 2.5);
67 assert(i == next(c.begin()));
68 assert(c.front() == Emplaceable());
69 assert(*next(c.begin()) == Emplaceable(1, 2.5));
70 assert(distance(c.begin(), c.end()) == 2);
71
72 i = c.emplace_after(next(c.cbegin()), 2, 3.5);
73 assert(i == next(c.begin(), 2));
74 assert(c.front() == Emplaceable());
75 assert(*next(c.begin()) == Emplaceable(1, 2.5));
76 assert(*next(c.begin(), 2) == Emplaceable(2, 3.5));
77 assert(distance(c.begin(), c.end()) == 3);
78
79 i = c.emplace_after(c.cbegin(), 3, 4.5);
80 assert(i == next(c.begin()));
81 assert(c.front() == Emplaceable());
82 assert(*next(c.begin(), 1) == Emplaceable(3, 4.5));
83 assert(*next(c.begin(), 2) == Emplaceable(1, 2.5));
84 assert(*next(c.begin(), 3) == Emplaceable(2, 3.5));
85 assert(distance(c.begin(), c.end()) == 4);
86 }
87 #endif
88 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
89 }
90