32#ifndef _GLIBCXX_PARALLEL_MERGE_H 
   33#define _GLIBCXX_PARALLEL_MERGE_H 1 
   53  template<
typename _RAIter1, 
typename _RAIter2,
 
   54           typename _OutputIterator, 
typename _DifferenceTp,
 
   58                          _RAIter2& __begin2, _RAIter2 __end2,
 
   59                          _OutputIterator __target,
 
   60                          _DifferenceTp __max_length, _Compare __comp)
 
   62      typedef _DifferenceTp _DifferenceType;
 
   63      while (__begin1 != __end1 && __begin2 != __end2 && __max_length > 0)
 
   66          if (__comp(*__begin2, *__begin1))
 
   67            *__target++ = *__begin2++;
 
   69            *__target++ = *__begin1++;
 
   73      if (__begin1 != __end1)
 
   75          __target = std::copy(__begin1, __begin1 + __max_length, __target);
 
   76          __begin1 += __max_length;
 
   80          __target = std::copy(__begin2, __begin2 + __max_length, __target);
 
   81          __begin2 += __max_length;
 
  101  template<
typename _RAIter1, 
typename _RAIter2,
 
  102           typename _OutputIterator, 
typename _DifferenceTp,
 
  106                         _RAIter2& __begin2, _RAIter2 __end2,
 
  107                         _OutputIterator __target,
 
  108                         _DifferenceTp __max_length, _Compare __comp)
 
  110      typedef _DifferenceTp _DifferenceType;
 
  116#if _GLIBCXX_PARALLEL_ASSERTIONS 
  117      _GLIBCXX_PARALLEL_ASSERT(__max_length >= 0);
 
  120      while (__begin1 != __end1 && __begin2 != __end2 && __max_length > 0)
 
  122          _RAIter1 __next1 = __begin1 + 1;
 
  123          _RAIter2 __next2 = __begin2 + 1;
 
  124          _ValueType1 __element1 = *__begin1;
 
  125          _ValueType2 __element2 = *__begin2;
 
  127          if (__comp(__element2, __element1))
 
  129              __element1 = __element2;
 
  135          *__target = __element1;
 
  140      if (__begin1 != __end1)
 
  142          __target = std::copy(__begin1, __begin1 + __max_length, __target);
 
  143          __begin1 += __max_length;
 
  147          __target = std::copy(__begin2, __begin2 + __max_length, __target);
 
  148          __begin2 += __max_length;
 
  167  template<
typename _RAIter1, 
typename _RAIter2,
 
  168           typename _OutputIterator, 
typename _DifferenceTp,
 
  170    inline _OutputIterator
 
  172                    _RAIter2& __begin2, _RAIter2 __end2,
 
  173                    _OutputIterator __target, _DifferenceTp __max_length,
 
  179                                  __target, __max_length, __comp);
 
  192  template<
typename _RAIter1, 
typename _RAIter2,
 
  193           typename _RAIter3, 
typename _Compare>
 
  199                             _RAIter2 __end2, _RAIter3 __target, 
typename 
  201                             difference_type __max_length, _Compare __comp)
 
  203                             __max_length, __comp); }
 
  220  template<
typename _RAIter1, 
typename _RAIter3,
 
  224                             _RAIter1& __begin2, _RAIter1 __end2,
 
  225                             _RAIter3 __target, 
typename 
  227                             difference_type __max_length, _Compare __comp)
 
  232        difference_type _DifferenceType1 ;
 
  234        difference_type _DifferenceType3;
 
  238      _IteratorPair __seqs[2] = { std::make_pair(__begin1, __end1),
 
  239                                  std::make_pair(__begin2, __end2) };
 
  244         _Compare, _DifferenceType1>, __max_length, __comp,
 
  245         omp_get_max_threads());
 
#define _GLIBCXX_CALL(__n)
Macro to produce log message when entering a function.
Includes the original header files concerned with iterators except for stream iterators....
GNU parallel code for public use.
_OutputIterator __merge_advance(_RAIter1 &__begin1, _RAIter1 __end1, _RAIter2 &__begin2, _RAIter2 __end2, _OutputIterator __target, _DifferenceTp __max_length, _Compare __comp)
Merge routine being able to merge only the __max_length smallest elements.
_RAIter3 parallel_multiway_merge(_RAIterIterator __seqs_begin, _RAIterIterator __seqs_end, _RAIter3 __target, _Splitter __splitter, _DifferenceTp __length, _Compare __comp, _ThreadIndex __num_threads)
Parallel multi-way merge routine.
void multiway_merge_exact_splitting(_RAIterIterator __seqs_begin, _RAIterIterator __seqs_end, _DifferenceType __length, _DifferenceType __total_length, _Compare __comp, std::vector< std::pair< _DifferenceType, _DifferenceType > > *__pieces)
Exact splitting for parallel multiway-merge routine.
_OutputIterator __merge_advance_movc(_RAIter1 &__begin1, _RAIter1 __end1, _RAIter2 &__begin2, _RAIter2 __end2, _OutputIterator __target, _DifferenceTp __max_length, _Compare __comp)
Merge routine being able to merge only the __max_length smallest elements.
_OutputIterator __merge_advance_usual(_RAIter1 &__begin1, _RAIter1 __end1, _RAIter2 &__begin2, _RAIter2 __end2, _OutputIterator __target, _DifferenceTp __max_length, _Compare __comp)
Merge routine being able to merge only the __max_length smallest elements.
_RAIter3 __parallel_merge_advance(_RAIter1 &__begin1, _RAIter1 __end1, _RAIter2 &__begin2, _RAIter2 __end2, _RAIter3 __target, typename std::iterator_traits< _RAIter1 >::difference_type __max_length, _Compare __comp)
Merge routine fallback to sequential in case the iterators of the two input sequences are of differen...
Traits class for iterators.
Struct holding two objects of arbitrary type.
A pair of iterators. The usual iterator operations are applied to both child iterators.