32 #ifndef _GLIBCXX_PARALLEL_UNIQUE_COPY_H
33 #define _GLIBCXX_PARALLEL_UNIQUE_COPY_H 1
47 template<
typename InputIterator,
49 class BinaryPredicate>
52 OutputIterator result, BinaryPredicate binary_pred)
57 typedef typename traits_type::value_type value_type;
58 typedef typename traits_type::difference_type difference_type;
60 difference_type size = last - first;
66 difference_type *counter;
67 difference_type *borders;
71 # pragma omp parallel num_threads(num_threads)
75 num_threads = omp_get_num_threads();
76 borders =
new difference_type[num_threads + 2];
78 counter =
new difference_type[num_threads + 1];
83 difference_type begin, end;
87 difference_type i = 0;
88 OutputIterator out = result;
92 begin = borders[0] + 1;
93 end = borders[iam + 1];
98 for (InputIterator iter = first + begin; iter < first + end; ++iter)
100 if (!binary_pred(*iter, *(iter-1)))
109 begin = borders[iam];
110 end = borders[iam + 1];
112 for (InputIterator iter = first + begin; iter < first + end; ++iter)
114 if (!binary_pred(*iter, *(iter - 1)))
121 difference_type begin_output;
130 for (
int t = 0; t < num_threads; ++t)
131 begin_output += counter[t];
135 OutputIterator iter_out = result + begin_output;
137 begin = borders[num_threads];
140 for (InputIterator iter = first + begin; iter < first + end; ++iter)
142 if (iter == first || !binary_pred(*iter, *(iter - 1)))
149 counter[num_threads] = i;
153 for (
int t = 0; t < iam; t++)
154 begin_output += counter[t];
156 OutputIterator iter_out = result + begin_output;
157 for (InputIterator iter = first + begin; iter < first + end; ++iter)
159 if (!binary_pred(*iter, *(iter-1)))
165 difference_type end_output = 0;
166 for (
int t = 0; t < num_threads + 1; t++)
167 end_output += counter[t];
171 return result + end_output;
179 template<
typename InputIterator,
class OutputIterator>
180 inline OutputIterator
182 OutputIterator result)
184 typedef typename std::iterator_traits<InputIterator>::value_type
#define _GLIBCXX_CALL(n)
Macro to produce log message when entering a function.
OutputIterator parallel_unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate binary_pred)
Parallel std::unique_copy(), w/o explicit equality predicate.
GNU parallel code for public use.
Functions to find elements of a certain global rank in multiple sorted sequences. Also serves for spl...
One of the comparison functors.
uint16 thread_index_t
Unsigned integer to index a thread number. The maximum thread number (for each processor) must fit in...
End-user include file. Provides advanced settings and tuning options. This file is a GNU parallel ext...
OutputIterator equally_split(difference_type n, thread_index_t num_threads, OutputIterator s)
Function to split a sequence into parts of almost equal size.