32 #ifndef _GLIBCXX_PARALLEL_UNIQUE_COPY_H
33 #define _GLIBCXX_PARALLEL_UNIQUE_COPY_H 1
38 namespace __gnu_parallel
46 template<
typename _IIter,
47 class _OutputIterator,
48 class _BinaryPredicate>
51 _OutputIterator __result,
52 _BinaryPredicate __binary_pred)
56 typedef std::iterator_traits<_IIter> _TraitsType;
57 typedef typename _TraitsType::value_type _ValueType;
58 typedef typename _TraitsType::difference_type _DifferenceType;
60 _DifferenceType __size = __last - __first;
66 _DifferenceType *__counter;
67 _DifferenceType *__borders;
71 # pragma omp parallel num_threads(__num_threads)
75 __num_threads = omp_get_num_threads();
76 __borders =
new _DifferenceType[__num_threads + 2];
78 __counter =
new _DifferenceType[__num_threads + 1];
83 _DifferenceType __begin, __end;
87 _DifferenceType __i = 0;
88 _OutputIterator __out = __result;
92 __begin = __borders[0] + 1;
93 __end = __borders[__iam + 1];
98 for (_IIter __iter = __first + __begin; __iter < __first + __end;
101 if (!__binary_pred(*__iter, *(__iter - 1)))
110 __begin = __borders[__iam];
111 __end = __borders[__iam + 1];
113 for (_IIter __iter = __first + __begin; __iter < __first + __end;
116 if (!__binary_pred(*__iter, *(__iter - 1)))
120 __counter[__iam] = __i;
123 _DifferenceType __begin_output;
133 __begin_output += __counter[__t];
137 _OutputIterator __iter_out = __result + __begin_output;
139 __begin = __borders[__num_threads];
142 for (_IIter __iter = __first + __begin; __iter < __first + __end;
145 if (__iter == __first
146 || !__binary_pred(*__iter, *(__iter - 1)))
149 *__iter_out++ = *__iter;
153 __counter[__num_threads] = __i;
158 __begin_output += __counter[__t];
160 _OutputIterator __iter_out = __result + __begin_output;
161 for (_IIter __iter = __first + __begin; __iter < __first + __end;
164 if (!__binary_pred(*__iter, *(__iter - 1)))
165 *__iter_out++ = *__iter;
170 _DifferenceType __end_output = 0;
171 for (
_ThreadIndex __t = 0; __t < __num_threads + 1; __t++)
172 __end_output += __counter[__t];
176 return __result + __end_output;
184 template<
typename _IIter,
class _OutputIterator>
185 inline _OutputIterator
187 _OutputIterator __result)
189 typedef typename std::iterator_traits<_IIter>::value_type