Home | History | Annotate | Download | only in parallel
      1 // -*- C++ -*-
      2 
      3 // Copyright (C) 2007-2013 Free Software Foundation, Inc.
      4 //
      5 // This file is part of the GNU ISO C++ Library.  This library is free
      6 // software; you can redistribute it and/or modify it under the terms
      7 // of the GNU General Public License as published by the Free Software
      8 // Foundation; either version 3, or (at your option) any later
      9 // version.
     10 
     11 // This library is distributed in the hope that it will be useful, but
     12 // WITHOUT ANY WARRANTY; without even the implied warranty of
     13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14 // General Public License for more details.
     15 
     16 // Under Section 7 of GPL version 3, you are granted additional
     17 // permissions described in the GCC Runtime Library Exception, version
     18 // 3.1, as published by the Free Software Foundation.
     19 
     20 // You should have received a copy of the GNU General Public License and
     21 // a copy of the GCC Runtime Library Exception along with this program;
     22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23 // <http://www.gnu.org/licenses/>.
     24 
     25 /** @file parallel/multiway_merge.h
     26 *  @brief Implementation of sequential and parallel multiway merge.
     27 *
     28 *  Explanations on the high-speed merging routines in the appendix of
     29 *
     30 *  P. Sanders.
     31 *  Fast priority queues for cached memory.
     32 *  ACM Journal of Experimental Algorithmics, 5, 2000.
     33 *
     34 *  This file is a GNU parallel extension to the Standard C++ Library.
     35 */
     36 
     37 // Written by Johannes Singler and Manuel Holtgrewe.
     38 
     39 #ifndef _GLIBCXX_PARALLEL_MULTIWAY_MERGE_H
     40 #define _GLIBCXX_PARALLEL_MULTIWAY_MERGE_H
     41 
     42 #include <vector>
     43 
     44 #include <bits/stl_algo.h>
     45 #include <parallel/features.h>
     46 #include <parallel/parallel.h>
     47 #include <parallel/losertree.h>
     48 #include <parallel/multiseq_selection.h>
     49 #if _GLIBCXX_ASSERTIONS
     50 #include <parallel/checkers.h>
     51 #endif
     52 
     53 /** @brief Length of a sequence described by a pair of iterators. */
     54 #define _GLIBCXX_PARALLEL_LENGTH(__s) ((__s).second - (__s).first)
     55 
     56 namespace __gnu_parallel
     57 {
     58   template<typename _RAIter1, typename _RAIter2, typename _OutputIterator,
     59 	   typename _DifferenceTp, typename _Compare>
     60     _OutputIterator
     61     __merge_advance(_RAIter1&, _RAIter1, _RAIter2&, _RAIter2,
     62 		    _OutputIterator, _DifferenceTp, _Compare);
     63 
     64   /** @brief _Iterator wrapper supporting an implicit supremum at the end
     65    *         of the sequence, dominating all comparisons.
     66    *
     67    * The implicit supremum comes with a performance cost.
     68    *
     69    * Deriving from _RAIter is not possible since
     70    * _RAIter need not be a class.
     71    */
     72   template<typename _RAIter, typename _Compare>
     73     class _GuardedIterator
     74     {
     75     private:
     76       /** @brief Current iterator __position. */
     77       _RAIter _M_current;
     78 
     79       /** @brief End iterator of the sequence. */
     80       _RAIter _M_end;
     81 
     82       /** @brief _Compare. */
     83       _Compare& __comp;
     84 
     85     public:
     86       /** @brief Constructor. Sets iterator to beginning of sequence.
     87       *  @param __begin Begin iterator of sequence.
     88       *  @param __end End iterator of sequence.
     89       *  @param __comp Comparator provided for associated overloaded
     90       *  compare operators. */
     91       _GuardedIterator(_RAIter __begin, _RAIter __end, _Compare& __comp)
     92       : _M_current(__begin), _M_end(__end), __comp(__comp)
     93       { }
     94 
     95       /** @brief Pre-increment operator.
     96       *  @return This. */
     97       _GuardedIterator<_RAIter, _Compare>&
     98       operator++()
     99       {
    100 	++_M_current;
    101 	return *this;
    102       }
    103 
    104       /** @brief Dereference operator.
    105       *  @return Referenced element. */
    106       typename std::iterator_traits<_RAIter>::value_type&
    107       operator*()
    108       { return *_M_current; }
    109 
    110       /** @brief Convert to wrapped iterator.
    111       *  @return Wrapped iterator. */
    112       operator _RAIter()
    113       { return _M_current; }
    114 
    115       /** @brief Compare two elements referenced by guarded iterators.
    116        *  @param __bi1 First iterator.
    117        *  @param __bi2 Second iterator.
    118        *  @return @c true if less. */
    119       friend bool
    120       operator<(_GuardedIterator<_RAIter, _Compare>& __bi1,
    121 		_GuardedIterator<_RAIter, _Compare>& __bi2)
    122       {
    123 	if (__bi1._M_current == __bi1._M_end)       // __bi1 is sup
    124 	  return __bi2._M_current == __bi2._M_end;  // __bi2 is not sup
    125 	if (__bi2._M_current == __bi2._M_end)       // __bi2 is sup
    126 	  return true;
    127 	return (__bi1.__comp)(*__bi1, *__bi2);      // normal compare
    128       }
    129 
    130       /** @brief Compare two elements referenced by guarded iterators.
    131        *  @param __bi1 First iterator.
    132        *  @param __bi2 Second iterator.
    133        *  @return @c True if less equal. */
    134       friend bool
    135       operator<=(_GuardedIterator<_RAIter, _Compare>& __bi1,
    136 		 _GuardedIterator<_RAIter, _Compare>& __bi2)
    137       {
    138 	if (__bi2._M_current == __bi2._M_end)       // __bi1 is sup
    139 	  return __bi1._M_current != __bi1._M_end;  // __bi2 is not sup
    140 	if (__bi1._M_current == __bi1._M_end)       // __bi2 is sup
    141 	  return false;
    142 	return !(__bi1.__comp)(*__bi2, *__bi1);     // normal compare
    143       }
    144     };
    145 
    146   template<typename _RAIter, typename _Compare>
    147     class _UnguardedIterator
    148     {
    149     private:
    150       /** @brief Current iterator __position. */
    151       _RAIter _M_current;
    152       /** @brief _Compare. */
    153       _Compare& __comp;
    154 
    155     public:
    156       /** @brief Constructor. Sets iterator to beginning of sequence.
    157       *  @param __begin Begin iterator of sequence.
    158       *  @param __end Unused, only for compatibility.
    159       *  @param __comp Unused, only for compatibility. */
    160       _UnguardedIterator(_RAIter __begin,
    161                 	 _RAIter /* __end */, _Compare& __comp)
    162       : _M_current(__begin), __comp(__comp)
    163       { }
    164 
    165       /** @brief Pre-increment operator.
    166       *  @return This. */
    167       _UnguardedIterator<_RAIter, _Compare>&
    168       operator++()
    169       {
    170 	++_M_current;
    171 	return *this;
    172       }
    173 
    174       /** @brief Dereference operator.
    175       *  @return Referenced element. */
    176       typename std::iterator_traits<_RAIter>::value_type&
    177       operator*()
    178       { return *_M_current; }
    179 
    180       /** @brief Convert to wrapped iterator.
    181       *  @return Wrapped iterator. */
    182       operator _RAIter()
    183       { return _M_current; }
    184 
    185       /** @brief Compare two elements referenced by unguarded iterators.
    186        *  @param __bi1 First iterator.
    187        *  @param __bi2 Second iterator.
    188        *  @return @c true if less. */
    189       friend bool
    190       operator<(_UnguardedIterator<_RAIter, _Compare>& __bi1,
    191 		_UnguardedIterator<_RAIter, _Compare>& __bi2)
    192       {
    193 	// Normal compare.
    194 	return (__bi1.__comp)(*__bi1, *__bi2);
    195       }
    196 
    197       /** @brief Compare two elements referenced by unguarded iterators.
    198        *  @param __bi1 First iterator.
    199        *  @param __bi2 Second iterator.
    200        *  @return @c True if less equal. */
    201       friend bool
    202       operator<=(_UnguardedIterator<_RAIter, _Compare>& __bi1,
    203 		 _UnguardedIterator<_RAIter, _Compare>& __bi2)
    204       {
    205 	// Normal compare.
    206 	return !(__bi1.__comp)(*__bi2, *__bi1);
    207       }
    208     };
    209 
    210   /** @brief Highly efficient 3-way merging procedure.
    211    *
    212    * Merging is done with the algorithm implementation described by Peter
    213    * Sanders.  Basically, the idea is to minimize the number of necessary
    214    * comparison after merging an element.  The implementation trick
    215    * that makes this fast is that the order of the sequences is stored
    216    * in the instruction pointer (translated into labels in C++).
    217    *
    218    * This works well for merging up to 4 sequences.
    219    *
    220    * Note that making the merging stable does @a not come at a
    221    * performance hit.
    222    *
    223    * Whether the merging is done guarded or unguarded is selected by the
    224    * used iterator class.
    225    *
    226    * @param __seqs_begin Begin iterator of iterator pair input sequence.
    227    * @param __seqs_end End iterator of iterator pair input sequence.
    228    * @param __target Begin iterator of output sequence.
    229    * @param __comp Comparator.
    230    * @param __length Maximum length to merge, less equal than the
    231    * total number of elements available.
    232    *
    233    * @return End iterator of output sequence.
    234    */
    235   template<template<typename RAI, typename C> class iterator,
    236            typename _RAIterIterator,
    237            typename _RAIter3,
    238            typename _DifferenceTp,
    239            typename _Compare>
    240     _RAIter3
    241     multiway_merge_3_variant(_RAIterIterator __seqs_begin,
    242 			     _RAIterIterator __seqs_end,
    243 			     _RAIter3 __target,
    244 			     _DifferenceTp __length, _Compare __comp)
    245     {
    246       _GLIBCXX_CALL(__length);
    247 
    248       typedef _DifferenceTp _DifferenceType;
    249 
    250       typedef typename std::iterator_traits<_RAIterIterator>
    251 	::value_type::first_type
    252 	_RAIter1;
    253       typedef typename std::iterator_traits<_RAIter1>::value_type
    254 	_ValueType;
    255 
    256       if (__length == 0)
    257 	return __target;
    258 
    259 #if _GLIBCXX_ASSERTIONS
    260       _DifferenceTp __orig_length = __length;
    261 #endif
    262 
    263       iterator<_RAIter1, _Compare>
    264 	__seq0(__seqs_begin[0].first, __seqs_begin[0].second, __comp),
    265 	__seq1(__seqs_begin[1].first, __seqs_begin[1].second, __comp),
    266 	__seq2(__seqs_begin[2].first, __seqs_begin[2].second, __comp);
    267 
    268       if (__seq0 <= __seq1)
    269 	{
    270           if (__seq1 <= __seq2)
    271             goto __s012;
    272           else
    273             if (__seq2 <  __seq0)
    274               goto __s201;
    275             else
    276               goto __s021;
    277 	}
    278       else
    279 	{
    280           if (__seq1 <= __seq2)
    281             {
    282               if (__seq0 <= __seq2)
    283         	goto __s102;
    284               else
    285         	goto __s120;
    286             }
    287           else
    288             goto __s210;
    289 	}
    290 #define _GLIBCXX_PARALLEL_MERGE_3_CASE(__a, __b, __c, __c0, __c1) \
    291       __s ## __a ## __b ## __c :                            \
    292 	*__target = *__seq ## __a;                          \
    293 	++__target;                                         \
    294 	--__length;                                         \
    295 	++__seq ## __a;                                     \
    296 	if (__length == 0) goto __finish;                   \
    297 	if (__seq ## __a __c0 __seq ## __b) goto __s ## __a ## __b ## __c; \
    298 	if (__seq ## __a __c1 __seq ## __c) goto __s ## __b ## __a ## __c; \
    299 	goto __s ## __b ## __c ## __a;
    300 
    301       _GLIBCXX_PARALLEL_MERGE_3_CASE(0, 1, 2, <=, <=);
    302       _GLIBCXX_PARALLEL_MERGE_3_CASE(1, 2, 0, <=, < );
    303       _GLIBCXX_PARALLEL_MERGE_3_CASE(2, 0, 1, < , < );
    304       _GLIBCXX_PARALLEL_MERGE_3_CASE(1, 0, 2, < , <=);
    305       _GLIBCXX_PARALLEL_MERGE_3_CASE(0, 2, 1, <=, <=);
    306       _GLIBCXX_PARALLEL_MERGE_3_CASE(2, 1, 0, < , < );
    307 
    308 #undef _GLIBCXX_PARALLEL_MERGE_3_CASE
    309 
    310     __finish:
    311       ;
    312 
    313 #if _GLIBCXX_ASSERTIONS
    314     _GLIBCXX_PARALLEL_ASSERT(
    315 	((_RAIter1)__seq0 - __seqs_begin[0].first) +
    316 	((_RAIter1)__seq1 - __seqs_begin[1].first) +
    317 	((_RAIter1)__seq2 - __seqs_begin[2].first)
    318 	== __orig_length);
    319 #endif
    320 
    321       __seqs_begin[0].first = __seq0;
    322       __seqs_begin[1].first = __seq1;
    323       __seqs_begin[2].first = __seq2;
    324 
    325       return __target;
    326     }
    327 
    328   /**
    329    * @brief Highly efficient 4-way merging procedure.
    330    *
    331    * Merging is done with the algorithm implementation described by Peter
    332    * Sanders. Basically, the idea is to minimize the number of necessary
    333    * comparison after merging an element.  The implementation trick
    334    * that makes this fast is that the order of the sequences is stored
    335    * in the instruction pointer (translated into goto labels in C++).
    336    *
    337    * This works well for merging up to 4 sequences.
    338    *
    339    * Note that making the merging stable does @a not come at a
    340    * performance hit.
    341    *
    342    * Whether the merging is done guarded or unguarded is selected by the
    343    * used iterator class.
    344    *
    345    * @param __seqs_begin Begin iterator of iterator pair input sequence.
    346    * @param __seqs_end End iterator of iterator pair input sequence.
    347    * @param __target Begin iterator of output sequence.
    348    * @param __comp Comparator.
    349    * @param __length Maximum length to merge, less equal than the
    350    * total number of elements available.
    351    *
    352    * @return End iterator of output sequence.
    353    */
    354   template<template<typename RAI, typename C> class iterator,
    355            typename _RAIterIterator,
    356            typename _RAIter3,
    357            typename _DifferenceTp,
    358            typename _Compare>
    359     _RAIter3
    360     multiway_merge_4_variant(_RAIterIterator __seqs_begin,
    361                              _RAIterIterator __seqs_end,
    362                              _RAIter3 __target,
    363                              _DifferenceTp __length, _Compare __comp)
    364     {
    365       _GLIBCXX_CALL(__length);
    366       typedef _DifferenceTp _DifferenceType;
    367 
    368       typedef typename std::iterator_traits<_RAIterIterator>
    369 	::value_type::first_type
    370 	_RAIter1;
    371       typedef typename std::iterator_traits<_RAIter1>::value_type
    372 	_ValueType;
    373 
    374       iterator<_RAIter1, _Compare>
    375 	__seq0(__seqs_begin[0].first, __seqs_begin[0].second, __comp),
    376 	__seq1(__seqs_begin[1].first, __seqs_begin[1].second, __comp),
    377 	__seq2(__seqs_begin[2].first, __seqs_begin[2].second, __comp),
    378 	__seq3(__seqs_begin[3].first, __seqs_begin[3].second, __comp);
    379 
    380 #define _GLIBCXX_PARALLEL_DECISION(__a, __b, __c, __d) {  \
    381 	if (__seq ## __d < __seq ## __a)		  \
    382 	  goto __s ## __d ## __a ## __b ## __c;		  \
    383 	if (__seq ## __d < __seq ## __b)		  \
    384 	  goto __s ## __a ## __d ## __b ## __c;		  \
    385 	if (__seq ## __d < __seq ## __c)		  \
    386 	  goto __s ## __a ## __b ## __d ## __c;		  \
    387 	goto __s ## __a ## __b ## __c ## __d;  }
    388 
    389       if (__seq0 <= __seq1)
    390 	{
    391           if (__seq1 <= __seq2)
    392             _GLIBCXX_PARALLEL_DECISION(0,1,2,3)
    393             else
    394               if (__seq2 < __seq0)
    395         	_GLIBCXX_PARALLEL_DECISION(2,0,1,3)
    396         	else
    397                   _GLIBCXX_PARALLEL_DECISION(0,2,1,3)
    398                     }
    399       else
    400 	{
    401           if (__seq1 <= __seq2)
    402             {
    403               if (__seq0 <= __seq2)
    404         	_GLIBCXX_PARALLEL_DECISION(1,0,2,3)
    405         	else
    406                   _GLIBCXX_PARALLEL_DECISION(1,2,0,3)
    407                     }
    408           else
    409             _GLIBCXX_PARALLEL_DECISION(2,1,0,3)
    410               }
    411 
    412 #define _GLIBCXX_PARALLEL_MERGE_4_CASE(__a, __b, __c, __d,  \
    413 				       __c0, __c1, __c2)    \
    414       __s ## __a ## __b ## __c ## __d:                      \
    415       if (__length == 0) goto __finish;                     \
    416       *__target = *__seq ## __a;                            \
    417       ++__target;                                           \
    418       --__length;                                           \
    419       ++__seq ## __a;                                       \
    420       if (__seq ## __a __c0 __seq ## __b)      \
    421 	goto __s ## __a ## __b ## __c ## __d;  \
    422       if (__seq ## __a __c1 __seq ## __c)      \
    423 	goto __s ## __b ## __a ## __c ## __d;  \
    424       if (__seq ## __a __c2 __seq ## __d)      \
    425 	goto __s ## __b ## __c ## __a ## __d;  \
    426       goto __s ## __b ## __c ## __d ## __a;
    427 
    428       _GLIBCXX_PARALLEL_MERGE_4_CASE(0, 1, 2, 3, <=, <=, <=);
    429       _GLIBCXX_PARALLEL_MERGE_4_CASE(0, 1, 3, 2, <=, <=, <=);
    430       _GLIBCXX_PARALLEL_MERGE_4_CASE(0, 2, 1, 3, <=, <=, <=);
    431       _GLIBCXX_PARALLEL_MERGE_4_CASE(0, 2, 3, 1, <=, <=, <=);
    432       _GLIBCXX_PARALLEL_MERGE_4_CASE(0, 3, 1, 2, <=, <=, <=);
    433       _GLIBCXX_PARALLEL_MERGE_4_CASE(0, 3, 2, 1, <=, <=, <=);
    434       _GLIBCXX_PARALLEL_MERGE_4_CASE(1, 0, 2, 3, < , <=, <=);
    435       _GLIBCXX_PARALLEL_MERGE_4_CASE(1, 0, 3, 2, < , <=, <=);
    436       _GLIBCXX_PARALLEL_MERGE_4_CASE(1, 2, 0, 3, <=, < , <=);
    437       _GLIBCXX_PARALLEL_MERGE_4_CASE(1, 2, 3, 0, <=, <=, < );
    438       _GLIBCXX_PARALLEL_MERGE_4_CASE(1, 3, 0, 2, <=, < , <=);
    439       _GLIBCXX_PARALLEL_MERGE_4_CASE(1, 3, 2, 0, <=, <=, < );
    440       _GLIBCXX_PARALLEL_MERGE_4_CASE(2, 0, 1, 3, < , < , <=);
    441       _GLIBCXX_PARALLEL_MERGE_4_CASE(2, 0, 3, 1, < , <=, < );
    442       _GLIBCXX_PARALLEL_MERGE_4_CASE(2, 1, 0, 3, < , < , <=);
    443       _GLIBCXX_PARALLEL_MERGE_4_CASE(2, 1, 3, 0, < , <=, < );
    444       _GLIBCXX_PARALLEL_MERGE_4_CASE(2, 3, 0, 1, <=, < , < );
    445       _GLIBCXX_PARALLEL_MERGE_4_CASE(2, 3, 1, 0, <=, < , < );
    446       _GLIBCXX_PARALLEL_MERGE_4_CASE(3, 0, 1, 2, < , < , < );
    447       _GLIBCXX_PARALLEL_MERGE_4_CASE(3, 0, 2, 1, < , < , < );
    448       _GLIBCXX_PARALLEL_MERGE_4_CASE(3, 1, 0, 2, < , < , < );
    449       _GLIBCXX_PARALLEL_MERGE_4_CASE(3, 1, 2, 0, < , < , < );
    450       _GLIBCXX_PARALLEL_MERGE_4_CASE(3, 2, 0, 1, < , < , < );
    451       _GLIBCXX_PARALLEL_MERGE_4_CASE(3, 2, 1, 0, < , < , < );
    452 
    453 #undef _GLIBCXX_PARALLEL_MERGE_4_CASE
    454 #undef _GLIBCXX_PARALLEL_DECISION
    455 
    456     __finish:
    457       ;
    458 
    459       __seqs_begin[0].first = __seq0;
    460       __seqs_begin[1].first = __seq1;
    461       __seqs_begin[2].first = __seq2;
    462       __seqs_begin[3].first = __seq3;
    463 
    464       return __target;
    465     }
    466 
    467   /** @brief Multi-way merging procedure for a high branching factor,
    468    *         guarded case.
    469    *
    470    * This merging variant uses a LoserTree class as selected by <tt>_LT</tt>.
    471    *
    472    * Stability is selected through the used LoserTree class <tt>_LT</tt>.
    473    *
    474    * At least one non-empty sequence is required.
    475    *
    476    * @param __seqs_begin Begin iterator of iterator pair input sequence.
    477    * @param __seqs_end End iterator of iterator pair input sequence.
    478    * @param __target Begin iterator of output sequence.
    479    * @param __comp Comparator.
    480    * @param __length Maximum length to merge, less equal than the
    481    * total number of elements available.
    482    *
    483    * @return End iterator of output sequence.
    484    */
    485   template<typename _LT,
    486            typename _RAIterIterator,
    487            typename _RAIter3,
    488            typename _DifferenceTp,
    489            typename _Compare>
    490     _RAIter3
    491     multiway_merge_loser_tree(_RAIterIterator __seqs_begin,
    492                               _RAIterIterator __seqs_end,
    493                               _RAIter3 __target,
    494                               _DifferenceTp __length, _Compare __comp)
    495     {
    496       _GLIBCXX_CALL(__length)
    497 
    498       typedef _DifferenceTp _DifferenceType;
    499       typedef typename std::iterator_traits<_RAIterIterator>
    500 	::difference_type _SeqNumber;
    501       typedef typename std::iterator_traits<_RAIterIterator>
    502 	::value_type::first_type
    503 	_RAIter1;
    504       typedef typename std::iterator_traits<_RAIter1>::value_type
    505 	_ValueType;
    506 
    507       _SeqNumber __k = static_cast<_SeqNumber>(__seqs_end - __seqs_begin);
    508 
    509       _LT __lt(__k, __comp);
    510 
    511       // Default value for potentially non-default-constructible types.
    512       _ValueType* __arbitrary_element = 0;
    513 
    514       for (_SeqNumber __t = 0; __t < __k; ++__t)
    515 	{
    516           if(!__arbitrary_element
    517 	     && _GLIBCXX_PARALLEL_LENGTH(__seqs_begin[__t]) > 0)
    518             __arbitrary_element = &(*__seqs_begin[__t].first);
    519 	}
    520 
    521       for (_SeqNumber __t = 0; __t < __k; ++__t)
    522 	{
    523           if (__seqs_begin[__t].first == __seqs_begin[__t].second)
    524             __lt.__insert_start(*__arbitrary_element, __t, true);
    525           else
    526             __lt.__insert_start(*__seqs_begin[__t].first, __t, false);
    527 	}
    528 
    529       __lt.__init();
    530 
    531       _SeqNumber __source;
    532 
    533       for (_DifferenceType __i = 0; __i < __length; ++__i)
    534 	{
    535           //take out
    536           __source = __lt.__get_min_source();
    537 
    538           *(__target++) = *(__seqs_begin[__source].first++);
    539 
    540           // Feed.
    541           if (__seqs_begin[__source].first == __seqs_begin[__source].second)
    542             __lt.__delete_min_insert(*__arbitrary_element, true);
    543           else
    544             // Replace from same __source.
    545             __lt.__delete_min_insert(*__seqs_begin[__source].first, false);
    546 	}
    547 
    548       return __target;
    549     }
    550 
    551   /** @brief Multi-way merging procedure for a high branching factor,
    552    *         unguarded case.
    553    *
    554    * Merging is done using the LoserTree class <tt>_LT</tt>.
    555    *
    556    * Stability is selected by the used LoserTrees.
    557    *
    558    * @pre No input will run out of elements during the merge.
    559    *
    560    * @param __seqs_begin Begin iterator of iterator pair input sequence.
    561    * @param __seqs_end End iterator of iterator pair input sequence.
    562    * @param __target Begin iterator of output sequence.
    563    * @param __comp Comparator.
    564    * @param __length Maximum length to merge, less equal than the
    565    * total number of elements available.
    566    *
    567    * @return End iterator of output sequence.
    568    */
    569   template<typename _LT,
    570 	   typename _RAIterIterator,
    571 	   typename _RAIter3,
    572 	   typename _DifferenceTp, typename _Compare>
    573     _RAIter3
    574     multiway_merge_loser_tree_unguarded(_RAIterIterator __seqs_begin,
    575 					_RAIterIterator __seqs_end,
    576 					_RAIter3 __target,
    577        const typename std::iterator_traits<typename std::iterator_traits<
    578 	  _RAIterIterator>::value_type::first_type>::value_type&
    579 					__sentinel,
    580 					_DifferenceTp __length,
    581 					_Compare __comp)
    582     {
    583       _GLIBCXX_CALL(__length)
    584       typedef _DifferenceTp _DifferenceType;
    585 
    586       typedef typename std::iterator_traits<_RAIterIterator>
    587 	::difference_type _SeqNumber;
    588       typedef typename std::iterator_traits<_RAIterIterator>
    589 	::value_type::first_type
    590 	_RAIter1;
    591       typedef typename std::iterator_traits<_RAIter1>::value_type
    592 	_ValueType;
    593 
    594       _SeqNumber __k = __seqs_end - __seqs_begin;
    595 
    596       _LT __lt(__k, __sentinel, __comp);
    597 
    598       for (_SeqNumber __t = 0; __t < __k; ++__t)
    599 	{
    600 #if _GLIBCXX_ASSERTIONS
    601           _GLIBCXX_PARALLEL_ASSERT(__seqs_begin[__t].first
    602                                    != __seqs_begin[__t].second);
    603 #endif
    604           __lt.__insert_start(*__seqs_begin[__t].first, __t, false);
    605 	}
    606 
    607       __lt.__init();
    608 
    609       _SeqNumber __source;
    610 
    611 #if _GLIBCXX_ASSERTIONS
    612       _DifferenceType __i = 0;
    613 #endif
    614 
    615       _RAIter3 __target_end = __target + __length;
    616       while (__target < __target_end)
    617 	{
    618           // Take out.
    619           __source = __lt.__get_min_source();
    620 
    621 #if _GLIBCXX_ASSERTIONS
    622           _GLIBCXX_PARALLEL_ASSERT(0 <= __source && __source < __k);
    623           _GLIBCXX_PARALLEL_ASSERT(__i == 0
    624               || !__comp(*(__seqs_begin[__source].first), *(__target - 1)));
    625 #endif
    626 
    627           // Feed.
    628           *(__target++) = *(__seqs_begin[__source].first++);
    629 
    630 #if _GLIBCXX_ASSERTIONS
    631           ++__i;
    632 #endif
    633           // Replace from same __source.
    634           __lt.__delete_min_insert(*__seqs_begin[__source].first, false);
    635 	}
    636 
    637       return __target;
    638     }
    639 
    640 
    641   /** @brief Multi-way merging procedure for a high branching factor,
    642    *         requiring sentinels to exist.
    643    *
    644    * @tparam UnguardedLoserTree _Loser Tree variant to use for the unguarded
    645    *   merging.
    646    *
    647    * @param __seqs_begin Begin iterator of iterator pair input sequence.
    648    * @param __seqs_end End iterator of iterator pair input sequence.
    649    * @param __target Begin iterator of output sequence.
    650    * @param __comp Comparator.
    651    * @param __length Maximum length to merge, less equal than the
    652    * total number of elements available.
    653    *
    654    * @return End iterator of output sequence.
    655    */
    656   template<typename UnguardedLoserTree,
    657 	   typename _RAIterIterator,
    658 	   typename _RAIter3,
    659 	   typename _DifferenceTp,
    660 	   typename _Compare>
    661     _RAIter3
    662     multiway_merge_loser_tree_sentinel(_RAIterIterator __seqs_begin,
    663 				       _RAIterIterator __seqs_end,
    664 				       _RAIter3 __target,
    665       const typename std::iterator_traits<typename std::iterator_traits<
    666 	_RAIterIterator>::value_type::first_type>::value_type&
    667 				       __sentinel,
    668 				       _DifferenceTp __length,
    669 				       _Compare __comp)
    670     {
    671       _GLIBCXX_CALL(__length)
    672 
    673       typedef _DifferenceTp _DifferenceType;
    674       typedef std::iterator_traits<_RAIterIterator> _TraitsType;
    675       typedef typename std::iterator_traits<_RAIterIterator>
    676 	::value_type::first_type
    677 	_RAIter1;
    678       typedef typename std::iterator_traits<_RAIter1>::value_type
    679 	_ValueType;
    680 
    681       _RAIter3 __target_end;
    682 
    683       for (_RAIterIterator __s = __seqs_begin; __s != __seqs_end; ++__s)
    684 	// Move the sequence ends to the sentinel.  This has the
    685 	// effect that the sentinel appears to be within the sequence. Then,
    686 	// we can use the unguarded variant if we merge out as many
    687 	// non-sentinel elements as we have.
    688 	++((*__s).second);
    689 
    690       __target_end = multiway_merge_loser_tree_unguarded<UnguardedLoserTree>
    691 	(__seqs_begin, __seqs_end, __target, __sentinel, __length, __comp);
    692 
    693 #if _GLIBCXX_ASSERTIONS
    694       _GLIBCXX_PARALLEL_ASSERT(__target_end == __target + __length);
    695       _GLIBCXX_PARALLEL_ASSERT(__is_sorted(__target, __target_end, __comp));
    696 #endif
    697 
    698       // Restore the sequence ends so the sentinels are not contained in the
    699       // sequence any more (see comment in loop above).
    700       for (_RAIterIterator __s = __seqs_begin; __s != __seqs_end; ++__s)
    701 	--((*__s).second);
    702 
    703       return __target_end;
    704     }
    705 
    706   /**
    707    * @brief Traits for determining whether the loser tree should
    708    *   use pointers or copies.
    709    *
    710    * The field "_M_use_pointer" is used to determine whether to use pointers
    711    * in he loser trees or whether to copy the values into the loser tree.
    712    *
    713    * The default behavior is to use pointers if the data type is 4 times as
    714    * big as the pointer to it.
    715    *
    716    * Specialize for your data type to customize the behavior.
    717    *
    718    * Example:
    719    *
    720    *   template<>
    721    *   struct _LoserTreeTraits<int>
    722    *   { static const bool _M_use_pointer = false; };
    723    *
    724    *   template<>
    725    *   struct _LoserTreeTraits<heavyweight_type>
    726    *   { static const bool _M_use_pointer = true; };
    727    *
    728    * @param _Tp type to give the loser tree traits for.
    729    */
    730   template <typename _Tp>
    731     struct _LoserTreeTraits
    732     {
    733       /**
    734        * @brief True iff to use pointers instead of values in loser trees.
    735        *
    736        * The default behavior is to use pointers if the data type is four
    737        * times as big as the pointer to it.
    738        */
    739       static const bool _M_use_pointer = (sizeof(_Tp) > 4 * sizeof(_Tp*));
    740     };
    741 
    742   /**
    743    * @brief Switch for 3-way merging with __sentinels turned off.
    744    *
    745    * Note that 3-way merging is always stable!
    746    */
    747   template<bool __sentinels /*default == false*/,
    748 	   typename _RAIterIterator,
    749 	   typename _RAIter3,
    750 	   typename _DifferenceTp,
    751 	   typename _Compare>
    752     struct __multiway_merge_3_variant_sentinel_switch
    753     {
    754       _RAIter3
    755       operator()(_RAIterIterator __seqs_begin,
    756 		 _RAIterIterator __seqs_end,
    757 		 _RAIter3 __target,
    758 		 _DifferenceTp __length, _Compare __comp)
    759       { return multiway_merge_3_variant<_GuardedIterator>
    760 	  (__seqs_begin, __seqs_end, __target, __length, __comp); }
    761     };
    762 
    763   /**
    764    * @brief Switch for 3-way merging with __sentinels turned on.
    765    *
    766    * Note that 3-way merging is always stable!
    767    */
    768   template<typename _RAIterIterator,
    769 	   typename _RAIter3,
    770 	   typename _DifferenceTp,
    771 	   typename _Compare>
    772     struct __multiway_merge_3_variant_sentinel_switch<true, _RAIterIterator,
    773 						      _RAIter3, _DifferenceTp,
    774 						      _Compare>
    775     {
    776       _RAIter3
    777       operator()(_RAIterIterator __seqs_begin,
    778 		 _RAIterIterator __seqs_end,
    779 		 _RAIter3 __target,
    780 		 _DifferenceTp __length, _Compare __comp)
    781       { return multiway_merge_3_variant<_UnguardedIterator>
    782 	  (__seqs_begin, __seqs_end, __target, __length, __comp); }
    783     };
    784 
    785   /**
    786    * @brief Switch for 4-way merging with __sentinels turned off.
    787    *
    788    * Note that 4-way merging is always stable!
    789    */
    790   template<bool __sentinels /*default == false*/,
    791 	   typename _RAIterIterator,
    792 	   typename _RAIter3,
    793 	   typename _DifferenceTp,
    794 	   typename _Compare>
    795     struct __multiway_merge_4_variant_sentinel_switch
    796     {
    797       _RAIter3
    798       operator()(_RAIterIterator __seqs_begin,
    799 		 _RAIterIterator __seqs_end,
    800 		 _RAIter3 __target,
    801 		 _DifferenceTp __length, _Compare __comp)
    802       { return multiway_merge_4_variant<_GuardedIterator>
    803 	  (__seqs_begin, __seqs_end, __target, __length, __comp); }
    804     };
    805 
    806   /**
    807    * @brief Switch for 4-way merging with __sentinels turned on.
    808    *
    809    * Note that 4-way merging is always stable!
    810    */
    811   template<typename _RAIterIterator,
    812 	   typename _RAIter3,
    813 	   typename _DifferenceTp,
    814 	   typename _Compare>
    815     struct __multiway_merge_4_variant_sentinel_switch<true, _RAIterIterator,
    816 						      _RAIter3, _DifferenceTp,
    817 						      _Compare>
    818     {
    819       _RAIter3
    820       operator()(_RAIterIterator __seqs_begin,
    821 		 _RAIterIterator __seqs_end,
    822 		 _RAIter3 __target,
    823 		 _DifferenceTp __length, _Compare __comp)
    824       { return multiway_merge_4_variant<_UnguardedIterator>
    825 	  (__seqs_begin, __seqs_end, __target, __length, __comp); }
    826     };
    827 
    828   /**
    829    * @brief Switch for k-way merging with __sentinels turned on.
    830    */
    831   template<bool __sentinels,
    832 	   bool __stable,
    833 	   typename _RAIterIterator,
    834 	   typename _RAIter3,
    835 	   typename _DifferenceTp,
    836 	   typename _Compare>
    837     struct __multiway_merge_k_variant_sentinel_switch
    838     {
    839       _RAIter3
    840       operator()(_RAIterIterator __seqs_begin,
    841 		 _RAIterIterator __seqs_end,
    842 		 _RAIter3 __target,
    843       const typename std::iterator_traits<typename std::iterator_traits<
    844       _RAIterIterator>::value_type::first_type>::value_type&
    845 		 __sentinel,
    846 		 _DifferenceTp __length, _Compare __comp)
    847       {
    848 	typedef typename std::iterator_traits<_RAIterIterator>
    849 	  ::value_type::first_type
    850 	  _RAIter1;
    851 	typedef typename std::iterator_traits<_RAIter1>::value_type
    852 	  _ValueType;
    853 
    854 	return multiway_merge_loser_tree_sentinel<
    855 	typename __gnu_cxx::__conditional_type<
    856 	_LoserTreeTraits<_ValueType>::_M_use_pointer,
    857 	  _LoserTreePointerUnguarded<__stable, _ValueType, _Compare>,
    858 	  _LoserTreeUnguarded<__stable, _ValueType, _Compare>
    859           >::__type>
    860 	  (__seqs_begin, __seqs_end, __target, __sentinel, __length, __comp);
    861       }
    862     };
    863 
    864   /**
    865    * @brief Switch for k-way merging with __sentinels turned off.
    866    */
    867   template<bool __stable,
    868 	   typename _RAIterIterator,
    869 	   typename _RAIter3,
    870 	   typename _DifferenceTp,
    871 	   typename _Compare>
    872     struct __multiway_merge_k_variant_sentinel_switch<false, __stable,
    873 						      _RAIterIterator,
    874 						      _RAIter3, _DifferenceTp,
    875 						      _Compare>
    876     {
    877       _RAIter3
    878       operator()(_RAIterIterator __seqs_begin,
    879 		 _RAIterIterator __seqs_end,
    880 		 _RAIter3 __target,
    881        const typename std::iterator_traits<typename std::iterator_traits<
    882        _RAIterIterator>::value_type::first_type>::value_type&
    883 		 __sentinel,
    884 		 _DifferenceTp __length, _Compare __comp)
    885       {
    886 	typedef typename std::iterator_traits<_RAIterIterator>
    887 	  ::value_type::first_type
    888 	  _RAIter1;
    889 	typedef typename std::iterator_traits<_RAIter1>::value_type
    890 	  _ValueType;
    891 
    892 	return multiway_merge_loser_tree<
    893 	typename __gnu_cxx::__conditional_type<
    894 	_LoserTreeTraits<_ValueType>::_M_use_pointer,
    895 	  _LoserTreePointer<__stable, _ValueType, _Compare>,
    896 	  _LoserTree<__stable, _ValueType, _Compare>
    897           >::__type >(__seqs_begin, __seqs_end, __target, __length, __comp);
    898       }
    899     };
    900 
    901   /** @brief Sequential multi-way merging switch.
    902    *
    903    *  The _GLIBCXX_PARALLEL_DECISION is based on the branching factor and
    904    *  runtime settings.
    905    *  @param __seqs_begin Begin iterator of iterator pair input sequence.
    906    *  @param __seqs_end End iterator of iterator pair input sequence.
    907    *  @param __target Begin iterator of output sequence.
    908    *  @param __comp Comparator.
    909    *  @param __length Maximum length to merge, possibly larger than the
    910    *  number of elements available.
    911    *  @param __sentinel The sequences have __a __sentinel element.
    912    *  @return End iterator of output sequence. */
    913   template<bool __stable,
    914 	   bool __sentinels,
    915 	   typename _RAIterIterator,
    916 	   typename _RAIter3,
    917 	   typename _DifferenceTp,
    918 	   typename _Compare>
    919     _RAIter3
    920     __sequential_multiway_merge(_RAIterIterator __seqs_begin,
    921 				_RAIterIterator __seqs_end,
    922 				_RAIter3 __target,
    923       const typename std::iterator_traits<typename std::iterator_traits<
    924 	_RAIterIterator>::value_type::first_type>::value_type&
    925 				__sentinel,
    926 				_DifferenceTp __length, _Compare __comp)
    927     {
    928       _GLIBCXX_CALL(__length)
    929 
    930       typedef _DifferenceTp _DifferenceType;
    931       typedef typename std::iterator_traits<_RAIterIterator>
    932 	::difference_type _SeqNumber;
    933       typedef typename std::iterator_traits<_RAIterIterator>
    934 	::value_type::first_type
    935 	_RAIter1;
    936       typedef typename std::iterator_traits<_RAIter1>::value_type
    937 	_ValueType;
    938 
    939 #if _GLIBCXX_ASSERTIONS
    940       for (_RAIterIterator __s = __seqs_begin; __s != __seqs_end; ++__s)
    941 	{
    942           _GLIBCXX_PARALLEL_ASSERT(__is_sorted((*__s).first,
    943 					       (*__s).second, __comp));
    944 	}
    945 #endif
    946 
    947       _DifferenceTp __total_length = 0;
    948       for (_RAIterIterator __s = __seqs_begin; __s != __seqs_end; ++__s)
    949 	__total_length += _GLIBCXX_PARALLEL_LENGTH(*__s);
    950 
    951       __length = std::min<_DifferenceTp>(__length, __total_length);
    952 
    953       if(__length == 0)
    954 	return __target;
    955 
    956       _RAIter3 __return_target = __target;
    957       _SeqNumber __k = static_cast<_SeqNumber>(__seqs_end - __seqs_begin);
    958 
    959       switch (__k)
    960 	{
    961 	case 0:
    962           break;
    963 	case 1:
    964           __return_target = std::copy(__seqs_begin[0].first,
    965 				      __seqs_begin[0].first + __length,
    966 				      __target);
    967           __seqs_begin[0].first += __length;
    968           break;
    969 	case 2:
    970           __return_target = __merge_advance(__seqs_begin[0].first,
    971 					    __seqs_begin[0].second,
    972 					    __seqs_begin[1].first,
    973 					    __seqs_begin[1].second,
    974 					    __target, __length, __comp);
    975           break;
    976 	case 3:
    977           __return_target = __multiway_merge_3_variant_sentinel_switch
    978 	    <__sentinels, _RAIterIterator, _RAIter3, _DifferenceTp, _Compare>()
    979 	    (__seqs_begin, __seqs_end, __target, __length, __comp);
    980           break;
    981 	case 4:
    982           __return_target = __multiway_merge_4_variant_sentinel_switch
    983 	    <__sentinels, _RAIterIterator, _RAIter3, _DifferenceTp, _Compare>()
    984 	    (__seqs_begin, __seqs_end, __target, __length, __comp);
    985           break;
    986 	default:
    987 	  __return_target = __multiway_merge_k_variant_sentinel_switch
    988 	    <__sentinels, __stable, _RAIterIterator, _RAIter3, _DifferenceTp,
    989 	     _Compare>()
    990 	    (__seqs_begin, __seqs_end, __target, __sentinel, __length, __comp);
    991 	  break;
    992 	}
    993 #if _GLIBCXX_ASSERTIONS
    994       _GLIBCXX_PARALLEL_ASSERT(
    995 	__is_sorted(__target, __target + __length, __comp));
    996 #endif
    997 
    998       return __return_target;
    999     }
   1000 
   1001   /**
   1002    * @brief Stable sorting functor.
   1003    *
   1004    * Used to reduce code instanciation in multiway_merge_sampling_splitting.
   1005    */
   1006   template<bool __stable, class _RAIter, class _StrictWeakOrdering>
   1007     struct _SamplingSorter
   1008     {
   1009       void
   1010       operator()(_RAIter __first, _RAIter __last, _StrictWeakOrdering __comp)
   1011       { __gnu_sequential::stable_sort(__first, __last, __comp); }
   1012     };
   1013 
   1014   /**
   1015    * @brief Non-__stable sorting functor.
   1016    *
   1017    * Used to reduce code instantiation in multiway_merge_sampling_splitting.
   1018    */
   1019   template<class _RAIter, class _StrictWeakOrdering>
   1020     struct _SamplingSorter<false, _RAIter, _StrictWeakOrdering>
   1021     {
   1022       void
   1023       operator()(_RAIter __first, _RAIter __last, _StrictWeakOrdering __comp)
   1024       { __gnu_sequential::sort(__first, __last, __comp); }
   1025     };
   1026 
   1027   /**
   1028    * @brief Sampling based splitting for parallel multiway-merge routine.
   1029    */
   1030   template<bool __stable,
   1031 	   typename _RAIterIterator,
   1032 	   typename _Compare,
   1033 	   typename _DifferenceType>
   1034     void
   1035     multiway_merge_sampling_splitting(_RAIterIterator __seqs_begin,
   1036 				      _RAIterIterator __seqs_end,
   1037 				      _DifferenceType __length,
   1038 				      _DifferenceType __total_length,
   1039 				      _Compare __comp,
   1040      std::vector<std::pair<_DifferenceType, _DifferenceType> > *__pieces)
   1041     {
   1042       typedef typename std::iterator_traits<_RAIterIterator>
   1043 	::difference_type _SeqNumber;
   1044       typedef typename std::iterator_traits<_RAIterIterator>
   1045 	::value_type::first_type
   1046 	_RAIter1;
   1047       typedef typename std::iterator_traits<_RAIter1>::value_type
   1048 	_ValueType;
   1049 
   1050       // __k sequences.
   1051       const _SeqNumber __k
   1052 	= static_cast<_SeqNumber>(__seqs_end - __seqs_begin);
   1053 
   1054       const _ThreadIndex __num_threads = omp_get_num_threads();
   1055 
   1056       const _DifferenceType __num_samples =
   1057 	__gnu_parallel::_Settings::get().merge_oversampling * __num_threads;
   1058 
   1059       _ValueType* __samples = static_cast<_ValueType*>
   1060 	(::operator new(sizeof(_ValueType) * __k * __num_samples));
   1061       // Sample.
   1062       for (_SeqNumber __s = 0; __s < __k; ++__s)
   1063 	for (_DifferenceType __i = 0; __i < __num_samples; ++__i)
   1064 	  {
   1065 	    _DifferenceType sample_index = static_cast<_DifferenceType>
   1066 	      (_GLIBCXX_PARALLEL_LENGTH(__seqs_begin[__s])
   1067 	       * (double(__i + 1) / (__num_samples + 1))
   1068 	       * (double(__length) / __total_length));
   1069 	    new(&(__samples[__s * __num_samples + __i]))
   1070               _ValueType(__seqs_begin[__s].first[sample_index]);
   1071 	  }
   1072 
   1073       // Sort stable or non-stable, depending on value of template parameter
   1074       // "__stable".
   1075       _SamplingSorter<__stable, _ValueType*, _Compare>()
   1076 	(__samples, __samples + (__num_samples * __k), __comp);
   1077 
   1078       for (_ThreadIndex __slab = 0; __slab < __num_threads; ++__slab)
   1079 	// For each slab / processor.
   1080 	for (_SeqNumber __seq = 0; __seq < __k; ++__seq)
   1081 	  {
   1082 	    // For each sequence.
   1083 	    if (__slab > 0)
   1084 	      __pieces[__slab][__seq].first = std::upper_bound
   1085 		(__seqs_begin[__seq].first, __seqs_begin[__seq].second,
   1086 		 __samples[__num_samples * __k * __slab / __num_threads],
   1087 		 __comp)
   1088 		- __seqs_begin[__seq].first;
   1089 	    else
   1090 	      // Absolute beginning.
   1091 	      __pieces[__slab][__seq].first = 0;
   1092 	    if ((__slab + 1) < __num_threads)
   1093 	      __pieces[__slab][__seq].second = std::upper_bound
   1094 		(__seqs_begin[__seq].first, __seqs_begin[__seq].second,
   1095 		 __samples[__num_samples * __k * (__slab + 1) / __num_threads],
   1096 		 __comp)
   1097 		- __seqs_begin[__seq].first;
   1098 	    else
   1099               // Absolute end.
   1100 	      __pieces[__slab][__seq].second =
   1101 		_GLIBCXX_PARALLEL_LENGTH(__seqs_begin[__seq]);
   1102 	  }
   1103 
   1104       for (_SeqNumber __s = 0; __s < __k; ++__s)
   1105 	for (_DifferenceType __i = 0; __i < __num_samples; ++__i)
   1106 	  __samples[__s * __num_samples + __i].~_ValueType();
   1107       ::operator delete(__samples);
   1108     }
   1109 
   1110   /**
   1111    * @brief Exact splitting for parallel multiway-merge routine.
   1112    *
   1113    * None of the passed sequences may be empty.
   1114    */
   1115   template<bool __stable,
   1116 	   typename _RAIterIterator,
   1117 	   typename _Compare,
   1118 	   typename _DifferenceType>
   1119     void
   1120     multiway_merge_exact_splitting(_RAIterIterator __seqs_begin,
   1121 				   _RAIterIterator __seqs_end,
   1122 				   _DifferenceType __length,
   1123 				   _DifferenceType __total_length,
   1124 				   _Compare __comp,
   1125        std::vector<std::pair<_DifferenceType, _DifferenceType> > *__pieces)
   1126     {
   1127       typedef typename std::iterator_traits<_RAIterIterator>
   1128 	::difference_type _SeqNumber;
   1129       typedef typename std::iterator_traits<_RAIterIterator>
   1130 	::value_type::first_type
   1131 	_RAIter1;
   1132 
   1133       const bool __tight = (__total_length == __length);
   1134 
   1135       // __k sequences.
   1136       const _SeqNumber __k = __seqs_end - __seqs_begin;
   1137 
   1138       const _ThreadIndex __num_threads = omp_get_num_threads();
   1139 
   1140       // (Settings::multiway_merge_splitting
   1141       //  == __gnu_parallel::_Settings::EXACT).
   1142       std::vector<_RAIter1>* __offsets =
   1143 	new std::vector<_RAIter1>[__num_threads];
   1144       std::vector<std::pair<_RAIter1, _RAIter1> > __se(__k);
   1145 
   1146       copy(__seqs_begin, __seqs_end, __se.begin());
   1147 
   1148       _DifferenceType* __borders =
   1149 	new _DifferenceType[__num_threads + 1];
   1150       __equally_split(__length, __num_threads, __borders);
   1151 
   1152       for (_ThreadIndex __s = 0; __s < (__num_threads - 1); ++__s)
   1153 	{
   1154 	  __offsets[__s].resize(__k);
   1155 	  multiseq_partition(__se.begin(), __se.end(), __borders[__s + 1],
   1156 			     __offsets[__s].begin(), __comp);
   1157 
   1158 	  // Last one also needed and available.
   1159 	  if (!__tight)
   1160 	    {
   1161 	      __offsets[__num_threads - 1].resize(__k);
   1162 	      multiseq_partition(__se.begin(), __se.end(),
   1163 				 _DifferenceType(__length),
   1164 				 __offsets[__num_threads - 1].begin(),
   1165 				 __comp);
   1166 	    }
   1167 	}
   1168       delete[] __borders;
   1169 
   1170       for (_ThreadIndex __slab = 0; __slab < __num_threads; ++__slab)
   1171 	{
   1172 	  // For each slab / processor.
   1173 	  for (_SeqNumber __seq = 0; __seq < __k; ++__seq)
   1174 	    {
   1175 	      // For each sequence.
   1176 	      if (__slab == 0)
   1177 		{
   1178 		  // Absolute beginning.
   1179 		  __pieces[__slab][__seq].first = 0;
   1180 		}
   1181 	      else
   1182 		__pieces[__slab][__seq].first =
   1183 		  __pieces[__slab - 1][__seq].second;
   1184 	      if (!__tight || __slab < (__num_threads - 1))
   1185 		__pieces[__slab][__seq].second =
   1186 		  __offsets[__slab][__seq] - __seqs_begin[__seq].first;
   1187 	      else
   1188 		{
   1189 		  // __slab == __num_threads - 1
   1190 		  __pieces[__slab][__seq].second =
   1191                     _GLIBCXX_PARALLEL_LENGTH(__seqs_begin[__seq]);
   1192 		}
   1193 	    }
   1194 	}
   1195       delete[] __offsets;
   1196     }
   1197 
   1198   /** @brief Parallel multi-way merge routine.
   1199    *
   1200    * The _GLIBCXX_PARALLEL_DECISION is based on the branching factor
   1201    * and runtime settings.
   1202    *
   1203    * Must not be called if the number of sequences is 1.
   1204    *
   1205    * @tparam _Splitter functor to split input (either __exact or sampling based)
   1206    * @tparam __stable Stable merging incurs a performance penalty.
   1207    * @tparam __sentinel Ignored.
   1208    *
   1209    * @param __seqs_begin Begin iterator of iterator pair input sequence.
   1210    * @param __seqs_end End iterator of iterator pair input sequence.
   1211    * @param __target Begin iterator of output sequence.
   1212    * @param __comp Comparator.
   1213    * @param __length Maximum length to merge, possibly larger than the
   1214    * number of elements available.
   1215    * @return End iterator of output sequence.
   1216    */
   1217   template<bool __stable,
   1218 	   bool __sentinels,
   1219 	   typename _RAIterIterator,
   1220 	   typename _RAIter3,
   1221 	   typename _DifferenceTp,
   1222 	   typename _Splitter,
   1223 	   typename _Compare>
   1224     _RAIter3
   1225     parallel_multiway_merge(_RAIterIterator __seqs_begin,
   1226                             _RAIterIterator __seqs_end,
   1227                             _RAIter3 __target,
   1228                             _Splitter __splitter,
   1229                             _DifferenceTp __length,
   1230                             _Compare __comp,
   1231                             _ThreadIndex __num_threads)
   1232       {
   1233 #if _GLIBCXX_ASSERTIONS
   1234 	_GLIBCXX_PARALLEL_ASSERT(__seqs_end - __seqs_begin > 1);
   1235 #endif
   1236 
   1237 	_GLIBCXX_CALL(__length)
   1238 
   1239 	typedef _DifferenceTp _DifferenceType;
   1240         typedef typename std::iterator_traits<_RAIterIterator>
   1241 	  ::difference_type _SeqNumber;
   1242 	typedef typename std::iterator_traits<_RAIterIterator>
   1243           ::value_type::first_type
   1244           _RAIter1;
   1245 	typedef typename
   1246           std::iterator_traits<_RAIter1>::value_type _ValueType;
   1247 
   1248 	// Leave only non-empty sequences.
   1249 	typedef std::pair<_RAIter1, _RAIter1> seq_type;
   1250 	seq_type* __ne_seqs = new seq_type[__seqs_end - __seqs_begin];
   1251 	_SeqNumber __k = 0;
   1252 	_DifferenceType __total_length = 0;
   1253 	for (_RAIterIterator __raii = __seqs_begin;
   1254              __raii != __seqs_end; ++__raii)
   1255           {
   1256             _DifferenceTp __seq_length = _GLIBCXX_PARALLEL_LENGTH(*__raii);
   1257             if(__seq_length > 0)
   1258               {
   1259         	__total_length += __seq_length;
   1260         	__ne_seqs[__k++] = *__raii;
   1261               }
   1262           }
   1263 
   1264 	_GLIBCXX_CALL(__total_length)
   1265 
   1266 	__length = std::min<_DifferenceTp>(__length, __total_length);
   1267 
   1268 	if (__total_length == 0 || __k == 0)
   1269 	  {
   1270 	    delete[] __ne_seqs;
   1271 	    return __target;
   1272 	  }
   1273 
   1274 	std::vector<std::pair<_DifferenceType, _DifferenceType> >* __pieces;
   1275 
   1276 	__num_threads = static_cast<_ThreadIndex>
   1277           (std::min<_DifferenceType>(__num_threads, __total_length));
   1278 
   1279 #       pragma omp parallel num_threads (__num_threads)
   1280 	{
   1281 #         pragma omp single
   1282 	  {
   1283 	    __num_threads = omp_get_num_threads();
   1284 	    // Thread __t will have to merge pieces[__iam][0..__k - 1]
   1285 	    __pieces = new std::vector<
   1286 	    std::pair<_DifferenceType, _DifferenceType> >[__num_threads];
   1287 	    for (_ThreadIndex __s = 0; __s < __num_threads; ++__s)
   1288 	      __pieces[__s].resize(__k);
   1289 
   1290 	    _DifferenceType __num_samples =
   1291 	      __gnu_parallel::_Settings::get().merge_oversampling
   1292 	      * __num_threads;
   1293 
   1294 	    __splitter(__ne_seqs, __ne_seqs + __k, __length, __total_length,
   1295 		       __comp, __pieces);
   1296 	  } //single
   1297 
   1298 	  _ThreadIndex __iam = omp_get_thread_num();
   1299 
   1300 	  _DifferenceType __target_position = 0;
   1301 
   1302 	  for (_SeqNumber __c = 0; __c < __k; ++__c)
   1303 	    __target_position += __pieces[__iam][__c].first;
   1304 
   1305 	  seq_type* __chunks = new seq_type[__k];
   1306 
   1307 	  for (_SeqNumber __s = 0; __s < __k; ++__s)
   1308 	    __chunks[__s] = std::make_pair(__ne_seqs[__s].first
   1309 					   + __pieces[__iam][__s].first,
   1310 					   __ne_seqs[__s].first
   1311 					   + __pieces[__iam][__s].second);
   1312 
   1313 	  if(__length > __target_position)
   1314 	    __sequential_multiway_merge<__stable, __sentinels>
   1315 	      (__chunks, __chunks + __k, __target + __target_position,
   1316 	       *(__seqs_begin->second), __length - __target_position, __comp);
   1317 
   1318 	  delete[] __chunks;
   1319 	} // parallel
   1320 
   1321 #if _GLIBCXX_ASSERTIONS
   1322 	_GLIBCXX_PARALLEL_ASSERT(
   1323           __is_sorted(__target, __target + __length, __comp));
   1324 #endif
   1325 
   1326 	__k = 0;
   1327 	// Update ends of sequences.
   1328 	for (_RAIterIterator __raii = __seqs_begin;
   1329              __raii != __seqs_end; ++__raii)
   1330           {
   1331             _DifferenceTp __length = _GLIBCXX_PARALLEL_LENGTH(*__raii);
   1332             if(__length > 0)
   1333               (*__raii).first += __pieces[__num_threads - 1][__k++].second;
   1334           }
   1335 
   1336 	delete[] __pieces;
   1337 	delete[] __ne_seqs;
   1338 
   1339 	return __target + __length;
   1340       }
   1341 
   1342   /**
   1343    * @brief Multiway Merge Frontend.
   1344    *
   1345    * Merge the sequences specified by seqs_begin and __seqs_end into
   1346    * __target.  __seqs_begin and __seqs_end must point to a sequence of
   1347    * pairs.  These pairs must contain an iterator to the beginning
   1348    * of a sequence in their first entry and an iterator the _M_end of
   1349    * the same sequence in their second entry.
   1350    *
   1351    * Ties are broken arbitrarily.  See stable_multiway_merge for a variant
   1352    * that breaks ties by sequence number but is slower.
   1353    *
   1354    * The first entries of the pairs (i.e. the begin iterators) will be moved
   1355    * forward.
   1356    *
   1357    * The output sequence has to provide enough space for all elements
   1358    * that are written to it.
   1359    *
   1360    * This function will merge the input sequences:
   1361    *
   1362    * - not stable
   1363    * - parallel, depending on the input size and Settings
   1364    * - using sampling for splitting
   1365    * - not using sentinels
   1366    *
   1367    * Example:
   1368    *
   1369    * <pre>
   1370    *   int sequences[10][10];
   1371    *   for (int __i = 0; __i < 10; ++__i)
   1372    *     for (int __j = 0; __i < 10; ++__j)
   1373    *       sequences[__i][__j] = __j;
   1374    *
   1375    *   int __out[33];
   1376    *   std::vector<std::pair<int*> > seqs;
   1377    *   for (int __i = 0; __i < 10; ++__i)
   1378    *     { seqs.push(std::make_pair<int*>(sequences[__i],
   1379    *                                      sequences[__i] + 10)) }
   1380    *
   1381    *   multiway_merge(seqs.begin(), seqs.end(), __target, std::less<int>(), 33);
   1382    * </pre>
   1383    *
   1384    * @see stable_multiway_merge
   1385    *
   1386    * @pre All input sequences must be sorted.
   1387    * @pre Target must provide enough space to merge out length elements or
   1388    *    the number of elements in all sequences, whichever is smaller.
   1389    *
   1390    * @post [__target, return __value) contains merged __elements from the
   1391    *    input sequences.
   1392    * @post return __value - __target = min(__length, number of elements in all
   1393    *    sequences).
   1394    *
   1395    * @tparam _RAIterPairIterator iterator over sequence
   1396    *    of pairs of iterators
   1397    * @tparam _RAIterOut iterator over target sequence
   1398    * @tparam _DifferenceTp difference type for the sequence
   1399    * @tparam _Compare strict weak ordering type to compare elements
   1400    *    in sequences
   1401    *
   1402    * @param __seqs_begin  __begin of sequence __sequence
   1403    * @param __seqs_end    _M_end of sequence __sequence
   1404    * @param __target      target sequence to merge to.
   1405    * @param __comp        strict weak ordering to use for element comparison.
   1406    * @param __length Maximum length to merge, possibly larger than the
   1407    * number of elements available.
   1408    *
   1409    * @return _M_end iterator of output sequence
   1410    */
   1411   // multiway_merge
   1412   // public interface
   1413   template<typename _RAIterPairIterator,
   1414 	   typename _RAIterOut,
   1415 	   typename _DifferenceTp,
   1416 	   typename _Compare>
   1417     _RAIterOut
   1418     multiway_merge(_RAIterPairIterator __seqs_begin,
   1419 		   _RAIterPairIterator __seqs_end,
   1420 		   _RAIterOut __target,
   1421 		   _DifferenceTp __length, _Compare __comp,
   1422 		   __gnu_parallel::sequential_tag)
   1423     {
   1424       typedef _DifferenceTp _DifferenceType;
   1425       _GLIBCXX_CALL(__seqs_end - __seqs_begin)
   1426 
   1427       // catch special case: no sequences
   1428       if (__seqs_begin == __seqs_end)
   1429 	return __target;
   1430 
   1431       // Execute multiway merge *sequentially*.
   1432       return __sequential_multiway_merge
   1433 	</* __stable = */ false, /* __sentinels = */ false>
   1434 	(__seqs_begin, __seqs_end, __target,
   1435 	 *(__seqs_begin->second), __length, __comp);
   1436     }
   1437 
   1438   // public interface
   1439   template<typename _RAIterPairIterator,
   1440 	   typename _RAIterOut,
   1441 	   typename _DifferenceTp,
   1442 	   typename _Compare>
   1443     _RAIterOut
   1444     multiway_merge(_RAIterPairIterator __seqs_begin,
   1445 		   _RAIterPairIterator __seqs_end,
   1446 		   _RAIterOut __target,
   1447 		   _DifferenceTp __length, _Compare __comp,
   1448 		   __gnu_parallel::exact_tag __tag)
   1449     {
   1450       typedef _DifferenceTp _DifferenceType;
   1451       _GLIBCXX_CALL(__seqs_end - __seqs_begin)
   1452 
   1453       // catch special case: no sequences
   1454       if (__seqs_begin == __seqs_end)
   1455 	return __target;
   1456 
   1457       // Execute merge; maybe parallel, depending on the number of merged
   1458       // elements and the number of sequences and global thresholds in
   1459       // Settings.
   1460       if ((__seqs_end - __seqs_begin > 1)
   1461 	  && _GLIBCXX_PARALLEL_CONDITION(
   1462             ((__seqs_end - __seqs_begin) >=
   1463                __gnu_parallel::_Settings::get().multiway_merge_minimal_k)
   1464             && ((_SequenceIndex)__length >=
   1465               __gnu_parallel::_Settings::get().multiway_merge_minimal_n)))
   1466 	return parallel_multiway_merge
   1467 	  </* __stable = */ false, /* __sentinels = */ false>
   1468 	  (__seqs_begin, __seqs_end, __target,
   1469 	   multiway_merge_exact_splitting</* __stable = */ false,
   1470 	   typename std::iterator_traits<_RAIterPairIterator>
   1471 	   ::value_type*, _Compare, _DifferenceTp>,
   1472 	   static_cast<_DifferenceType>(__length), __comp,
   1473 	   __tag.__get_num_threads());
   1474       else
   1475 	return __sequential_multiway_merge
   1476 	  </* __stable = */ false, /* __sentinels = */ false>
   1477 	  (__seqs_begin, __seqs_end, __target,
   1478 	   *(__seqs_begin->second), __length, __comp);
   1479     }
   1480 
   1481   // public interface
   1482   template<typename _RAIterPairIterator,
   1483 	   typename _RAIterOut,
   1484 	   typename _DifferenceTp,
   1485 	   typename _Compare>
   1486     _RAIterOut
   1487     multiway_merge(_RAIterPairIterator __seqs_begin,
   1488 		   _RAIterPairIterator __seqs_end,
   1489 		   _RAIterOut __target,
   1490 		   _DifferenceTp __length, _Compare __comp,
   1491 		   __gnu_parallel::sampling_tag __tag)
   1492     {
   1493       typedef _DifferenceTp _DifferenceType;
   1494       _GLIBCXX_CALL(__seqs_end - __seqs_begin)
   1495 
   1496       // catch special case: no sequences
   1497       if (__seqs_begin == __seqs_end)
   1498 	return __target;
   1499 
   1500       // Execute merge; maybe parallel, depending on the number of merged
   1501       // elements and the number of sequences and global thresholds in
   1502       // Settings.
   1503       if ((__seqs_end - __seqs_begin > 1)
   1504 	  && _GLIBCXX_PARALLEL_CONDITION(
   1505             ((__seqs_end - __seqs_begin) >=
   1506                __gnu_parallel::_Settings::get().multiway_merge_minimal_k)
   1507             && ((_SequenceIndex)__length >=
   1508               __gnu_parallel::_Settings::get().multiway_merge_minimal_n)))
   1509 	return parallel_multiway_merge
   1510 	  </* __stable = */ false, /* __sentinels = */ false>
   1511 	  (__seqs_begin, __seqs_end, __target,
   1512 	   multiway_merge_exact_splitting</* __stable = */ false,
   1513 	   typename std::iterator_traits<_RAIterPairIterator>
   1514 	   ::value_type*, _Compare, _DifferenceTp>,
   1515 	   static_cast<_DifferenceType>(__length), __comp,
   1516 	   __tag.__get_num_threads());
   1517       else
   1518 	return __sequential_multiway_merge
   1519 	  </* __stable = */ false, /* __sentinels = */ false>
   1520 	  (__seqs_begin, __seqs_end, __target,
   1521 	   *(__seqs_begin->second), __length, __comp);
   1522     }
   1523 
   1524   // public interface
   1525   template<typename _RAIterPairIterator,
   1526 	   typename _RAIterOut,
   1527 	   typename _DifferenceTp,
   1528 	   typename _Compare>
   1529     _RAIterOut
   1530     multiway_merge(_RAIterPairIterator __seqs_begin,
   1531 		   _RAIterPairIterator __seqs_end,
   1532 		   _RAIterOut __target,
   1533 		   _DifferenceTp __length, _Compare __comp,
   1534 		   parallel_tag __tag = parallel_tag(0))
   1535     { return multiway_merge(__seqs_begin, __seqs_end, __target, __length,
   1536 			    __comp, exact_tag(__tag.__get_num_threads())); }
   1537 
   1538   // public interface
   1539   template<typename _RAIterPairIterator,
   1540 	   typename _RAIterOut,
   1541 	   typename _DifferenceTp,
   1542 	   typename _Compare>
   1543     _RAIterOut
   1544     multiway_merge(_RAIterPairIterator __seqs_begin,
   1545 		   _RAIterPairIterator __seqs_end,
   1546 		   _RAIterOut __target,
   1547 		   _DifferenceTp __length, _Compare __comp,
   1548 		   default_parallel_tag __tag)
   1549     { return multiway_merge(__seqs_begin, __seqs_end, __target, __length,
   1550 			    __comp, exact_tag(__tag.__get_num_threads())); }
   1551 
   1552   // stable_multiway_merge
   1553   // public interface
   1554   template<typename _RAIterPairIterator,
   1555 	   typename _RAIterOut,
   1556 	   typename _DifferenceTp,
   1557 	   typename _Compare>
   1558     _RAIterOut
   1559     stable_multiway_merge(_RAIterPairIterator __seqs_begin,
   1560 			  _RAIterPairIterator __seqs_end,
   1561 			  _RAIterOut __target,
   1562 			  _DifferenceTp __length, _Compare __comp,
   1563 			  __gnu_parallel::sequential_tag)
   1564     {
   1565       typedef _DifferenceTp _DifferenceType;
   1566       _GLIBCXX_CALL(__seqs_end - __seqs_begin)
   1567 
   1568       // catch special case: no sequences
   1569       if (__seqs_begin == __seqs_end)
   1570 	return __target;
   1571 
   1572       // Execute multiway merge *sequentially*.
   1573       return __sequential_multiway_merge
   1574 	</* __stable = */ true, /* __sentinels = */ false>
   1575           (__seqs_begin, __seqs_end, __target,
   1576 	   *(__seqs_begin->second), __length, __comp);
   1577     }
   1578 
   1579   // public interface
   1580   template<typename _RAIterPairIterator,
   1581 	   typename _RAIterOut,
   1582 	   typename _DifferenceTp,
   1583 	   typename _Compare>
   1584     _RAIterOut
   1585     stable_multiway_merge(_RAIterPairIterator __seqs_begin,
   1586 			  _RAIterPairIterator __seqs_end,
   1587 			  _RAIterOut __target,
   1588 			  _DifferenceTp __length, _Compare __comp,
   1589 			  __gnu_parallel::exact_tag __tag)
   1590     {
   1591       typedef _DifferenceTp _DifferenceType;
   1592       _GLIBCXX_CALL(__seqs_end - __seqs_begin)
   1593 
   1594       // catch special case: no sequences
   1595       if (__seqs_begin == __seqs_end)
   1596 	return __target;
   1597 
   1598       // Execute merge; maybe parallel, depending on the number of merged
   1599       // elements and the number of sequences and global thresholds in
   1600       // Settings.
   1601       if ((__seqs_end - __seqs_begin > 1)
   1602 	  && _GLIBCXX_PARALLEL_CONDITION(
   1603             ((__seqs_end - __seqs_begin) >=
   1604               __gnu_parallel::_Settings::get().multiway_merge_minimal_k)
   1605             && ((_SequenceIndex)__length >=
   1606               __gnu_parallel::_Settings::get().multiway_merge_minimal_n)))
   1607 	return parallel_multiway_merge
   1608           </* __stable = */ true, /* __sentinels = */ false>
   1609 	  (__seqs_begin, __seqs_end, __target,
   1610 	   multiway_merge_exact_splitting</* __stable = */ true,
   1611 	   typename std::iterator_traits<_RAIterPairIterator>
   1612 	   ::value_type*, _Compare, _DifferenceTp>,
   1613 	   static_cast<_DifferenceType>(__length), __comp,
   1614 	   __tag.__get_num_threads());
   1615       else
   1616 	return __sequential_multiway_merge
   1617 	  </* __stable = */ true, /* __sentinels = */ false>
   1618 	  (__seqs_begin, __seqs_end, __target,
   1619 	   *(__seqs_begin->second), __length, __comp);
   1620     }
   1621 
   1622   // public interface
   1623   template<typename _RAIterPairIterator,
   1624 	   typename _RAIterOut,
   1625 	   typename _DifferenceTp,
   1626 	   typename _Compare>
   1627     _RAIterOut
   1628     stable_multiway_merge(_RAIterPairIterator __seqs_begin,
   1629 			  _RAIterPairIterator __seqs_end,
   1630 			  _RAIterOut __target,
   1631 			  _DifferenceTp __length, _Compare __comp,
   1632 			  sampling_tag __tag)
   1633     {
   1634       typedef _DifferenceTp _DifferenceType;
   1635       _GLIBCXX_CALL(__seqs_end - __seqs_begin)
   1636 
   1637       // catch special case: no sequences
   1638       if (__seqs_begin == __seqs_end)
   1639 	return __target;
   1640 
   1641       // Execute merge; maybe parallel, depending on the number of merged
   1642       // elements and the number of sequences and global thresholds in
   1643       // Settings.
   1644       if ((__seqs_end - __seqs_begin > 1)
   1645 	  && _GLIBCXX_PARALLEL_CONDITION(
   1646             ((__seqs_end - __seqs_begin) >=
   1647               __gnu_parallel::_Settings::get().multiway_merge_minimal_k)
   1648             && ((_SequenceIndex)__length >=
   1649               __gnu_parallel::_Settings::get().multiway_merge_minimal_n)))
   1650 	return parallel_multiway_merge
   1651           </* __stable = */ true, /* __sentinels = */ false>
   1652 	  (__seqs_begin, __seqs_end, __target,
   1653 	   multiway_merge_sampling_splitting</* __stable = */ true,
   1654 	   typename std::iterator_traits<_RAIterPairIterator>
   1655 	   ::value_type*, _Compare, _DifferenceTp>,
   1656 	   static_cast<_DifferenceType>(__length), __comp,
   1657 	   __tag.__get_num_threads());
   1658       else
   1659 	return __sequential_multiway_merge
   1660           </* __stable = */ true, /* __sentinels = */ false>
   1661 	  (__seqs_begin, __seqs_end, __target,
   1662 	   *(__seqs_begin->second), __length, __comp);
   1663     }
   1664 
   1665   // public interface
   1666   template<typename _RAIterPairIterator,
   1667 	   typename _RAIterOut,
   1668 	   typename _DifferenceTp,
   1669 	   typename _Compare>
   1670     _RAIterOut
   1671     stable_multiway_merge(_RAIterPairIterator __seqs_begin,
   1672 			  _RAIterPairIterator __seqs_end,
   1673 			  _RAIterOut __target,
   1674 			  _DifferenceTp __length, _Compare __comp,
   1675 			  parallel_tag __tag = parallel_tag(0))
   1676     {
   1677       return stable_multiway_merge
   1678 	(__seqs_begin, __seqs_end, __target, __length, __comp,
   1679 	 exact_tag(__tag.__get_num_threads()));
   1680     }
   1681 
   1682   // public interface
   1683   template<typename _RAIterPairIterator,
   1684 	   typename _RAIterOut,
   1685 	   typename _DifferenceTp,
   1686 	   typename _Compare>
   1687     _RAIterOut
   1688     stable_multiway_merge(_RAIterPairIterator __seqs_begin,
   1689 			  _RAIterPairIterator __seqs_end,
   1690 			  _RAIterOut __target,
   1691 			  _DifferenceTp __length, _Compare __comp,
   1692 			  default_parallel_tag __tag)
   1693     {
   1694       return stable_multiway_merge
   1695 	(__seqs_begin, __seqs_end, __target, __length, __comp,
   1696 	 exact_tag(__tag.__get_num_threads()));
   1697     }
   1698 
   1699   /**
   1700    * @brief Multiway Merge Frontend.
   1701    *
   1702    * Merge the sequences specified by seqs_begin and __seqs_end into
   1703    * __target.  __seqs_begin and __seqs_end must point to a sequence of
   1704    * pairs.  These pairs must contain an iterator to the beginning
   1705    * of a sequence in their first entry and an iterator the _M_end of
   1706    * the same sequence in their second entry.
   1707    *
   1708    * Ties are broken arbitrarily.  See stable_multiway_merge for a variant
   1709    * that breaks ties by sequence number but is slower.
   1710    *
   1711    * The first entries of the pairs (i.e. the begin iterators) will be moved
   1712    * forward accordingly.
   1713    *
   1714    * The output sequence has to provide enough space for all elements
   1715    * that are written to it.
   1716    *
   1717    * This function will merge the input sequences:
   1718    *
   1719    * - not stable
   1720    * - parallel, depending on the input size and Settings
   1721    * - using sampling for splitting
   1722    * - using sentinels
   1723    *
   1724    * You have to take care that the element the _M_end iterator points to is
   1725    * readable and contains a value that is greater than any other non-sentinel
   1726    * value in all sequences.
   1727    *
   1728    * Example:
   1729    *
   1730    * <pre>
   1731    *   int sequences[10][11];
   1732    *   for (int __i = 0; __i < 10; ++__i)
   1733    *     for (int __j = 0; __i < 11; ++__j)
   1734    *       sequences[__i][__j] = __j; // __last one is sentinel!
   1735    *
   1736    *   int __out[33];
   1737    *   std::vector<std::pair<int*> > seqs;
   1738    *   for (int __i = 0; __i < 10; ++__i)
   1739    *     { seqs.push(std::make_pair<int*>(sequences[__i],
   1740    *                                      sequences[__i] + 10)) }
   1741    *
   1742    *   multiway_merge(seqs.begin(), seqs.end(), __target, std::less<int>(), 33);
   1743    * </pre>
   1744    *
   1745    * @pre All input sequences must be sorted.
   1746    * @pre Target must provide enough space to merge out length elements or
   1747    *    the number of elements in all sequences, whichever is smaller.
   1748    * @pre For each @c __i, @c __seqs_begin[__i].second must be the end
   1749    *    marker of the sequence, but also reference the one more __sentinel
   1750    *    element.
   1751    *
   1752    * @post [__target, return __value) contains merged __elements from the
   1753    *    input sequences.
   1754    * @post return __value - __target = min(__length, number of elements in all
   1755    *    sequences).
   1756    *
   1757    * @see stable_multiway_merge_sentinels
   1758    *
   1759    * @tparam _RAIterPairIterator iterator over sequence
   1760    *    of pairs of iterators
   1761    * @tparam _RAIterOut iterator over target sequence
   1762    * @tparam _DifferenceTp difference type for the sequence
   1763    * @tparam _Compare strict weak ordering type to compare elements
   1764    *    in sequences
   1765    *
   1766    * @param __seqs_begin  __begin of sequence __sequence
   1767    * @param __seqs_end    _M_end of sequence __sequence
   1768    * @param __target      target sequence to merge to.
   1769    * @param __comp        strict weak ordering to use for element comparison.
   1770    * @param __length Maximum length to merge, possibly larger than the
   1771    * number of elements available.
   1772    *
   1773    * @return _M_end iterator of output sequence
   1774    */
   1775   // multiway_merge_sentinels
   1776   // public interface
   1777   template<typename _RAIterPairIterator,
   1778 	   typename _RAIterOut,
   1779 	   typename _DifferenceTp,
   1780 	   typename _Compare>
   1781     _RAIterOut
   1782     multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
   1783 			     _RAIterPairIterator __seqs_end,
   1784 			     _RAIterOut __target,
   1785 			     _DifferenceTp __length, _Compare __comp,
   1786 			     __gnu_parallel::sequential_tag)
   1787     {
   1788       typedef _DifferenceTp _DifferenceType;
   1789       _GLIBCXX_CALL(__seqs_end - __seqs_begin)
   1790 
   1791       // catch special case: no sequences
   1792       if (__seqs_begin == __seqs_end)
   1793 	return __target;
   1794 
   1795       // Execute multiway merge *sequentially*.
   1796       return __sequential_multiway_merge
   1797 	</* __stable = */ false, /* __sentinels = */ true>
   1798           (__seqs_begin, __seqs_end,
   1799            __target, *(__seqs_begin->second), __length, __comp);
   1800     }
   1801 
   1802   // public interface
   1803   template<typename _RAIterPairIterator,
   1804 	   typename _RAIterOut,
   1805 	   typename _DifferenceTp,
   1806 	   typename _Compare>
   1807     _RAIterOut
   1808     multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
   1809 			     _RAIterPairIterator __seqs_end,
   1810 			     _RAIterOut __target,
   1811 			     _DifferenceTp __length, _Compare __comp,
   1812 			     __gnu_parallel::exact_tag __tag)
   1813     {
   1814       typedef _DifferenceTp _DifferenceType;
   1815       _GLIBCXX_CALL(__seqs_end - __seqs_begin)
   1816 
   1817       // catch special case: no sequences
   1818       if (__seqs_begin == __seqs_end)
   1819 	return __target;
   1820 
   1821       // Execute merge; maybe parallel, depending on the number of merged
   1822       // elements and the number of sequences and global thresholds in
   1823       // Settings.
   1824       if ((__seqs_end - __seqs_begin > 1)
   1825 	  && _GLIBCXX_PARALLEL_CONDITION(
   1826             ((__seqs_end - __seqs_begin) >=
   1827               __gnu_parallel::_Settings::get().multiway_merge_minimal_k)
   1828             && ((_SequenceIndex)__length >=
   1829               __gnu_parallel::_Settings::get().multiway_merge_minimal_n)))
   1830 	return parallel_multiway_merge
   1831           </* __stable = */ false, /* __sentinels = */ true>
   1832 	  (__seqs_begin, __seqs_end, __target,
   1833 	   multiway_merge_exact_splitting</* __stable = */ false,
   1834 	   typename std::iterator_traits<_RAIterPairIterator>
   1835 	   ::value_type*, _Compare, _DifferenceTp>,
   1836 	   static_cast<_DifferenceType>(__length), __comp,
   1837 	   __tag.__get_num_threads());
   1838       else
   1839 	return __sequential_multiway_merge
   1840           </* __stable = */ false, /* __sentinels = */ true>
   1841 	  (__seqs_begin, __seqs_end, __target,
   1842 	   *(__seqs_begin->second), __length, __comp);
   1843     }
   1844 
   1845   // public interface
   1846   template<typename _RAIterPairIterator,
   1847 	   typename _RAIterOut,
   1848 	   typename _DifferenceTp,
   1849 	   typename _Compare>
   1850     _RAIterOut
   1851     multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
   1852 			     _RAIterPairIterator __seqs_end,
   1853 			     _RAIterOut __target,
   1854 			     _DifferenceTp __length, _Compare __comp,
   1855 			     sampling_tag __tag)
   1856     {
   1857       typedef _DifferenceTp _DifferenceType;
   1858       _GLIBCXX_CALL(__seqs_end - __seqs_begin)
   1859 
   1860       // catch special case: no sequences
   1861       if (__seqs_begin == __seqs_end)
   1862 	return __target;
   1863 
   1864       // Execute merge; maybe parallel, depending on the number of merged
   1865       // elements and the number of sequences and global thresholds in
   1866       // Settings.
   1867       if ((__seqs_end - __seqs_begin > 1)
   1868 	  && _GLIBCXX_PARALLEL_CONDITION(
   1869             ((__seqs_end - __seqs_begin) >=
   1870               __gnu_parallel::_Settings::get().multiway_merge_minimal_k)
   1871             && ((_SequenceIndex)__length >=
   1872               __gnu_parallel::_Settings::get().multiway_merge_minimal_n)))
   1873 	return parallel_multiway_merge
   1874           </* __stable = */ false, /* __sentinels = */ true>
   1875 	  (__seqs_begin, __seqs_end, __target,
   1876 	   multiway_merge_sampling_splitting</* __stable = */ false,
   1877 	   typename std::iterator_traits<_RAIterPairIterator>
   1878 	   ::value_type*, _Compare, _DifferenceTp>,
   1879 	   static_cast<_DifferenceType>(__length), __comp,
   1880 	   __tag.__get_num_threads());
   1881       else
   1882 	return __sequential_multiway_merge
   1883           </* __stable = */false, /* __sentinels = */ true>(
   1884             __seqs_begin, __seqs_end, __target,
   1885 	    *(__seqs_begin->second), __length, __comp);
   1886     }
   1887 
   1888   // public interface
   1889   template<typename _RAIterPairIterator,
   1890 	   typename _RAIterOut,
   1891 	   typename _DifferenceTp,
   1892 	   typename _Compare>
   1893     _RAIterOut
   1894     multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
   1895 			     _RAIterPairIterator __seqs_end,
   1896 			     _RAIterOut __target,
   1897 			     _DifferenceTp __length, _Compare __comp,
   1898 			     parallel_tag __tag = parallel_tag(0))
   1899     {
   1900       return multiway_merge_sentinels
   1901 	(__seqs_begin, __seqs_end, __target, __length, __comp,
   1902 	 exact_tag(__tag.__get_num_threads()));
   1903     }
   1904 
   1905   // public interface
   1906   template<typename _RAIterPairIterator,
   1907 	   typename _RAIterOut,
   1908 	   typename _DifferenceTp,
   1909 	   typename _Compare>
   1910     _RAIterOut
   1911     multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
   1912 			     _RAIterPairIterator __seqs_end,
   1913 			     _RAIterOut __target,
   1914 			     _DifferenceTp __length, _Compare __comp,
   1915 			     default_parallel_tag __tag)
   1916     {
   1917       return multiway_merge_sentinels
   1918 	(__seqs_begin, __seqs_end, __target, __length, __comp,
   1919 	 exact_tag(__tag.__get_num_threads()));
   1920     }
   1921 
   1922   // stable_multiway_merge_sentinels
   1923   // public interface
   1924   template<typename _RAIterPairIterator,
   1925 	   typename _RAIterOut,
   1926 	   typename _DifferenceTp,
   1927 	   typename _Compare>
   1928     _RAIterOut
   1929     stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
   1930 				    _RAIterPairIterator __seqs_end,
   1931 				    _RAIterOut __target,
   1932 				    _DifferenceTp __length, _Compare __comp,
   1933 				    __gnu_parallel::sequential_tag)
   1934     {
   1935       typedef _DifferenceTp _DifferenceType;
   1936       _GLIBCXX_CALL(__seqs_end - __seqs_begin)
   1937 
   1938       // catch special case: no sequences
   1939       if (__seqs_begin == __seqs_end)
   1940 	return __target;
   1941 
   1942       // Execute multiway merge *sequentially*.
   1943       return __sequential_multiway_merge
   1944 	</* __stable = */ true, /* __sentinels = */ true>
   1945 	(__seqs_begin, __seqs_end, __target,
   1946 	 *(__seqs_begin->second), __length, __comp);
   1947     }
   1948 
   1949   // public interface
   1950   template<typename _RAIterPairIterator,
   1951 	   typename _RAIterOut,
   1952 	   typename _DifferenceTp,
   1953 	   typename _Compare>
   1954     _RAIterOut
   1955     stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
   1956 				    _RAIterPairIterator __seqs_end,
   1957 				    _RAIterOut __target,
   1958 				    _DifferenceTp __length, _Compare __comp,
   1959 				    __gnu_parallel::exact_tag __tag)
   1960     {
   1961       typedef _DifferenceTp _DifferenceType;
   1962       _GLIBCXX_CALL(__seqs_end - __seqs_begin)
   1963 
   1964       // catch special case: no sequences
   1965       if (__seqs_begin == __seqs_end)
   1966 	return __target;
   1967 
   1968       // Execute merge; maybe parallel, depending on the number of merged
   1969       // elements and the number of sequences and global thresholds in
   1970       // Settings.
   1971       if ((__seqs_end - __seqs_begin > 1)
   1972 	  && _GLIBCXX_PARALLEL_CONDITION(
   1973             ((__seqs_end - __seqs_begin) >=
   1974             __gnu_parallel::_Settings::get().multiway_merge_minimal_k)
   1975             && ((_SequenceIndex)__length >=
   1976             __gnu_parallel::_Settings::get().multiway_merge_minimal_n)))
   1977 	return parallel_multiway_merge
   1978           </* __stable = */ true, /* __sentinels = */ true>
   1979 	  (__seqs_begin, __seqs_end, __target,
   1980 	   multiway_merge_exact_splitting</* __stable = */ true,
   1981 	   typename std::iterator_traits<_RAIterPairIterator>
   1982 	   ::value_type*, _Compare, _DifferenceTp>,
   1983 	   static_cast<_DifferenceType>(__length), __comp,
   1984 	   __tag.__get_num_threads());
   1985       else
   1986 	return __sequential_multiway_merge
   1987           </* __stable = */ true, /* __sentinels = */ true>
   1988 	  (__seqs_begin, __seqs_end, __target,
   1989 	   *(__seqs_begin->second), __length, __comp);
   1990     }
   1991 
   1992   // public interface
   1993   template<typename _RAIterPairIterator,
   1994 	   typename _RAIterOut,
   1995 	   typename _DifferenceTp,
   1996 	   typename _Compare>
   1997     _RAIterOut
   1998     stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
   1999 				    _RAIterPairIterator __seqs_end,
   2000 				    _RAIterOut __target,
   2001 				    _DifferenceTp __length,
   2002 				    _Compare __comp,
   2003 				    sampling_tag __tag)
   2004     {
   2005       typedef _DifferenceTp _DifferenceType;
   2006       _GLIBCXX_CALL(__seqs_end - __seqs_begin)
   2007 
   2008       // catch special case: no sequences
   2009       if (__seqs_begin == __seqs_end)
   2010 	return __target;
   2011 
   2012       // Execute merge; maybe parallel, depending on the number of merged
   2013       // elements and the number of sequences and global thresholds in
   2014       // Settings.
   2015       if ((__seqs_end - __seqs_begin > 1)
   2016 	  && _GLIBCXX_PARALLEL_CONDITION(
   2017             ((__seqs_end - __seqs_begin) >=
   2018               __gnu_parallel::_Settings::get().multiway_merge_minimal_k)
   2019             && ((_SequenceIndex)__length >=
   2020               __gnu_parallel::_Settings::get().multiway_merge_minimal_n)))
   2021 	return parallel_multiway_merge
   2022           </* __stable = */ true, /* __sentinels = */ true>
   2023 	  (__seqs_begin, __seqs_end, __target,
   2024 	   multiway_merge_sampling_splitting</* __stable = */ true,
   2025 	   typename std::iterator_traits<_RAIterPairIterator>
   2026 	   ::value_type*, _Compare, _DifferenceTp>,
   2027 	   static_cast<_DifferenceType>(__length), __comp,
   2028 	   __tag.__get_num_threads());
   2029       else
   2030 	return __sequential_multiway_merge
   2031           </* __stable = */ true, /* __sentinels = */ true>
   2032 	  (__seqs_begin, __seqs_end, __target,
   2033 	   *(__seqs_begin->second), __length, __comp);
   2034     }
   2035 
   2036   // public interface
   2037   template<typename _RAIterPairIterator,
   2038 	   typename _RAIterOut,
   2039 	   typename _DifferenceTp,
   2040 	   typename _Compare>
   2041     _RAIterOut
   2042     stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
   2043 				    _RAIterPairIterator __seqs_end,
   2044 				    _RAIterOut __target,
   2045 				    _DifferenceTp __length,
   2046 				    _Compare __comp,
   2047 				    parallel_tag __tag = parallel_tag(0))
   2048     {
   2049       return stable_multiway_merge_sentinels
   2050 	(__seqs_begin, __seqs_end, __target, __length, __comp,
   2051 	 exact_tag(__tag.__get_num_threads()));
   2052     }
   2053 
   2054   // public interface
   2055   template<typename _RAIterPairIterator,
   2056 	   typename _RAIterOut,
   2057 	   typename _DifferenceTp,
   2058 	   typename _Compare>
   2059     _RAIterOut
   2060     stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
   2061 				    _RAIterPairIterator __seqs_end,
   2062 				    _RAIterOut __target,
   2063 				    _DifferenceTp __length, _Compare __comp,
   2064 				    default_parallel_tag __tag)
   2065     {
   2066       return stable_multiway_merge_sentinels
   2067 	(__seqs_begin, __seqs_end, __target, __length, __comp,
   2068 	 exact_tag(__tag.__get_num_threads()));
   2069     }
   2070 }; // namespace __gnu_parallel
   2071 
   2072 #endif /* _GLIBCXX_PARALLEL_MULTIWAY_MERGE_H */
   2073