• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2    Copyright (c) Marshall Clow 2013.
3 
4    Distributed under the Boost Software License, Version 1.0. (See accompanying
5    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 
7     For more information, see http://www.boost.org
8 */
9 
10 #include <boost/config.hpp>
11 #include <boost/algorithm/cxx14/mismatch.hpp>
12 
13 #include "iterator_test.hpp"
14 
15 #define BOOST_TEST_MAIN
16 #include <boost/test/unit_test.hpp>
17 
18 template <typename T>
eq(const T & a,const T & b)19 BOOST_CXX14_CONSTEXPR bool eq ( const T& a, const T& b ) { return a == b; }
20 
21 template <typename T>
never_eq(const T &,const T &)22 BOOST_CXX14_CONSTEXPR bool never_eq ( const T&, const T& ) { return false; }
23 
24 namespace ba = boost::algorithm;
25 
26 template <typename Iter1, typename Iter2>
iter_eq(std::pair<Iter1,Iter2> pr,Iter1 first,Iter2 second)27 BOOST_CXX14_CONSTEXPR bool iter_eq ( std::pair<Iter1, Iter2> pr, Iter1 first, Iter2 second ) {
28     return pr.first == first && pr.second == second;
29     }
30 
test_mismatch()31 void test_mismatch ()
32 {
33 //  Note: The literal values here are tested against directly, careful if you change them:
34     BOOST_CXX14_CONSTEXPR int num[] = { 1, 1, 2, 3, 5 };
35     const int sz = sizeof (num)/sizeof(num[0]);
36 
37 
38 //  No mismatch for empty sequences
39     BOOST_CHECK ( iter_eq (
40         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num),
41                        input_iterator<const int *>(num),     input_iterator<const int *>(num)),
42                 input_iterator<const int *>(num), input_iterator<const int *>(num)));
43     BOOST_CHECK ( iter_eq (
44         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num),
45                        input_iterator<const int *>(num),     input_iterator<const int *>(num),
46                        never_eq<int> ),
47                 input_iterator<const int *>(num), input_iterator<const int *>(num)));
48 
49     BOOST_CHECK ( iter_eq (
50         ba::mismatch ( random_access_iterator<const int *>(num),     random_access_iterator<const int *>(num),
51                        random_access_iterator<const int *>(num),     random_access_iterator<const int *>(num),
52                        never_eq<int> ),
53                 random_access_iterator<const int *>(num), random_access_iterator<const int *>(num)));
54 
55 //  Empty vs. non-empty mismatch immediately
56     BOOST_CHECK ( iter_eq (
57         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num),
58                        input_iterator<const int *>(num),     input_iterator<const int *>(num + 1)),
59                 input_iterator<const int *>(num),     input_iterator<const int *>(num)));
60 
61     BOOST_CHECK ( iter_eq (
62         ba::mismatch ( input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2),
63                        input_iterator<const int *>(num),     input_iterator<const int *>(num)),
64                 input_iterator<const int *>(num + 1), input_iterator<const int *>(num)));
65 
66     BOOST_CHECK ( iter_eq (
67         ba::mismatch ( random_access_iterator<const int *>(num + 1), random_access_iterator<const int *>(num + 2),
68                        random_access_iterator<const int *>(num),     random_access_iterator<const int *>(num)),
69                 random_access_iterator<const int *>(num + 1), random_access_iterator<const int *>(num)));
70 
71 //  Single element sequences are equal if they contain the same value
72     BOOST_CHECK ( iter_eq (
73         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num + 1),
74                        input_iterator<const int *>(num),     input_iterator<const int *>(num + 1)),
75                 input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 1)));
76 
77     BOOST_CHECK ( iter_eq (
78         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num + 1),
79                        input_iterator<const int *>(num),     input_iterator<const int *>(num + 1),
80                        eq<int> ),
81                 input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 1)));
82 
83     BOOST_CHECK ( iter_eq (
84         ba::mismatch ( random_access_iterator<const int *>(num),     random_access_iterator<const int *>(num + 1),
85                        random_access_iterator<const int *>(num),     random_access_iterator<const int *>(num + 1),
86                        eq<int> ),
87                 random_access_iterator<const int *>(num + 1), random_access_iterator<const int *>(num + 1)));
88 
89 
90     BOOST_CHECK ( iter_eq (
91         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num + 1),
92                        input_iterator<const int *>(num),     input_iterator<const int *>(num + 1),
93                        never_eq<int> ),
94                input_iterator<const int *>(num),     input_iterator<const int *>(num)));
95 
96     BOOST_CHECK ( iter_eq (
97         ba::mismatch ( random_access_iterator<const int *>(num),     random_access_iterator<const int *>(num + 1),
98                        random_access_iterator<const int *>(num),     random_access_iterator<const int *>(num + 1),
99                        never_eq<int> ),
100                random_access_iterator<const int *>(num),     random_access_iterator<const int *>(num)));
101 
102     BOOST_CHECK ( iter_eq (
103         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num + 1),
104                        input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2)),
105                input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2)));
106 
107     BOOST_CHECK ( iter_eq (
108         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num + 1),
109                        input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2),
110                        eq<int> ),
111                input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2)));
112 
113     BOOST_CHECK ( iter_eq (
114             ba::mismatch ( input_iterator<const int *>(num + 2), input_iterator<const int *>(num + 3),
115                            input_iterator<const int *>(num),     input_iterator<const int *>(num + 1)),
116                            input_iterator<const int *>(num + 2), input_iterator<const int *>(num)));
117 
118     BOOST_CHECK ( iter_eq (
119         ba::mismatch ( input_iterator<const int *>(num + 2), input_iterator<const int *>(num + 3),
120                        input_iterator<const int *>(num),     input_iterator<const int *>(num + 1),
121                        eq<int> ),
122                input_iterator<const int *>(num + 2), input_iterator<const int *>(num)));
123 
124 
125 
126 //  Identical long sequences are equal.
127     BOOST_CHECK ( iter_eq (
128         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num + sz),
129                        input_iterator<const int *>(num),     input_iterator<const int *>(num + sz)),
130             input_iterator<const int *>(num + sz), input_iterator<const int *>(num + sz)));
131 
132     BOOST_CHECK ( iter_eq (
133         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num + sz),
134                        input_iterator<const int *>(num),     input_iterator<const int *>(num + sz),
135                        eq<int> ),
136             input_iterator<const int *>(num + sz), input_iterator<const int *>(num + sz)));
137 
138     BOOST_CHECK ( iter_eq (
139         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num + sz),
140                        input_iterator<const int *>(num),     input_iterator<const int *>(num + sz),
141                        never_eq<int> ),
142             input_iterator<const int *>(num),     input_iterator<const int *>(num)));
143 
144     BOOST_CHECK ( iter_eq (
145         ba::mismatch ( input_iterator<const int *>(num),             input_iterator<const int *>(num + sz),
146                        random_access_iterator<const int *>(num),     random_access_iterator<const int *>(num + sz),
147                        never_eq<int> ),
148             input_iterator<const int *>(num),     random_access_iterator<const int *>(num)));
149 
150 //  Different sequences are different
151     BOOST_CHECK ( iter_eq (
152         ba::mismatch ( input_iterator<const int *>(num + 1), input_iterator<const int *>(num + sz),
153                        input_iterator<const int *>(num),     input_iterator<const int *>(num + sz)),
154             input_iterator<const int *>(num + 2), input_iterator<const int *>(num + 1)));
155 
156     BOOST_CHECK ( iter_eq (
157         ba::mismatch ( input_iterator<const int *>(num + 1), input_iterator<const int *>(num + sz),
158                        input_iterator<const int *>(num),     input_iterator<const int *>(num + sz),
159                        eq<int> ),
160             input_iterator<const int *>(num + 2), input_iterator<const int *>(num + 1)));
161 
162 //  Checks constexpr
163     BOOST_CXX14_CONSTEXPR bool res = (
164 //  No mismatch for empty
165         iter_eq (
166             ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num),
167                            input_iterator<const int *>(num),     input_iterator<const int *>(num)),
168                 input_iterator<const int *>(num), input_iterator<const int *>(num))
169 //  Empty vs. non-empty mismatch immediately
170         && iter_eq (
171         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num),
172                        input_iterator<const int *>(num),     input_iterator<const int *>(num + 1)),
173                 input_iterator<const int *>(num),     input_iterator<const int *>(num))
174 //  Single element sequences are equal if they contain the same value
175         && iter_eq (
176         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num + 1),
177                        input_iterator<const int *>(num),     input_iterator<const int *>(num + 1),
178                        eq<int>),
179                 input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 1))
180 //  Identical long sequences are equal.
181         && iter_eq (
182         ba::mismatch ( input_iterator<const int *>(num),     input_iterator<const int *>(num + sz),
183                        input_iterator<const int *>(num),     input_iterator<const int *>(num + sz),
184                        eq<int> ),
185                 input_iterator<const int *>(num + sz), input_iterator<const int *>(num + sz))
186         );
187 
188     BOOST_CHECK ( res );
189 }
190 
191 
BOOST_AUTO_TEST_CASE(test_main)192 BOOST_AUTO_TEST_CASE( test_main )
193 {
194   test_mismatch ();
195 }
196