36 #ifndef _GLIBCXX_PARALLEL_ALGOBASE_H
37 #define _GLIBCXX_PARALLEL_ALGOBASE_H 1
53 template<
typename InputIterator1,
typename InputIterator2>
54 inline pair<InputIterator1, InputIterator2>
55 mismatch(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
57 {
return _GLIBCXX_STD_P::mismatch(begin1, end1, begin2); }
60 template<
typename InputIterator1,
typename InputIterator2,
62 inline pair<InputIterator1, InputIterator2>
63 mismatch(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
65 {
return _GLIBCXX_STD_P::mismatch(begin1, end1, begin2, pred); }
68 template<
typename InputIterator1,
typename InputIterator2,
69 typename Predicate,
typename IteratorTag1,
typename IteratorTag2>
70 inline pair<InputIterator1, InputIterator2>
71 mismatch_switch(InputIterator1 begin1, InputIterator1 end1,
72 InputIterator2 begin2, Predicate pred, IteratorTag1,
74 {
return _GLIBCXX_STD_P::mismatch(begin1, end1, begin2, pred); }
77 template<
typename RandomAccessIterator1,
typename RandomAccessIterator2,
79 pair<RandomAccessIterator1, RandomAccessIterator2>
80 mismatch_switch(RandomAccessIterator1 begin1, RandomAccessIterator1 end1,
81 RandomAccessIterator2 begin2, Predicate pred,
82 random_access_iterator_tag, random_access_iterator_tag)
86 RandomAccessIterator1 res =
89 mismatch_selector()).first;
90 return make_pair(res , begin2 + (res - begin1));
93 return _GLIBCXX_STD_P::mismatch(begin1, end1, begin2, pred);
97 template<
typename InputIterator1,
typename InputIterator2>
98 inline pair<InputIterator1, InputIterator2>
99 mismatch(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2)
103 typedef typename iterator1_traits::value_type value1_type;
104 typedef typename iterator2_traits::value_type value2_type;
105 typedef typename iterator1_traits::iterator_category iterator1_category;
106 typedef typename iterator2_traits::iterator_category iterator2_category;
110 return mismatch_switch(begin1, end1, begin2, equal_to_type(),
111 iterator1_category(), iterator2_category());
115 template<
typename InputIterator1,
typename InputIterator2,
117 inline pair<InputIterator1, InputIterator2>
118 mismatch(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
123 typedef typename iterator1_traits::iterator_category iterator1_category;
124 typedef typename iterator2_traits::iterator_category iterator2_category;
126 return mismatch_switch(begin1, end1, begin2, pred, iterator1_category(),
127 iterator2_category());
131 template<
typename InputIterator1,
typename InputIterator2>
133 equal(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
135 {
return _GLIBCXX_STD_P::equal(begin1, end1, begin2); }
138 template<
typename InputIterator1,
typename InputIterator2,
141 equal(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
143 {
return _GLIBCXX_STD_P::equal(begin1, end1, begin2, pred); }
146 template<
typename InputIterator1,
typename InputIterator2>
148 equal(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2)
149 {
return _GLIBCXX_STD_P::mismatch(begin1, end1, begin2).first == end1; }
152 template<
typename InputIterator1,
typename InputIterator2,
155 equal(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
158 return _GLIBCXX_STD_P::mismatch(begin1, end1, begin2, pred).first
163 template<
typename InputIterator1,
typename InputIterator2>
165 lexicographical_compare(InputIterator1 begin1, InputIterator1 end1,
166 InputIterator2 begin2, InputIterator2 end2,
168 {
return _GLIBCXX_STD_P::lexicographical_compare(begin1, end1,
172 template<
typename InputIterator1,
typename InputIterator2,
175 lexicographical_compare(InputIterator1 begin1, InputIterator1 end1,
176 InputIterator2 begin2, InputIterator2 end2,
178 {
return _GLIBCXX_STD_P::lexicographical_compare(begin1, end1,
179 begin2, end2, pred); }
182 template<
typename InputIterator1,
typename InputIterator2,
183 typename Predicate,
typename IteratorTag1,
typename IteratorTag2>
185 lexicographical_compare_switch(InputIterator1 begin1, InputIterator1 end1,
186 InputIterator2 begin2, InputIterator2 end2,
187 Predicate pred, IteratorTag1, IteratorTag2)
188 {
return _GLIBCXX_STD_P::lexicographical_compare(begin1, end1,
189 begin2, end2, pred); }
193 template<
typename RandomAccessIterator1,
typename RandomAccessIterator2,
196 lexicographical_compare_switch(RandomAccessIterator1 begin1,
197 RandomAccessIterator1 end1,
198 RandomAccessIterator2 begin2,
199 RandomAccessIterator2 end2, Predicate pred,
200 random_access_iterator_tag,
201 random_access_iterator_tag)
205 typedef iterator_traits<RandomAccessIterator1> traits1_type;
206 typedef typename traits1_type::value_type value1_type;
208 typedef iterator_traits<RandomAccessIterator2> traits2_type;
209 typedef typename traits2_type::value_type value2_type;
212 value2_type> equal_type;
215 if ((end1 - begin1) < (end2 - begin2))
217 typedef pair<RandomAccessIterator1, RandomAccessIterator2>
219 pair_type mm = mismatch_switch(begin1, end1, begin2,
221 random_access_iterator_tag(),
222 random_access_iterator_tag());
224 return (mm.first == end1) || bool(pred(*mm.first, *mm.second));
228 typedef pair<RandomAccessIterator2, RandomAccessIterator1>
230 pair_type mm = mismatch_switch(begin2, end2, begin1,
232 random_access_iterator_tag(),
233 random_access_iterator_tag());
235 return (mm.first != end2) && bool(pred(*mm.second, *mm.first));
239 return _GLIBCXX_STD_P::lexicographical_compare(begin1, end1,
244 template<
typename InputIterator1,
typename InputIterator2>
246 lexicographical_compare(InputIterator1 begin1, InputIterator1 end1,
247 InputIterator2 begin2, InputIterator2 end2)
249 typedef iterator_traits<InputIterator1> traits1_type;
250 typedef typename traits1_type::value_type value1_type;
251 typedef typename traits1_type::iterator_category iterator1_category;
253 typedef iterator_traits<InputIterator2> traits2_type;
254 typedef typename traits2_type::value_type value2_type;
255 typedef typename traits2_type::iterator_category iterator2_category;
258 return lexicographical_compare_switch(begin1, end1, begin2, end2,
259 less_type(), iterator1_category(),
260 iterator2_category());
264 template<
typename InputIterator1,
typename InputIterator2,
267 lexicographical_compare(InputIterator1 begin1, InputIterator1 end1,
268 InputIterator2 begin2, InputIterator2 end2,
271 typedef iterator_traits<InputIterator1> traits1_type;
272 typedef typename traits1_type::iterator_category iterator1_category;
274 typedef iterator_traits<InputIterator2> traits2_type;
275 typedef typename traits2_type::iterator_category iterator2_category;
277 return lexicographical_compare_switch(begin1, end1, begin2, end2, pred,
278 iterator1_category(),
279 iterator2_category());
Constructs predicate for equality from strict weak ordering predicate.
#define _GLIBCXX_PARALLEL_CONDITION(c)
Determine at compile(?)-time if the parallel variant of an algorithm should be called.
Runtime settings and tuning parameters, heuristics to decide whether to use parallelized algorithms...
Forces sequential execution at compile time.
Similar to std::equal_to, but allows two different types.
Similar to std::less, but allows two different types.
Sequential helper functions. This file is a GNU parallel extension to the Standard C++ Library...
Function objects representing different tasks to be plugged into the parallel find algorithm...
Tags for compile-time selection. This file is a GNU parallel extension to the Standard C++ Library...
Parallel implementation base for std::find(), std::equal() and related functions. This file is a GNU ...
std::pair< RandomAccessIterator1, RandomAccessIterator2 > find_template(RandomAccessIterator1 begin1, RandomAccessIterator1 end1, RandomAccessIterator2 begin2, Pred pred, Selector selector)
Parallel std::find, switch for different algorithms.