set_symmetric_difference_comp.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <algorithm>
11
12// template<InputIterator InIter1, InputIterator InIter2, typename OutIter,
13//          CopyConstructible Compare>
14//   requires OutputIterator<OutIter, InIter1::reference>
15//         && OutputIterator<OutIter, InIter2::reference>
16//         && Predicate<Compare, InIter1::value_type, InIter2::value_type>
17//         && Predicate<Compare, InIter2::value_type, InIter1::value_type>
18//   OutIter
19//   set_symmetric_difference(InIter1 first1, InIter1 last1,
20//                            InIter2 first2, InIter2 last2,
21//                            OutIter result, Compare comp);
22
23#include <algorithm>
24#include <functional>
25#include <cassert>
26
27#include "../../../iterators.h"
28
29template <class Iter1, class Iter2, class OutIter>
30void
31test()
32{
33    int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
34    const int sa = sizeof(ia)/sizeof(ia[0]);
35    int ib[] = {2, 4, 4, 6};
36    const int sb = sizeof(ib)/sizeof(ib[0]);
37    int ic[20];
38    int ir[] = {1, 2, 3, 3, 3, 4, 4, 6};
39    const int sr = sizeof(ir)/sizeof(ir[0]);
40    OutIter ce = std::set_symmetric_difference(Iter1(ia), Iter1(ia+sa),
41                                               Iter2(ib), Iter2(ib+sb),
42                                               OutIter(ic), std::less<int>());
43    assert(base(ce) - ic == sr);
44    assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0);
45    ce = std::set_symmetric_difference(Iter1(ib), Iter1(ib+sb),
46                                       Iter2(ia), Iter2(ia+sa),
47                                       OutIter(ic), std::less<int>());
48    assert(base(ce) - ic == sr);
49    assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0);
50}
51
52int main()
53{
54    test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
55    test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
56    test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
57    test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
58    test<input_iterator<const int*>, input_iterator<const int*>, int*>();
59
60    test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
61    test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
62    test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
63    test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
64    test<input_iterator<const int*>, forward_iterator<const int*>, int*>();
65
66    test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
67    test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
68    test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
69    test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
70    test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
71
72    test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
73    test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
74    test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
75    test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
76    test<input_iterator<const int*>, random_access_iterator<const int*>, int*>();
77
78    test<input_iterator<const int*>, const int*, output_iterator<int*> >();
79    test<input_iterator<const int*>, const int*, forward_iterator<int*> >();
80    test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
81    test<input_iterator<const int*>, const int*, random_access_iterator<int*> >();
82    test<input_iterator<const int*>, const int*, int*>();
83
84    test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
85    test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
86    test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
87    test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
88    test<forward_iterator<const int*>, input_iterator<const int*>, int*>();
89
90    test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
91    test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
92    test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
93    test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
94    test<forward_iterator<const int*>, forward_iterator<const int*>, int*>();
95
96    test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
97    test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
98    test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
99    test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
100    test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
101
102    test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
103    test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
104    test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
105    test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
106    test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>();
107
108    test<forward_iterator<const int*>, const int*, output_iterator<int*> >();
109    test<forward_iterator<const int*>, const int*, forward_iterator<int*> >();
110    test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
111    test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >();
112    test<forward_iterator<const int*>, const int*, int*>();
113
114    test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
115    test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
116    test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
117    test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
118    test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>();
119
120    test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
121    test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
122    test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
123    test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
124    test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>();
125
126    test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
127    test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
128    test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
129    test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
130    test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
131
132    test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
133    test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
134    test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
135    test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
136    test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>();
137
138    test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >();
139    test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >();
140    test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
141    test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >();
142    test<bidirectional_iterator<const int*>, const int*, int*>();
143
144    test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
145    test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
146    test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
147    test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
148    test<random_access_iterator<const int*>, input_iterator<const int*>, int*>();
149
150    test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
151    test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
152    test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
153    test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
154    test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>();
155
156    test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
157    test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
158    test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
159    test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
160    test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
161
162    test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
163    test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
164    test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
165    test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
166    test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>();
167
168    test<random_access_iterator<const int*>, const int*, output_iterator<int*> >();
169    test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >();
170    test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
171    test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >();
172    test<random_access_iterator<const int*>, const int*, int*>();
173
174    test<const int*, input_iterator<const int*>, output_iterator<int*> >();
175    test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
176    test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
177    test<const int*, input_iterator<const int*>, random_access_iterator<int*> >();
178    test<const int*, input_iterator<const int*>, int*>();
179
180    test<const int*, forward_iterator<const int*>, output_iterator<int*> >();
181    test<const int*, forward_iterator<const int*>, forward_iterator<int*> >();
182    test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >();
183    test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >();
184    test<const int*, forward_iterator<const int*>, int*>();
185
186    test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >();
187    test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >();
188    test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
189    test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
190    test<const int*, bidirectional_iterator<const int*>, int*>();
191
192    test<const int*, random_access_iterator<const int*>, output_iterator<int*> >();
193    test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >();
194    test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
195    test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >();
196    test<const int*, random_access_iterator<const int*>, int*>();
197
198    test<const int*, const int*, output_iterator<int*> >();
199    test<const int*, const int*, forward_iterator<int*> >();
200    test<const int*, const int*, bidirectional_iterator<int*> >();
201    test<const int*, const int*, random_access_iterator<int*> >();
202    test<const int*, const int*, int*>();
203}
204