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 // void splice_after(const_iterator p, forward_list&& x, const_iterator i); 13 14 #include <forward_list> 15 #include <cassert> 16 #include <iterator> 17 #include <cstddef> 18 19 #include "test_macros.h" 20 #include "min_allocator.h" 21 22 typedef int T; 23 const T t1[] = {0, 1, 2, 3, 4, 5, 6, 7}; 24 const T t2[] = {10, 11, 12}; 25 const std::ptrdiff_t size_t1 = std::end(t1) - std::begin(t1); 26 const std::ptrdiff_t size_t2 = std::end(t2) - std::begin(t2); 27 28 template <class C> 29 void 30 testd(const C& c, int p, int f) 31 { 32 typename C::const_iterator i = c.begin(); 33 int n1 = 0; 34 for (; n1 < p; ++n1, ++i) 35 assert(*i == t1[n1]); 36 for (int n2 = f; n2 < f+1; ++n2, ++i) 37 assert(*i == t2[n2]); 38 for (; n1 < size_t1; ++n1, ++i) 39 assert(*i == t1[n1]); 40 assert(distance(c.begin(), c.end()) == size_t1 + 1); 41 } 42 43 template <class C> 44 void 45 tests(const C& c, int p, int f) 46 { 47 typename C::const_iterator i = c.begin(); 48 int n = 0; 49 if (p == f || p == f+1) 50 { 51 for (n = 0; n < size_t1; ++n, ++i) 52 assert(*i == t1[n]); 53 } 54 else if (p < f) 55 { 56 for (n = 0; n < p; ++n, ++i) 57 assert(*i == t1[n]); 58 for (n = f; n < f+1; ++n, ++i) 59 assert(*i == t1[n]); 60 for (n = p; n < f; ++n, ++i) 61 assert(*i == t1[n]); 62 for (n = f+1; n < size_t1; ++n, ++i) 63 assert(*i == t1[n]); 64 } 65 else // p > f+1 66 { 67 for (n = 0; n < f; ++n, ++i) 68 assert(*i == t1[n]); 69 for (n = f+1; n < p; ++n, ++i) 70 assert(*i == t1[n]); 71 for (n = f; n < f+1; ++n, ++i) 72 assert(*i == t1[n]); 73 for (n = p; n < size_t1; ++n, ++i) 74 assert(*i == t1[n]); 75 } 76 assert(distance(c.begin(), c.end()) == size_t1); 77 } 78 79 int main() 80 { 81 { 82 // splicing different containers 83 typedef std::forward_list<T> C; 84 for (int f = 0; f <= size_t2-1; ++f) 85 { 86 for (int p = 0; p <= size_t1; ++p) 87 { 88 C c1(std::begin(t1), std::end(t1)); 89 C c2(std::begin(t2), std::end(t2)); 90 91 c1.splice_after(next(c1.cbefore_begin(), p), std::move(c2), 92 next(c2.cbefore_begin(), f)); 93 testd(c1, p, f); 94 } 95 } 96 97 // splicing within same container 98 for (int f = 0; f <= size_t1-1; ++f) 99 { 100 for (int p = 0; p <= size_t1; ++p) 101 { 102 C c1(std::begin(t1), std::end(t1)); 103 104 c1.splice_after(next(c1.cbefore_begin(), p), std::move(c1), 105 next(c1.cbefore_begin(), f)); 106 tests(c1, p, f); 107 } 108 } 109 } 110 #if TEST_STD_VER >= 11 111 { 112 // splicing different containers 113 typedef std::forward_list<T, min_allocator<T>> C; 114 for (int f = 0; f <= size_t2-1; ++f) 115 { 116 for (int p = 0; p <= size_t1; ++p) 117 { 118 C c1(std::begin(t1), std::end(t1)); 119 C c2(std::begin(t2), std::end(t2)); 120 121 c1.splice_after(next(c1.cbefore_begin(), p), std::move(c2), 122 next(c2.cbefore_begin(), f)); 123 testd(c1, p, f); 124 } 125 } 126 127 // splicing within same container 128 for (int f = 0; f <= size_t1-1; ++f) 129 { 130 for (int p = 0; p <= size_t1; ++p) 131 { 132 C c1(std::begin(t1), std::end(t1)); 133 134 c1.splice_after(next(c1.cbefore_begin(), p), std::move(c1), 135 next(c1.cbefore_begin(), f)); 136 tests(c1, p, f); 137 } 138 } 139 } 140 #endif 141 } 142