1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // \(C\) Copyright Benedek Thaler 2015-2016
4 // \(C\) Copyright Ion Gaztanaga 2019-2020. Distributed under the Boost
5 // Software License, Version 1.0. (See accompanying file
6 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // See http://erenon.hu/double_ended for documentation.
9 //
10 //////////////////////////////////////////////////////////////////////////////
11
12 #ifndef BOOST_CONTAINER_TEST_TEST_UTIL_HPP
13 #define BOOST_CONTAINER_TEST_TEST_UTIL_HPP
14
15 #include "test_elem.hpp"
16
17 // get_range
18
19 template <typename DeVector>
get_range(int fbeg,int fend,int bbeg,int bend,DeVector & c)20 void get_range(int fbeg, int fend, int bbeg, int bend, DeVector &c)
21 {
22 c.clear();
23
24 for (int i = fend; i > fbeg ;)
25 {
26 c.emplace_front(--i);
27 }
28
29 for (int i = bbeg; i < bend; ++i)
30 {
31 c.emplace_back(i);
32 }
33 }
34
35 template <typename Container>
get_range(int count,Container & c)36 void get_range(int count, Container &c)
37 {
38 c.clear();
39
40 for (int i = 1; i <= count; ++i)
41 {
42 c.emplace_back(i);
43 }
44 }
45
46 template <typename Container>
get_range(Container & c)47 void get_range(Container &c)
48 {
49 get_range<Container>(1, 13, 13, 25, c);
50 }
51
52 template <typename C1>
test_equal_range(const C1 & a)53 void test_equal_range(const C1& a)
54 {
55 BOOST_TEST(a.empty());
56 }
57
58 template <typename Iterator>
print_range(std::ostream & out,Iterator b,Iterator e)59 void print_range(std::ostream& out, Iterator b, Iterator e)
60 {
61 out << '[';
62 bool first = true;
63
64 for (; b != e; ++b)
65 {
66 if (first) { first = false; }
67 else { out << ','; }
68 out << *b;
69 }
70 out << ']';
71 }
72
73 template <typename Range>
print_range(std::ostream & out,const Range & range)74 void print_range(std::ostream& out, const Range& range)
75 {
76 print_range(out, range.begin(), range.end());
77 }
78
79 template <typename Array, std::size_t N>
print_range(std::ostream & out,Array (& range)[N])80 void print_range(std::ostream& out, Array (&range)[N])
81 {
82 print_range(out, range, range + N);
83 }
84
85 template <typename C1, typename C2, unsigned N>
test_equal_range(const C1 & a,const C2 (& b)[N])86 void test_equal_range(const C1& a, const C2 (&b)[N])
87 {
88 bool equals = boost::algorithm::equal
89 (a.begin(), a.end(), b, b+N);
90
91 BOOST_TEST(equals);
92
93 if (!equals)
94 {
95 print_range(std::cerr, a);
96 std::cerr << "\n";
97 print_range(std::cerr, b);
98 std::cerr << "\n";
99 }
100 }
101
102
103 template <typename C1, typename C2>
test_equal_range(const C1 & a,const C2 & b)104 void test_equal_range(const C1& a, const C2&b)
105 {
106 bool equals = boost::algorithm::equal
107 (a.begin(), a.end(), b.begin(), b.end());
108
109 BOOST_TEST(equals);
110
111 if (!equals)
112 {
113 print_range(std::cerr, a);
114 std::cerr << "\n";
115 print_range(std::cerr, b);
116 std::cerr << "\n";
117 }
118 }
119
120 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
121
122 // support initializer_list
123 template <typename C>
test_equal_range(const C & a,std::initializer_list<unsigned> il)124 void test_equal_range(const C& a, std::initializer_list<unsigned> il)
125 {
126 typedef typename C::value_type T;
127 boost::container::vector<T> b;
128
129 for (auto&& elem : il)
130 {
131 b.emplace_back(elem);
132 }
133
134 test_equal_range(a, b);
135 }
136
137 #endif //#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
138
139 #endif //BOOST_CONTAINER_TEST_TEST_UTIL_HPP
140