Commit d87f43c3 by Paolo Carlini Committed by Paolo Carlini

multiway_merge.h: Simple formatting and uglification fixes.

2009-11-04  Paolo Carlini  <paolo.carlini@oracle.com>

	* include/parallel/multiway_merge.h: Simple formatting and
	uglification fixes.
	* include/parallel/losertree.h: Likewise.

From-SVN: r153907
parent 0e159e0f
2009-11-04 Paolo Carlini <paolo.carlini@oracle.com>
* include/parallel/multiway_merge.h: Simple formatting and
uglification fixes.
* include/parallel/losertree.h: Likewise.
2009-11-03 David Krauss <potswa@mac.com> 2009-11-03 David Krauss <potswa@mac.com>
Paolo Carlini <paolo.carlini@oracle.com> Paolo Carlini <paolo.carlini@oracle.com>
......
...@@ -40,7 +40,6 @@ ...@@ -40,7 +40,6 @@
namespace __gnu_parallel namespace __gnu_parallel
{ {
/** /**
* @brief Guarded loser/tournament tree. * @brief Guarded loser/tournament tree.
* *
...@@ -54,9 +53,9 @@ namespace __gnu_parallel ...@@ -54,9 +53,9 @@ namespace __gnu_parallel
* @param _Compare the comparator to use, defaults to std::less<_Tp> * @param _Compare the comparator to use, defaults to std::less<_Tp>
*/ */
template<typename _Tp, typename _Compare> template<typename _Tp, typename _Compare>
class _LoserTreeBase class _LoserTreeBase
{ {
protected: protected:
/** @brief Internal representation of a _LoserTree element. */ /** @brief Internal representation of a _LoserTree element. */
struct _Loser struct _Loser
{ {
...@@ -86,7 +85,7 @@ protected: ...@@ -86,7 +85,7 @@ protected:
*/ */
bool _M_first_insert; bool _M_first_insert;
public: public:
/** /**
* @brief The constructor. * @brief The constructor.
* *
...@@ -128,7 +127,7 @@ public: ...@@ -128,7 +127,7 @@ public:
* @param _M_sup flag that determines whether the value to insert is an * @param _M_sup flag that determines whether the value to insert is an
* explicit __supremum. * explicit __supremum.
*/ */
inline void void
__insert_start(const _Tp& _M_key, int _M_source, bool _M_sup) __insert_start(const _Tp& _M_key, int _M_source, bool _M_sup)
{ {
unsigned int __pos = _M_k + _M_source; unsigned int __pos = _M_k + _M_source;
...@@ -152,9 +151,9 @@ public: ...@@ -152,9 +151,9 @@ public:
*/ */
int __get_min_source() int __get_min_source()
{ return _M_losers[0]._M_source; } { return _M_losers[0]._M_source; }
}; };
/** /**
* @brief Stable _LoserTree variant. * @brief Stable _LoserTree variant.
* *
* Provides the stable implementations of insert_start, __init_winner, * Provides the stable implementations of insert_start, __init_winner,
...@@ -162,33 +161,33 @@ public: ...@@ -162,33 +161,33 @@ public:
* *
* Unstable variant is done using partial specialisation below. * Unstable variant is done using partial specialisation below.
*/ */
template<bool __stable/* default == true */, typename _Tp, typename _Compare> template<bool __stable/* default == true */, typename _Tp,
class _LoserTree : public _LoserTreeBase<_Tp, _Compare> typename _Compare>
{ class _LoserTree : public _LoserTreeBase<_Tp, _Compare>
typedef _LoserTreeBase<_Tp, _Compare> Base; {
using Base::_M_k; typedef _LoserTreeBase<_Tp, _Compare> _Base;
using Base::_M_losers; using _Base::_M_k;
using Base::_M_first_insert; using _Base::_M_losers;
using _Base::_M_first_insert;
public: public:
_LoserTree(unsigned int __k, _Compare __comp) _LoserTree(unsigned int __k, _Compare __comp)
: Base::_LoserTreeBase(__k, __comp) : _Base::_LoserTreeBase(__k, __comp)
{} { }
unsigned int unsigned int
__init_winner(unsigned int __root) __init_winner(unsigned int __root)
{ {
if (__root >= _M_k) if (__root >= _M_k)
{
return __root; return __root;
}
else else
{ {
unsigned int __left = __init_winner (2 * __root); unsigned int __left = __init_winner (2 * __root);
unsigned int __right = __init_winner (2 * __root + 1); unsigned int __right = __init_winner (2 * __root + 1);
if (_M_losers[__right]._M_sup if (_M_losers[__right]._M_sup
|| (!_M_losers[__left]._M_sup || (!_M_losers[__left]._M_sup
&& !_M_comp(_M_losers[__right]._M_key, _M_losers[__left]._M_key))) && !_M_comp(_M_losers[__right]._M_key,
_M_losers[__left]._M_key)))
{ {
// Left one is less or equal. // Left one is less or equal.
_M_losers[__root] = _M_losers[__right]; _M_losers[__root] = _M_losers[__right];
...@@ -212,8 +211,10 @@ public: ...@@ -212,8 +211,10 @@ public:
* *
* This implementation is stable. * This implementation is stable.
*/ */
// Do not pass a const reference since _M_key will be used as local variable. // Do not pass a const reference since _M_key will be used as
void __delete_min_insert(_Tp _M_key, bool _M_sup) // local variable.
void
__delete_min_insert(_Tp _M_key, bool _M_sup)
{ {
#if _GLIBCXX_ASSERTIONS #if _GLIBCXX_ASSERTIONS
// no dummy sequence can ever be at the top! // no dummy sequence can ever be at the top!
...@@ -221,7 +222,8 @@ public: ...@@ -221,7 +222,8 @@ public:
#endif #endif
int _M_source = _M_losers[0]._M_source; int _M_source = _M_losers[0]._M_source;
for (unsigned int __pos = (_M_k + _M_source) / 2; __pos > 0; __pos /= 2) for (unsigned int __pos = (_M_k + _M_source) / 2; __pos > 0;
__pos /= 2)
{ {
// The smaller one gets promoted, ties are broken by _M_source. // The smaller one gets promoted, ties are broken by _M_source.
if ((_M_sup && (!_M_losers[__pos]._M_sup if ((_M_sup && (!_M_losers[__pos]._M_sup
...@@ -242,27 +244,27 @@ public: ...@@ -242,27 +244,27 @@ public:
_M_losers[0]._M_source = _M_source; _M_losers[0]._M_source = _M_source;
_M_losers[0]._M_key = _M_key; _M_losers[0]._M_key = _M_key;
} }
}; };
/** /**
* @brief Unstable _LoserTree variant. * @brief Unstable _LoserTree variant.
* *
* Stability (non-stable here) is selected with partial specialization. * Stability (non-stable here) is selected with partial specialization.
*/ */
template<typename _Tp, typename _Compare> template<typename _Tp, typename _Compare>
class _LoserTree</* __stable == */false, _Tp, _Compare> : class _LoserTree</* __stable == */false, _Tp, _Compare>
public _LoserTreeBase<_Tp, _Compare> : public _LoserTreeBase<_Tp, _Compare>
{ {
typedef _LoserTreeBase<_Tp, _Compare> Base; typedef _LoserTreeBase<_Tp, _Compare> _Base;
using Base::_M_log_k; using _Base::_M_log_k;
using Base::_M_k; using _Base::_M_k;
using Base::_M_losers; using _Base::_M_losers;
using Base::_M_first_insert; using _Base::_M_first_insert;
public: public:
_LoserTree(unsigned int __k, _Compare __comp) _LoserTree(unsigned int __k, _Compare __comp)
: Base::_LoserTreeBase(__k, __comp) : _Base::_LoserTreeBase(__k, __comp)
{} { }
/** /**
* Computes the winner of the competition at position "__root". * Computes the winner of the competition at position "__root".
...@@ -272,19 +274,18 @@ public: ...@@ -272,19 +274,18 @@ public:
* @param __root __index of the "game" to start. * @param __root __index of the "game" to start.
*/ */
unsigned int unsigned int
__init_winner (unsigned int __root) __init_winner(unsigned int __root)
{ {
if (__root >= _M_k) if (__root >= _M_k)
{
return __root; return __root;
}
else else
{ {
unsigned int __left = __init_winner (2 * __root); unsigned int __left = __init_winner (2 * __root);
unsigned int __right = __init_winner (2 * __root + 1); unsigned int __right = __init_winner (2 * __root + 1);
if (_M_losers[__right]._M_sup if (_M_losers[__right]._M_sup
|| (!_M_losers[__left]._M_sup || (!_M_losers[__left]._M_sup
&& !_M_comp(_M_losers[__right]._M_key, _M_losers[__left]._M_key))) && !_M_comp(_M_losers[__right]._M_key,
_M_losers[__left]._M_key)))
{ {
// Left one is less or equal. // Left one is less or equal.
_M_losers[__root] = _M_losers[__right]; _M_losers[__root] = _M_losers[__right];
...@@ -299,18 +300,20 @@ public: ...@@ -299,18 +300,20 @@ public:
} }
} }
inline void void
__init() __init()
{ _M_losers[0] = _M_losers[__init_winner(1)]; } { _M_losers[0] = _M_losers[__init_winner(1)]; }
/** /**
* Delete the _M_key smallest element and insert the element _M_key instead. * Delete the _M_key smallest element and insert the element _M_key
* instead.
* *
* @param _M_key the _M_key to insert * @param _M_key the _M_key to insert
* @param _M_sup true iff _M_key is an explicitly marked supremum * @param _M_sup true iff _M_key is an explicitly marked supremum
*/ */
// Do not pass a const reference since _M_key will be used as local variable. // Do not pass a const reference since _M_key will be used as local
inline void // variable.
void
__delete_min_insert(_Tp _M_key, bool _M_sup) __delete_min_insert(_Tp _M_key, bool _M_sup)
{ {
#if _GLIBCXX_ASSERTIONS #if _GLIBCXX_ASSERTIONS
...@@ -319,7 +322,8 @@ public: ...@@ -319,7 +322,8 @@ public:
#endif #endif
int _M_source = _M_losers[0]._M_source; int _M_source = _M_losers[0]._M_source;
for (unsigned int __pos = (_M_k + _M_source) / 2; __pos > 0; __pos /= 2) for (unsigned int __pos = (_M_k + _M_source) / 2; __pos > 0;
__pos /= 2)
{ {
// The smaller one gets promoted. // The smaller one gets promoted.
if (_M_sup || (!_M_losers[__pos]._M_sup if (_M_sup || (!_M_losers[__pos]._M_sup
...@@ -336,16 +340,15 @@ public: ...@@ -336,16 +340,15 @@ public:
_M_losers[0]._M_source = _M_source; _M_losers[0]._M_source = _M_source;
_M_losers[0]._M_key = _M_key; _M_losers[0]._M_key = _M_key;
} }
}; };
/** /**
* @brief Base class of _Loser Tree implementation using pointers. * @brief Base class of _Loser Tree implementation using pointers.
*/ */
template<typename _Tp, typename _Compare> template<typename _Tp, typename _Compare>
class _LoserTreePointerBase class _LoserTreePointerBase
{ {
protected: protected:
/** @brief Internal representation of _LoserTree __elements. */ /** @brief Internal representation of _LoserTree __elements. */
struct _Loser struct _Loser
{ {
...@@ -358,8 +361,9 @@ protected: ...@@ -358,8 +361,9 @@ protected:
_Loser* _M_losers; _Loser* _M_losers;
_Compare _M_comp; _Compare _M_comp;
public: public:
_LoserTreePointerBase(unsigned int __k, _Compare __comp = std::less<_Tp>()) _LoserTreePointerBase(unsigned int __k,
_Compare __comp = std::less<_Tp>())
: _M_comp(__comp) : _M_comp(__comp)
{ {
_M_ik = __k; _M_ik = __k;
...@@ -386,7 +390,7 @@ public: ...@@ -386,7 +390,7 @@ public:
_M_losers[__pos]._M_source = _M_source; _M_losers[__pos]._M_source = _M_source;
_M_losers[__pos]._M_keyp = &_M_key; _M_losers[__pos]._M_keyp = &_M_key;
} }
}; };
/** /**
* @brief Stable _LoserTree implementation. * @brief Stable _LoserTree implementation.
...@@ -394,24 +398,23 @@ public: ...@@ -394,24 +398,23 @@ public:
* The unstable variant is implemented using partial instantiation below. * The unstable variant is implemented using partial instantiation below.
*/ */
template<bool __stable/* default == true */, typename _Tp, typename _Compare> template<bool __stable/* default == true */, typename _Tp, typename _Compare>
class _LoserTreePointer : public _LoserTreePointerBase<_Tp, _Compare> class _LoserTreePointer
{ : public _LoserTreePointerBase<_Tp, _Compare>
typedef _LoserTreePointerBase<_Tp, _Compare> Base; {
using Base::_M_k; typedef _LoserTreePointerBase<_Tp, _Compare> _Base;
using Base::_M_losers; using _Base::_M_k;
using _Base::_M_losers;
public: public:
_LoserTreePointer(unsigned int __k, _Compare __comp = std::less<_Tp>()) _LoserTreePointer(unsigned int __k, _Compare __comp = std::less<_Tp>())
: Base::_LoserTreePointerBase(__k, __comp) : _Base::_LoserTreePointerBase(__k, __comp)
{} { }
unsigned int unsigned int
__init_winner(unsigned int __root) __init_winner(unsigned int __root)
{ {
if (__root >= _M_k) if (__root >= _M_k)
{
return __root; return __root;
}
else else
{ {
unsigned int __left = __init_winner (2 * __root); unsigned int __left = __init_winner (2 * __root);
...@@ -467,7 +470,7 @@ public: ...@@ -467,7 +470,7 @@ public:
_M_losers[0]._M_source = _M_source; _M_losers[0]._M_source = _M_source;
_M_losers[0]._M_keyp = _M_keyp; _M_losers[0]._M_keyp = _M_keyp;
} }
}; };
/** /**
* @brief Unstable _LoserTree implementation. * @brief Unstable _LoserTree implementation.
...@@ -475,25 +478,23 @@ public: ...@@ -475,25 +478,23 @@ public:
* The stable variant is above. * The stable variant is above.
*/ */
template<typename _Tp, typename _Compare> template<typename _Tp, typename _Compare>
class _LoserTreePointer</* __stable == */false, _Tp, _Compare> : class _LoserTreePointer</* __stable == */false, _Tp, _Compare>
public _LoserTreePointerBase<_Tp, _Compare> : public _LoserTreePointerBase<_Tp, _Compare>
{ {
typedef _LoserTreePointerBase<_Tp, _Compare> Base; typedef _LoserTreePointerBase<_Tp, _Compare> _Base;
using Base::_M_k; using _Base::_M_k;
using Base::_M_losers; using _Base::_M_losers;
public: public:
_LoserTreePointer(unsigned int __k, _Compare __comp = std::less<_Tp>()) _LoserTreePointer(unsigned int __k, _Compare __comp = std::less<_Tp>())
: Base::_LoserTreePointerBase(__k, __comp) : _Base::_LoserTreePointerBase(__k, __comp)
{} { }
unsigned int unsigned int
__init_winner(unsigned int __root) __init_winner(unsigned int __root)
{ {
if (__root >= _M_k) if (__root >= _M_k)
{
return __root; return __root;
}
else else
{ {
unsigned int __left = __init_winner (2 * __root); unsigned int __left = __init_winner (2 * __root);
...@@ -528,7 +529,8 @@ public: ...@@ -528,7 +529,8 @@ public:
const _Tp* _M_keyp = &_M_key; const _Tp* _M_keyp = &_M_key;
int _M_source = _M_losers[0]._M_source; int _M_source = _M_losers[0]._M_source;
for (unsigned int __pos = (_M_k + _M_source) / 2; __pos > 0; __pos /= 2) for (unsigned int __pos = (_M_k + _M_source) / 2; __pos > 0;
__pos /= 2)
{ {
// The smaller one gets promoted. // The smaller one gets promoted.
if (_M_sup || (!_M_losers[__pos]._M_sup if (_M_sup || (!_M_losers[__pos]._M_sup
...@@ -545,7 +547,7 @@ public: ...@@ -545,7 +547,7 @@ public:
_M_losers[0]._M_source = _M_source; _M_losers[0]._M_source = _M_source;
_M_losers[0]._M_keyp = _M_keyp; _M_losers[0]._M_keyp = _M_keyp;
} }
}; };
/** @brief Base class for unguarded _LoserTree implementation. /** @brief Base class for unguarded _LoserTree implementation.
* *
...@@ -558,9 +560,9 @@ public: ...@@ -558,9 +560,9 @@ public:
* This is a very fast variant. * This is a very fast variant.
*/ */
template<typename _Tp, typename _Compare> template<typename _Tp, typename _Compare>
class _LoserTreeUnguardedBase class _LoserTreeUnguardedBase
{ {
protected: protected:
struct _Loser struct _Loser
{ {
int _M_source; int _M_source;
...@@ -571,8 +573,7 @@ protected: ...@@ -571,8 +573,7 @@ protected:
_Loser* _M_losers; _Loser* _M_losers;
_Compare _M_comp; _Compare _M_comp;
public: public:
inline
_LoserTreeUnguardedBase(unsigned int __k, const _Tp _sentinel, _LoserTreeUnguardedBase(unsigned int __k, const _Tp _sentinel,
_Compare __comp = std::less<_Tp>()) _Compare __comp = std::less<_Tp>())
: _M_comp(__comp) : _M_comp(__comp)
...@@ -593,10 +594,10 @@ public: ...@@ -593,10 +594,10 @@ public:
} }
} }
inline ~_LoserTreeUnguardedBase() ~_LoserTreeUnguardedBase()
{ ::operator delete(_M_losers); } { ::operator delete(_M_losers); }
inline int int
__get_min_source() __get_min_source()
{ {
#if _GLIBCXX_ASSERTIONS #if _GLIBCXX_ASSERTIONS
...@@ -606,7 +607,7 @@ public: ...@@ -606,7 +607,7 @@ public:
return _M_losers[0]._M_source; return _M_losers[0]._M_source;
} }
inline void void
__insert_start(const _Tp& _M_key, int _M_source, bool) __insert_start(const _Tp& _M_key, int _M_source, bool)
{ {
unsigned int __pos = _M_k + _M_source; unsigned int __pos = _M_k + _M_source;
...@@ -614,7 +615,7 @@ public: ...@@ -614,7 +615,7 @@ public:
new(&(_M_losers[__pos]._M_key)) _Tp(_M_key); new(&(_M_losers[__pos]._M_key)) _Tp(_M_key);
_M_losers[__pos]._M_source = _M_source; _M_losers[__pos]._M_source = _M_source;
} }
}; };
/** /**
* @brief Stable implementation of unguarded _LoserTree. * @brief Stable implementation of unguarded _LoserTree.
...@@ -622,25 +623,24 @@ public: ...@@ -622,25 +623,24 @@ public:
* Unstable variant is selected below with partial specialization. * Unstable variant is selected below with partial specialization.
*/ */
template<bool __stable/* default == true */, typename _Tp, typename _Compare> template<bool __stable/* default == true */, typename _Tp, typename _Compare>
class _LoserTreeUnguarded : public _LoserTreeUnguardedBase<_Tp, _Compare> class _LoserTreeUnguarded
{ : public _LoserTreeUnguardedBase<_Tp, _Compare>
typedef _LoserTreeUnguardedBase<_Tp, _Compare> Base; {
using Base::_M_k; typedef _LoserTreeUnguardedBase<_Tp, _Compare> _Base;
using Base::_M_losers; using _Base::_M_k;
using _Base::_M_losers;
public: public:
_LoserTreeUnguarded(unsigned int __k, const _Tp _sentinel, _LoserTreeUnguarded(unsigned int __k, const _Tp _sentinel,
_Compare __comp = std::less<_Tp>()) _Compare __comp = std::less<_Tp>())
: Base::_LoserTreeUnguardedBase(__k, _sentinel, __comp) : _Base::_LoserTreeUnguardedBase(__k, _sentinel, __comp)
{} { }
unsigned int unsigned int
__init_winner(unsigned int __root) __init_winner(unsigned int __root)
{ {
if (__root >= _M_k) if (__root >= _M_k)
{
return __root; return __root;
}
else else
{ {
unsigned int __left = __init_winner (2 * __root); unsigned int __left = __init_winner (2 * __root);
...@@ -660,19 +660,21 @@ public: ...@@ -660,19 +660,21 @@ public:
} }
} }
inline void void
__init() __init()
{ {
_M_losers[0] = _M_losers[__init_winner(1)]; _M_losers[0] = _M_losers[__init_winner(1)];
#if _GLIBCXX_ASSERTIONS #if _GLIBCXX_ASSERTIONS
// no dummy sequence can ever be at the top at the beginning (0 sequences!) // no dummy sequence can ever be at the top at the beginning
// (0 sequences!)
_GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1); _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
#endif #endif
} }
// Do not pass a const reference since _M_key will be used as local variable. // Do not pass a const reference since _M_key will be used as
inline void // local variable.
void
__delete_min_insert(_Tp _M_key, bool) __delete_min_insert(_Tp _M_key, bool)
{ {
#if _GLIBCXX_ASSERTIONS #if _GLIBCXX_ASSERTIONS
...@@ -697,7 +699,7 @@ public: ...@@ -697,7 +699,7 @@ public:
_M_losers[0]._M_source = _M_source; _M_losers[0]._M_source = _M_source;
_M_losers[0]._M_key = _M_key; _M_losers[0]._M_key = _M_key;
} }
}; };
/** /**
* @brief Non-Stable implementation of unguarded _LoserTree. * @brief Non-Stable implementation of unguarded _LoserTree.
...@@ -705,26 +707,24 @@ public: ...@@ -705,26 +707,24 @@ public:
* Stable implementation is above. * Stable implementation is above.
*/ */
template<typename _Tp, typename _Compare> template<typename _Tp, typename _Compare>
class _LoserTreeUnguarded</* __stable == */false, _Tp, _Compare> : class _LoserTreeUnguarded</* __stable == */false, _Tp, _Compare>
public _LoserTreeUnguardedBase<_Tp, _Compare> : public _LoserTreeUnguardedBase<_Tp, _Compare>
{ {
typedef _LoserTreeUnguardedBase<_Tp, _Compare> Base; typedef _LoserTreeUnguardedBase<_Tp, _Compare> _Base;
using Base::_M_k; using _Base::_M_k;
using Base::_M_losers; using _Base::_M_losers;
public: public:
_LoserTreeUnguarded(unsigned int __k, const _Tp _sentinel, _LoserTreeUnguarded(unsigned int __k, const _Tp _sentinel,
_Compare __comp = std::less<_Tp>()) _Compare __comp = std::less<_Tp>())
: Base::_LoserTreeUnguardedBase(__k, _sentinel, __comp) : _Base::_LoserTreeUnguardedBase(__k, _sentinel, __comp)
{} { }
unsigned int unsigned int
__init_winner (unsigned int __root) __init_winner(unsigned int __root)
{ {
if (__root >= _M_k) if (__root >= _M_k)
{
return __root; return __root;
}
else else
{ {
unsigned int __left = __init_winner (2 * __root); unsigned int __left = __init_winner (2 * __root);
...@@ -751,19 +751,21 @@ public: ...@@ -751,19 +751,21 @@ public:
} }
} }
inline void void
__init() __init()
{ {
_M_losers[0] = _M_losers[__init_winner(1)]; _M_losers[0] = _M_losers[__init_winner(1)];
#if _GLIBCXX_ASSERTIONS #if _GLIBCXX_ASSERTIONS
// no dummy sequence can ever be at the top at the beginning (0 sequences!) // no dummy sequence can ever be at the top at the beginning
// (0 sequences!)
_GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1); _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
#endif #endif
} }
// Do not pass a const reference since _M_key will be used as local variable. // Do not pass a const reference since _M_key will be used as
inline void // local variable.
void
__delete_min_insert(_Tp _M_key, bool) __delete_min_insert(_Tp _M_key, bool)
{ {
#if _GLIBCXX_ASSERTIONS #if _GLIBCXX_ASSERTIONS
...@@ -786,7 +788,7 @@ public: ...@@ -786,7 +788,7 @@ public:
_M_losers[0]._M_source = _M_source; _M_losers[0]._M_source = _M_source;
_M_losers[0]._M_key = _M_key; _M_losers[0]._M_key = _M_key;
} }
}; };
/** @brief Unguarded loser tree, keeping only pointers to the /** @brief Unguarded loser tree, keeping only pointers to the
* elements in the tree structure. * elements in the tree structure.
...@@ -795,9 +797,9 @@ public: ...@@ -795,9 +797,9 @@ public:
* run empty. This is a very fast variant. * run empty. This is a very fast variant.
*/ */
template<typename _Tp, typename _Compare> template<typename _Tp, typename _Compare>
class LoserTreePointerUnguardedBase class LoserTreePointerUnguardedBase
{ {
protected: protected:
struct _Loser struct _Loser
{ {
int _M_source; int _M_source;
...@@ -808,9 +810,8 @@ protected: ...@@ -808,9 +810,8 @@ protected:
_Loser* _M_losers; _Loser* _M_losers;
_Compare _M_comp; _Compare _M_comp;
public: public:
inline
LoserTreePointerUnguardedBase(unsigned int __k, const _Tp& _sentinel, LoserTreePointerUnguardedBase(unsigned int __k, const _Tp& _sentinel,
_Compare __comp = std::less<_Tp>()) _Compare __comp = std::less<_Tp>())
: _M_comp(__comp) : _M_comp(__comp)
...@@ -830,10 +831,10 @@ public: ...@@ -830,10 +831,10 @@ public:
} }
} }
inline ~LoserTreePointerUnguardedBase() ~LoserTreePointerUnguardedBase()
{ delete[] _M_losers; } { delete[] _M_losers; }
inline int int
__get_min_source() __get_min_source()
{ {
#if _GLIBCXX_ASSERTIONS #if _GLIBCXX_ASSERTIONS
...@@ -843,7 +844,7 @@ public: ...@@ -843,7 +844,7 @@ public:
return _M_losers[0]._M_source; return _M_losers[0]._M_source;
} }
inline void void
__insert_start(const _Tp& _M_key, int _M_source, bool) __insert_start(const _Tp& _M_key, int _M_source, bool)
{ {
unsigned int __pos = _M_k + _M_source; unsigned int __pos = _M_k + _M_source;
...@@ -851,7 +852,7 @@ public: ...@@ -851,7 +852,7 @@ public:
_M_losers[__pos]._M_keyp = &_M_key; _M_losers[__pos]._M_keyp = &_M_key;
_M_losers[__pos]._M_source = _M_source; _M_losers[__pos]._M_source = _M_source;
} }
}; };
/** /**
* @brief Stable unguarded _LoserTree variant storing pointers. * @brief Stable unguarded _LoserTree variant storing pointers.
...@@ -859,31 +860,30 @@ public: ...@@ -859,31 +860,30 @@ public:
* Unstable variant is implemented below using partial specialization. * Unstable variant is implemented below using partial specialization.
*/ */
template<bool __stable/* default == true */, typename _Tp, typename _Compare> template<bool __stable/* default == true */, typename _Tp, typename _Compare>
class _LoserTreePointerUnguarded : class _LoserTreePointerUnguarded
public LoserTreePointerUnguardedBase<_Tp, _Compare> : public LoserTreePointerUnguardedBase<_Tp, _Compare>
{ {
typedef LoserTreePointerUnguardedBase<_Tp, _Compare> Base; typedef LoserTreePointerUnguardedBase<_Tp, _Compare> _Base;
using Base::_M_k; using _Base::_M_k;
using Base::_M_losers; using _Base::_M_losers;
public: public:
_LoserTreePointerUnguarded(unsigned int __k, const _Tp& _sentinel, _LoserTreePointerUnguarded(unsigned int __k, const _Tp& _sentinel,
_Compare __comp = std::less<_Tp>()) _Compare __comp = std::less<_Tp>())
: Base::LoserTreePointerUnguardedBase(__k, _sentinel, __comp) : _Base::LoserTreePointerUnguardedBase(__k, _sentinel, __comp)
{} { }
unsigned int unsigned int
__init_winner(unsigned int __root) __init_winner(unsigned int __root)
{ {
if (__root >= _M_k) if (__root >= _M_k)
{
return __root; return __root;
}
else else
{ {
unsigned int __left = __init_winner (2 * __root); unsigned int __left = __init_winner (2 * __root);
unsigned int __right = __init_winner (2 * __root + 1); unsigned int __right = __init_winner (2 * __root + 1);
if (!_M_comp(*_M_losers[__right]._M_keyp, *_M_losers[__left]._M_keyp)) if (!_M_comp(*_M_losers[__right]._M_keyp,
*_M_losers[__left]._M_keyp))
{ {
// Left one is less or equal. // Left one is less or equal.
_M_losers[__root] = _M_losers[__right]; _M_losers[__root] = _M_losers[__right];
...@@ -898,18 +898,19 @@ public: ...@@ -898,18 +898,19 @@ public:
} }
} }
inline void void
__init() __init()
{ {
_M_losers[0] = _M_losers[__init_winner(1)]; _M_losers[0] = _M_losers[__init_winner(1)];
#if _GLIBCXX_ASSERTIONS #if _GLIBCXX_ASSERTIONS
// no dummy sequence can ever be at the top at the beginning (0 sequences!) // no dummy sequence can ever be at the top at the beginning
// (0 sequences!)
_GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1); _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
#endif #endif
} }
inline void void
__delete_min_insert(const _Tp& _M_key, bool _M_sup) __delete_min_insert(const _Tp& _M_key, bool _M_sup)
{ {
#if _GLIBCXX_ASSERTIONS #if _GLIBCXX_ASSERTIONS
...@@ -935,7 +936,7 @@ public: ...@@ -935,7 +936,7 @@ public:
_M_losers[0]._M_source = _M_source; _M_losers[0]._M_source = _M_source;
_M_losers[0]._M_keyp = _M_keyp; _M_losers[0]._M_keyp = _M_keyp;
} }
}; };
/** /**
* @brief Unstable unguarded _LoserTree variant storing pointers. * @brief Unstable unguarded _LoserTree variant storing pointers.
...@@ -943,26 +944,24 @@ public: ...@@ -943,26 +944,24 @@ public:
* Stable variant is above. * Stable variant is above.
*/ */
template<typename _Tp, typename _Compare> template<typename _Tp, typename _Compare>
class _LoserTreePointerUnguarded</* __stable == */false, _Tp, _Compare> : class _LoserTreePointerUnguarded</* __stable == */false, _Tp, _Compare>
public LoserTreePointerUnguardedBase<_Tp, _Compare> : public LoserTreePointerUnguardedBase<_Tp, _Compare>
{ {
typedef LoserTreePointerUnguardedBase<_Tp, _Compare> Base; typedef LoserTreePointerUnguardedBase<_Tp, _Compare> _Base;
using Base::_M_k; using _Base::_M_k;
using Base::_M_losers; using _Base::_M_losers;
public: public:
_LoserTreePointerUnguarded(unsigned int __k, const _Tp& _sentinel, _LoserTreePointerUnguarded(unsigned int __k, const _Tp& _sentinel,
_Compare __comp = std::less<_Tp>()) _Compare __comp = std::less<_Tp>())
: Base::LoserTreePointerUnguardedBase(__k, _sentinel, __comp) : _Base::LoserTreePointerUnguardedBase(__k, _sentinel, __comp)
{} { }
unsigned int unsigned int
__init_winner(unsigned int __root) __init_winner(unsigned int __root)
{ {
if (__root >= _M_k) if (__root >= _M_k)
{
return __root; return __root;
}
else else
{ {
unsigned int __left = __init_winner (2 * __root); unsigned int __left = __init_winner (2 * __root);
...@@ -974,7 +973,8 @@ public: ...@@ -974,7 +973,8 @@ public:
_GLIBCXX_PARALLEL_ASSERT(_M_losers[__right]._M_source == -1); _GLIBCXX_PARALLEL_ASSERT(_M_losers[__right]._M_source == -1);
#endif #endif
if (!_M_comp(*_M_losers[__right]._M_keyp, *_M_losers[__left]._M_keyp)) if (!_M_comp(*_M_losers[__right]._M_keyp,
*_M_losers[__left]._M_keyp))
{ {
// Left one is less or equal. // Left one is less or equal.
_M_losers[__root] = _M_losers[__right]; _M_losers[__root] = _M_losers[__right];
...@@ -989,18 +989,19 @@ public: ...@@ -989,18 +989,19 @@ public:
} }
} }
inline void void
__init() __init()
{ {
_M_losers[0] = _M_losers[__init_winner(1)]; _M_losers[0] = _M_losers[__init_winner(1)];
#if _GLIBCXX_ASSERTIONS #if _GLIBCXX_ASSERTIONS
// no dummy sequence can ever be at the top at the beginning (0 sequences!) // no dummy sequence can ever be at the top at the beginning
// (0 sequences!)
_GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1); _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
#endif #endif
} }
inline void void
__delete_min_insert(const _Tp& _M_key, bool _M_sup) __delete_min_insert(const _Tp& _M_key, bool _M_sup)
{ {
#if _GLIBCXX_ASSERTIONS #if _GLIBCXX_ASSERTIONS
...@@ -1024,8 +1025,7 @@ public: ...@@ -1024,8 +1025,7 @@ public:
_M_losers[0]._M_source = _M_source; _M_losers[0]._M_source = _M_source;
_M_losers[0]._M_keyp = _M_keyp; _M_losers[0]._M_keyp = _M_keyp;
} }
}; };
} // namespace __gnu_parallel } // namespace __gnu_parallel
#endif /* _GLIBCXX_PARALLEL_LOSERTREE_H */ #endif /* _GLIBCXX_PARALLEL_LOSERTREE_H */
...@@ -510,9 +510,9 @@ template<template<typename RAI, typename C> class iterator, ...@@ -510,9 +510,9 @@ template<template<typename RAI, typename C> class iterator,
/** @brief Multi-way merging procedure for a high branching factor, /** @brief Multi-way merging procedure for a high branching factor,
* guarded case. * guarded case.
* *
* This merging variant uses a LoserTree class as selected by <tt>LT</tt>. * This merging variant uses a LoserTree class as selected by <tt>_LT</tt>.
* *
* Stability is selected through the used LoserTree class <tt>LT</tt>. * Stability is selected through the used LoserTree class <tt>_LT</tt>.
* *
* At least one non-empty sequence is required. * At least one non-empty sequence is required.
* *
...@@ -525,7 +525,7 @@ template<template<typename RAI, typename C> class iterator, ...@@ -525,7 +525,7 @@ template<template<typename RAI, typename C> class iterator,
* *
* @return End iterator of output sequence. * @return End iterator of output sequence.
*/ */
template<typename LT, template<typename _LT,
typename _RAIterIterator, typename _RAIterIterator,
typename _RAIter3, typename _RAIter3,
typename _DifferenceTp, typename _DifferenceTp,
...@@ -547,7 +547,7 @@ template<typename LT, ...@@ -547,7 +547,7 @@ template<typename LT,
int __k = static_cast<int>(__seqs_end - __seqs_begin); int __k = static_cast<int>(__seqs_end - __seqs_begin);
LT __lt(__k, __comp); _LT __lt(__k, __comp);
// Default value for potentially non-default-constructible types. // Default value for potentially non-default-constructible types.
_ValueType* __arbitrary_element = NULL; _ValueType* __arbitrary_element = NULL;
...@@ -592,7 +592,7 @@ template<typename LT, ...@@ -592,7 +592,7 @@ template<typename LT,
/** @brief Multi-way merging procedure for a high branching factor, /** @brief Multi-way merging procedure for a high branching factor,
* unguarded case. * unguarded case.
* *
* Merging is done using the LoserTree class <tt>LT</tt>. * Merging is done using the LoserTree class <tt>_LT</tt>.
* *
* Stability is selected by the used LoserTrees. * Stability is selected by the used LoserTrees.
* *
...@@ -607,7 +607,7 @@ template<typename LT, ...@@ -607,7 +607,7 @@ template<typename LT,
* *
* @return End iterator of output sequence. * @return End iterator of output sequence.
*/ */
template<typename LT, template<typename _LT,
typename _RAIterIterator, typename _RAIterIterator,
typename _RAIter3, typename _RAIter3,
typename _DifferenceTp, typename _Compare> typename _DifferenceTp, typename _Compare>
...@@ -633,7 +633,7 @@ template<typename LT, ...@@ -633,7 +633,7 @@ template<typename LT,
int __k = __seqs_end - __seqs_begin; int __k = __seqs_end - __seqs_begin;
LT __lt(__k, __sentinel, __comp); _LT __lt(__k, __sentinel, __comp);
for (int __t = 0; __t < __k; ++__t) for (int __t = 0; __t < __k; ++__t)
{ {
...@@ -696,8 +696,7 @@ template<typename LT, ...@@ -696,8 +696,7 @@ template<typename LT,
* *
* @return End iterator of output sequence. * @return End iterator of output sequence.
*/ */
template< template<typename UnguardedLoserTree,
typename UnguardedLoserTree,
typename _RAIterIterator, typename _RAIterIterator,
typename _RAIter3, typename _RAIter3,
typename _DifferenceTp, typename _DifferenceTp,
...@@ -790,113 +789,102 @@ struct _LoserTreeTraits ...@@ -790,113 +789,102 @@ struct _LoserTreeTraits
* *
* Note that 3-way merging is always stable! * Note that 3-way merging is always stable!
*/ */
template< template<bool __sentinels /*default == false*/,
bool __sentinels /*default == false*/,
typename _RAIterIterator, typename _RAIterIterator,
typename _RAIter3, typename _RAIter3,
typename _DifferenceTp, typename _DifferenceTp,
typename _Compare> typename _Compare>
struct __multiway_merge_3_variant_sentinel_switch struct __multiway_merge_3_variant_sentinel_switch
{ {
_RAIter3 operator()( _RAIter3 operator()(_RAIterIterator __seqs_begin,
_RAIterIterator __seqs_begin,
_RAIterIterator __seqs_end, _RAIterIterator __seqs_end,
_RAIter3 __target, _RAIter3 __target,
_DifferenceTp __length, _Compare __comp) _DifferenceTp __length, _Compare __comp)
{ {
return multiway_merge_3_variant<_GuardedIterator>( return multiway_merge_3_variant<_GuardedIterator>
__seqs_begin, __seqs_end, __target, __length, __comp); (__seqs_begin, __seqs_end, __target, __length, __comp);
} }
}; };
/** /**
* @brief Switch for 3-way merging with __sentinels turned on. * @brief Switch for 3-way merging with __sentinels turned on.
* *
* Note that 3-way merging is always stable! * Note that 3-way merging is always stable!
*/ */
template< template<typename _RAIterIterator,
typename _RAIterIterator,
typename _RAIter3, typename _RAIter3,
typename _DifferenceTp, typename _DifferenceTp,
typename _Compare> typename _Compare>
struct __multiway_merge_3_variant_sentinel_switch struct __multiway_merge_3_variant_sentinel_switch
<true, _RAIterIterator, _RAIter3, <true, _RAIterIterator, _RAIter3, _DifferenceTp, _Compare>
_DifferenceTp, _Compare> {
{ _RAIter3 operator()(_RAIterIterator __seqs_begin,
_RAIter3 operator()(
_RAIterIterator __seqs_begin,
_RAIterIterator __seqs_end, _RAIterIterator __seqs_end,
_RAIter3 __target, _RAIter3 __target,
_DifferenceTp __length, _Compare __comp) _DifferenceTp __length, _Compare __comp)
{ {
return multiway_merge_3_variant<_UnguardedIterator>( return multiway_merge_3_variant<_UnguardedIterator>
__seqs_begin, __seqs_end, __target, __length, __comp); (__seqs_begin, __seqs_end, __target, __length, __comp);
} }
}; };
/** /**
* @brief Switch for 4-way merging with __sentinels turned off. * @brief Switch for 4-way merging with __sentinels turned off.
* *
* Note that 4-way merging is always stable! * Note that 4-way merging is always stable!
*/ */
template< template<bool __sentinels /*default == false*/,
bool __sentinels /*default == false*/,
typename _RAIterIterator, typename _RAIterIterator,
typename _RAIter3, typename _RAIter3,
typename _DifferenceTp, typename _DifferenceTp,
typename _Compare> typename _Compare>
struct __multiway_merge_4_variant_sentinel_switch struct __multiway_merge_4_variant_sentinel_switch
{ {
_RAIter3 operator()( _RAIter3 operator()(_RAIterIterator __seqs_begin,
_RAIterIterator __seqs_begin,
_RAIterIterator __seqs_end, _RAIterIterator __seqs_end,
_RAIter3 __target, _RAIter3 __target,
_DifferenceTp __length, _Compare __comp) _DifferenceTp __length, _Compare __comp)
{ {
return multiway_merge_4_variant<_GuardedIterator>( return multiway_merge_4_variant<_GuardedIterator>
__seqs_begin, __seqs_end, __target, __length, __comp); (__seqs_begin, __seqs_end, __target, __length, __comp);
} }
}; };
/** /**
* @brief Switch for 4-way merging with __sentinels turned on. * @brief Switch for 4-way merging with __sentinels turned on.
* *
* Note that 4-way merging is always stable! * Note that 4-way merging is always stable!
*/ */
template< template<typename _RAIterIterator,
typename _RAIterIterator,
typename _RAIter3, typename _RAIter3,
typename _DifferenceTp, typename _DifferenceTp,
typename _Compare> typename _Compare>
struct __multiway_merge_4_variant_sentinel_switch struct __multiway_merge_4_variant_sentinel_switch
<true, _RAIterIterator, _RAIter3, <true, _RAIterIterator, _RAIter3, _DifferenceTp, _Compare>
_DifferenceTp, _Compare> {
{ _RAIter3 operator()(_RAIterIterator __seqs_begin,
_RAIter3 operator()(
_RAIterIterator __seqs_begin,
_RAIterIterator __seqs_end, _RAIterIterator __seqs_end,
_RAIter3 __target, _RAIter3 __target,
_DifferenceTp __length, _Compare __comp) _DifferenceTp __length, _Compare __comp)
{ {
return multiway_merge_4_variant<_UnguardedIterator>( return multiway_merge_4_variant<_UnguardedIterator>
__seqs_begin, __seqs_end, __target, __length, __comp); (__seqs_begin, __seqs_end, __target, __length, __comp);
} }
}; };
/** /**
* @brief Switch for k-way merging with __sentinels turned on. * @brief Switch for k-way merging with __sentinels turned on.
*/ */
template< template<bool __sentinels,
bool __sentinels,
bool __stable, bool __stable,
typename _RAIterIterator, typename _RAIterIterator,
typename _RAIter3, typename _RAIter3,
typename _DifferenceTp, typename _DifferenceTp,
typename _Compare> typename _Compare>
struct __multiway_merge_k_variant_sentinel_switch struct __multiway_merge_k_variant_sentinel_switch
{ {
_RAIter3 operator()( _RAIter3 operator()
_RAIterIterator __seqs_begin, (_RAIterIterator __seqs_begin,
_RAIterIterator __seqs_end, _RAIterIterator __seqs_end,
_RAIter3 __target, _RAIter3 __target,
const typename std::iterator_traits<typename std::iterator_traits< const typename std::iterator_traits<typename std::iterator_traits<
...@@ -912,29 +900,27 @@ struct __multiway_merge_k_variant_sentinel_switch ...@@ -912,29 +900,27 @@ struct __multiway_merge_k_variant_sentinel_switch
return multiway_merge_loser_tree_sentinel< return multiway_merge_loser_tree_sentinel<
typename __gnu_cxx::__conditional_type< typename __gnu_cxx::__conditional_type<
_LoserTreeTraits<_ValueType>::_M_use_pointer _LoserTreeTraits<_ValueType>::_M_use_pointer,
, _LoserTreePointerUnguarded<__stable, _ValueType, _Compare> _LoserTreePointerUnguarded<__stable, _ValueType, _Compare>,
, _LoserTreeUnguarded<__stable, _ValueType, _Compare> _LoserTreeUnguarded<__stable, _ValueType, _Compare>
>::__type>( >::__type>(
__seqs_begin, __seqs_end, __target, __sentinel, __length, __comp); __seqs_begin, __seqs_end, __target, __sentinel, __length, __comp);
} }
}; };
/** /**
* @brief Switch for k-way merging with __sentinels turned off. * @brief Switch for k-way merging with __sentinels turned off.
*/ */
template< template<bool __stable,
bool __stable,
typename _RAIterIterator, typename _RAIterIterator,
typename _RAIter3, typename _RAIter3,
typename _DifferenceTp, typename _DifferenceTp,
typename _Compare> typename _Compare>
struct __multiway_merge_k_variant_sentinel_switch struct __multiway_merge_k_variant_sentinel_switch
<false, __stable, _RAIterIterator, _RAIter3, <false, __stable, _RAIterIterator, _RAIter3, _DifferenceTp, _Compare>
_DifferenceTp, _Compare> {
{ _RAIter3 operator()
_RAIter3 operator()( (_RAIterIterator __seqs_begin,
_RAIterIterator __seqs_begin,
_RAIterIterator __seqs_end, _RAIterIterator __seqs_end,
_RAIter3 __target, _RAIter3 __target,
const typename std::iterator_traits<typename std::iterator_traits< const typename std::iterator_traits<typename std::iterator_traits<
...@@ -950,12 +936,12 @@ struct __multiway_merge_k_variant_sentinel_switch ...@@ -950,12 +936,12 @@ struct __multiway_merge_k_variant_sentinel_switch
return multiway_merge_loser_tree< return multiway_merge_loser_tree<
typename __gnu_cxx::__conditional_type< typename __gnu_cxx::__conditional_type<
_LoserTreeTraits<_ValueType>::_M_use_pointer _LoserTreeTraits<_ValueType>::_M_use_pointer,
, _LoserTreePointer<__stable, _ValueType, _Compare> _LoserTreePointer<__stable, _ValueType, _Compare>,
, _LoserTree<__stable, _ValueType, _Compare> _LoserTree<__stable, _ValueType, _Compare>
>::__type >(__seqs_begin, __seqs_end, __target, __length, __comp); >::__type >(__seqs_begin, __seqs_end, __target, __length, __comp);
} }
}; };
/** @brief Sequential multi-way merging switch. /** @brief Sequential multi-way merging switch.
* *
...@@ -970,8 +956,7 @@ struct __multiway_merge_k_variant_sentinel_switch ...@@ -970,8 +956,7 @@ struct __multiway_merge_k_variant_sentinel_switch
* @param __stable Stable merging incurs a performance penalty. * @param __stable Stable merging incurs a performance penalty.
* @param __sentinel The sequences have __a __sentinel element. * @param __sentinel The sequences have __a __sentinel element.
* @return End iterator of output sequence. */ * @return End iterator of output sequence. */
template< template<bool __stable,
bool __stable,
bool __sentinels, bool __sentinels,
typename _RAIterIterator, typename _RAIterIterator,
typename _RAIter3, typename _RAIter3,
...@@ -1035,28 +1020,28 @@ template< ...@@ -1035,28 +1020,28 @@ template<
break; break;
case 3: case 3:
__return_target = __multiway_merge_3_variant_sentinel_switch< __return_target = __multiway_merge_3_variant_sentinel_switch<
__sentinels __sentinels,
, _RAIterIterator _RAIterIterator,
, _RAIter3 _RAIter3,
, _DifferenceTp _DifferenceTp,
, _Compare>()(__seqs_begin, __seqs_end, __target, __length, __comp); _Compare>()(__seqs_begin, __seqs_end, __target, __length, __comp);
break; break;
case 4: case 4:
__return_target = __multiway_merge_4_variant_sentinel_switch< __return_target = __multiway_merge_4_variant_sentinel_switch<
__sentinels __sentinels,
, _RAIterIterator _RAIterIterator,
, _RAIter3 _RAIter3,
, _DifferenceTp _DifferenceTp,
, _Compare>()(__seqs_begin, __seqs_end, __target, __length, __comp); _Compare>()(__seqs_begin, __seqs_end, __target, __length, __comp);
break; break;
default: default:
__return_target = __multiway_merge_k_variant_sentinel_switch< __return_target = __multiway_merge_k_variant_sentinel_switch<
__sentinels __sentinels,
, __stable __stable,
, _RAIterIterator _RAIterIterator,
, _RAIter3 _RAIter3,
, _DifferenceTp _DifferenceTp,
, _Compare>()(__seqs_begin, __seqs_end, __target, __sentinel, _Compare>()(__seqs_begin, __seqs_end, __target, __sentinel,
__length, __comp); __length, __comp);
break; break;
} }
...@@ -1074,12 +1059,12 @@ template< ...@@ -1074,12 +1059,12 @@ template<
* Used to reduce code instanciation in multiway_merge_sampling_splitting. * Used to reduce code instanciation in multiway_merge_sampling_splitting.
*/ */
template<bool __stable, class _RAIter, class _StrictWeakOrdering> template<bool __stable, class _RAIter, class _StrictWeakOrdering>
struct _SamplingSorter struct _SamplingSorter
{ {
void operator()(_RAIter __first, _RAIter __last, void operator()(_RAIter __first, _RAIter __last,
_StrictWeakOrdering __comp) _StrictWeakOrdering __comp)
{ __gnu_sequential::stable_sort(__first, __last, __comp); } { __gnu_sequential::stable_sort(__first, __last, __comp); }
}; };
/** /**
* @brief Non-__stable sorting functor. * @brief Non-__stable sorting functor.
...@@ -1087,27 +1072,27 @@ struct _SamplingSorter ...@@ -1087,27 +1072,27 @@ struct _SamplingSorter
* Used to reduce code instantiation in multiway_merge_sampling_splitting. * Used to reduce code instantiation in multiway_merge_sampling_splitting.
*/ */
template<class _RAIter, class _StrictWeakOrdering> template<class _RAIter, class _StrictWeakOrdering>
struct _SamplingSorter<false, _RAIter, _StrictWeakOrdering> struct _SamplingSorter<false, _RAIter, _StrictWeakOrdering>
{ {
void operator()(_RAIter __first, _RAIter __last, void operator()(_RAIter __first, _RAIter __last,
_StrictWeakOrdering __comp) _StrictWeakOrdering __comp)
{ __gnu_sequential::sort(__first, __last, __comp); } { __gnu_sequential::sort(__first, __last, __comp); }
}; };
/** /**
* @brief Sampling based splitting for parallel multiway-merge routine. * @brief Sampling based splitting for parallel multiway-merge routine.
*/ */
template< template<bool __stable,
bool __stable typename _RAIterIterator,
, typename _RAIterIterator typename _Compare,
, typename _Compare typename _DifferenceType>
, typename _DifferenceType> void
void multiway_merge_sampling_splitting( multiway_merge_sampling_splitting
_RAIterIterator __seqs_begin, (_RAIterIterator __seqs_begin,
_RAIterIterator __seqs_end, _RAIterIterator __seqs_end,
_DifferenceType __length, _DifferenceType __total_length, _Compare __comp, _DifferenceType __length, _DifferenceType __total_length, _Compare __comp,
std::vector<std::pair<_DifferenceType, _DifferenceType> > *__pieces) std::vector<std::pair<_DifferenceType, _DifferenceType> > *__pieces)
{ {
typedef typename std::iterator_traits<_RAIterIterator> typedef typename std::iterator_traits<_RAIterIterator>
::value_type::first_type ::value_type::first_type
_RAIter1; _RAIter1;
...@@ -1122,15 +1107,15 @@ void multiway_merge_sampling_splitting( ...@@ -1122,15 +1107,15 @@ void multiway_merge_sampling_splitting(
_DifferenceType __num_samples = _DifferenceType __num_samples =
__gnu_parallel::_Settings::get().merge_oversampling * __num_threads; __gnu_parallel::_Settings::get().merge_oversampling * __num_threads;
_ValueType* __samples = static_cast<_ValueType*>( _ValueType* __samples = static_cast<_ValueType*>
::operator new(sizeof(_ValueType) * __k * __num_samples)); (::operator new(sizeof(_ValueType) * __k * __num_samples));
// Sample. // Sample.
for (int __s = 0; __s < __k; ++__s) for (int __s = 0; __s < __k; ++__s)
for (_DifferenceType __i = 0; __i < __num_samples; ++__i) for (_DifferenceType __i = 0; __i < __num_samples; ++__i)
{ {
_DifferenceType sample_index = _DifferenceType sample_index =
static_cast<_DifferenceType>( static_cast<_DifferenceType>
_GLIBCXX_PARALLEL_LENGTH(__seqs_begin[__s]) (_GLIBCXX_PARALLEL_LENGTH(__seqs_begin[__s])
* (double(__i + 1) / (__num_samples + 1)) * (double(__i + 1) / (__num_samples + 1))
* (double(__length) / __total_length)); * (double(__length) / __total_length));
new(&(__samples[__s * __num_samples + __i])) new(&(__samples[__s * __num_samples + __i]))
...@@ -1139,8 +1124,8 @@ void multiway_merge_sampling_splitting( ...@@ -1139,8 +1124,8 @@ void multiway_merge_sampling_splitting(
// Sort stable or non-stable, depending on value of template parameter // Sort stable or non-stable, depending on value of template parameter
// "__stable". // "__stable".
_SamplingSorter<__stable, _ValueType*, _Compare>()( _SamplingSorter<__stable, _ValueType*, _Compare>()
__samples, __samples + (__num_samples * __k), __comp); (__samples, __samples + (__num_samples * __k), __comp);
for (int __slab = 0; __slab < __num_threads; ++__slab) for (int __slab = 0; __slab < __num_threads; ++__slab)
// For each slab / processor. // For each slab / processor.
...@@ -1149,19 +1134,18 @@ void multiway_merge_sampling_splitting( ...@@ -1149,19 +1134,18 @@ void multiway_merge_sampling_splitting(
// For each sequence. // For each sequence.
if (__slab > 0) if (__slab > 0)
__pieces[__slab][__seq].first = __pieces[__slab][__seq].first =
std::upper_bound( std::upper_bound
__seqs_begin[__seq].first, (__seqs_begin[__seq].first,
__seqs_begin[__seq].second, __seqs_begin[__seq].second,
__samples[__num_samples * __k * __slab / __num_threads], __samples[__num_samples * __k * __slab / __num_threads],
__comp) __comp) - __seqs_begin[__seq].first;
- __seqs_begin[__seq].first;
else else
// Absolute beginning. // Absolute beginning.
__pieces[__slab][__seq].first = 0; __pieces[__slab][__seq].first = 0;
if ((__slab + 1) < __num_threads) if ((__slab + 1) < __num_threads)
__pieces[__slab][__seq].second = __pieces[__slab][__seq].second =
std::upper_bound( std::upper_bound
__seqs_begin[__seq].first, (__seqs_begin[__seq].first,
__seqs_begin[__seq].second, __seqs_begin[__seq].second,
__samples[__num_samples * __k * (__slab + 1) / __samples[__num_samples * __k * (__slab + 1) /
__num_threads], __comp) __num_threads], __comp)
...@@ -1172,24 +1156,25 @@ void multiway_merge_sampling_splitting( ...@@ -1172,24 +1156,25 @@ void multiway_merge_sampling_splitting(
= _GLIBCXX_PARALLEL_LENGTH(__seqs_begin[__seq]); = _GLIBCXX_PARALLEL_LENGTH(__seqs_begin[__seq]);
} }
::operator delete(__samples); ::operator delete(__samples);
} }
/** /**
* @brief Exact splitting for parallel multiway-merge routine. * @brief Exact splitting for parallel multiway-merge routine.
* *
* None of the passed sequences may be empty. * None of the passed sequences may be empty.
*/ */
template< template<bool __stable,
bool __stable typename _RAIterIterator,
, typename _RAIterIterator typename _Compare,
, typename _Compare typename _DifferenceType>
, typename _DifferenceType> void
void multiway_merge_exact_splitting( multiway_merge_exact_splitting
_RAIterIterator __seqs_begin, (_RAIterIterator __seqs_begin,
_RAIterIterator __seqs_end, _RAIterIterator __seqs_end,
_DifferenceType __length, _DifferenceType __total_length, _Compare __comp, _DifferenceType __length, _DifferenceType __total_length,
_Compare __comp,
std::vector<std::pair<_DifferenceType, _DifferenceType> > *__pieces) std::vector<std::pair<_DifferenceType, _DifferenceType> > *__pieces)
{ {
typedef typename std::iterator_traits<_RAIterIterator> typedef typename std::iterator_traits<_RAIterIterator>
::value_type::first_type ::value_type::first_type
_RAIter1; _RAIter1;
...@@ -1204,9 +1189,7 @@ void multiway_merge_exact_splitting( ...@@ -1204,9 +1189,7 @@ void multiway_merge_exact_splitting(
// (Settings::multiway_merge_splitting == __gnu_parallel::_Settings::EXACT). // (Settings::multiway_merge_splitting == __gnu_parallel::_Settings::EXACT).
std::vector<_RAIter1>* __offsets = std::vector<_RAIter1>* __offsets =
new std::vector<_RAIter1>[__num_threads]; new std::vector<_RAIter1>[__num_threads];
std::vector< std::vector<std::pair<_RAIter1, _RAIter1> > __se(__k);
std::pair<_RAIter1, _RAIter1>
> __se(__k);
copy(__seqs_begin, __seqs_end, __se.begin()); copy(__seqs_begin, __seqs_end, __se.begin());
...@@ -1217,8 +1200,8 @@ void multiway_merge_exact_splitting( ...@@ -1217,8 +1200,8 @@ void multiway_merge_exact_splitting(
for (int __s = 0; __s < (__num_threads - 1); ++__s) for (int __s = 0; __s < (__num_threads - 1); ++__s)
{ {
__offsets[__s].resize(__k); __offsets[__s].resize(__k);
multiseq_partition( multiseq_partition
__se.begin(), __se.end(), __borders[__s + 1], (__se.begin(), __se.end(), __borders[__s + 1],
__offsets[__s].begin(), __comp); __offsets[__s].begin(), __comp);
// Last one also needed and available. // Last one also needed and available.
...@@ -1258,7 +1241,7 @@ void multiway_merge_exact_splitting( ...@@ -1258,7 +1241,7 @@ void multiway_merge_exact_splitting(
} }
} }
delete[] __offsets; delete[] __offsets;
} }
/** @brief Parallel multi-way merge routine. /** @brief Parallel multi-way merge routine.
* *
...@@ -1279,15 +1262,13 @@ void multiway_merge_exact_splitting( ...@@ -1279,15 +1262,13 @@ void multiway_merge_exact_splitting(
* @param __sentinel Ignored. * @param __sentinel Ignored.
* @return End iterator of output sequence. * @return End iterator of output sequence.
*/ */
template< template<bool __stable,
bool __stable,
bool __sentinels, bool __sentinels,
typename _RAIterIterator, typename _RAIterIterator,
typename _RAIter3, typename _RAIter3,
typename _DifferenceTp, typename _DifferenceTp,
typename _Splitter, typename _Splitter,
typename _Compare typename _Compare>
>
_RAIter3 _RAIter3
parallel_multiway_merge(_RAIterIterator __seqs_begin, parallel_multiway_merge(_RAIterIterator __seqs_begin,
_RAIterIterator __seqs_end, _RAIterIterator __seqs_end,
...@@ -1475,18 +1456,17 @@ template< ...@@ -1475,18 +1456,17 @@ template<
*/ */
// multiway_merge // multiway_merge
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut multiway_merge(_RAIterPairIterator __seqs_begin,
multiway_merge(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp __gnu_parallel::sequential_tag)
, __gnu_parallel::sequential_tag) {
{
typedef _DifferenceTp _DifferenceType; typedef _DifferenceTp _DifferenceType;
_GLIBCXX_CALL(__seqs_end - __seqs_begin) _GLIBCXX_CALL(__seqs_end - __seqs_begin)
...@@ -1499,21 +1479,20 @@ multiway_merge(_RAIterPairIterator __seqs_begin ...@@ -1499,21 +1479,20 @@ multiway_merge(_RAIterPairIterator __seqs_begin
</* __stable = */ false, /* __sentinels = */ false> </* __stable = */ false, /* __sentinels = */ false>
(__seqs_begin, __seqs_end, __target, (__seqs_begin, __seqs_end, __target,
*(__seqs_begin->second), __length, __comp); *(__seqs_begin->second), __length, __comp);
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut multiway_merge(_RAIterPairIterator __seqs_begin,
multiway_merge(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp __gnu_parallel::exact_tag __tag)
, __gnu_parallel::exact_tag __tag) {
{
typedef _DifferenceTp _DifferenceType; typedef _DifferenceTp _DifferenceType;
_GLIBCXX_CALL(__seqs_end - __seqs_begin) _GLIBCXX_CALL(__seqs_end - __seqs_begin)
...@@ -1543,21 +1522,20 @@ multiway_merge(_RAIterPairIterator __seqs_begin ...@@ -1543,21 +1522,20 @@ multiway_merge(_RAIterPairIterator __seqs_begin
</* __stable = */ false, /* __sentinels = */ false>( </* __stable = */ false, /* __sentinels = */ false>(
__seqs_begin, __seqs_end, __target, *(__seqs_begin->second), __seqs_begin, __seqs_end, __target, *(__seqs_begin->second),
__length, __comp); __length, __comp);
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut multiway_merge(_RAIterPairIterator __seqs_begin,
multiway_merge(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp __gnu_parallel::sampling_tag __tag)
, __gnu_parallel::sampling_tag __tag) {
{
typedef _DifferenceTp _DifferenceType; typedef _DifferenceTp _DifferenceType;
_GLIBCXX_CALL(__seqs_end - __seqs_begin) _GLIBCXX_CALL(__seqs_end - __seqs_begin)
...@@ -1588,56 +1566,53 @@ multiway_merge(_RAIterPairIterator __seqs_begin ...@@ -1588,56 +1566,53 @@ multiway_merge(_RAIterPairIterator __seqs_begin
</* __stable = */ false, /* __sentinels = */ false>( </* __stable = */ false, /* __sentinels = */ false>(
__seqs_begin, __seqs_end, __seqs_begin, __seqs_end,
__target, *(__seqs_begin->second), __length, __comp); __target, *(__seqs_begin->second), __length, __comp);
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut multiway_merge(_RAIterPairIterator __seqs_begin,
multiway_merge(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp parallel_tag __tag = parallel_tag(0))
, parallel_tag __tag = parallel_tag(0)) {
{ return multiway_merge(__seqs_begin, __seqs_end, __target, __length,
return multiway_merge(__seqs_begin, __seqs_end, __target, __length, __comp, __comp, exact_tag(__tag.__get_num_threads()));
exact_tag(__tag.__get_num_threads())); }
}
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut multiway_merge(_RAIterPairIterator __seqs_begin,
multiway_merge(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp default_parallel_tag __tag)
, default_parallel_tag __tag) {
{ return multiway_merge(__seqs_begin, __seqs_end, __target, __length,
return multiway_merge(__seqs_begin, __seqs_end, __target, __length, __comp, __comp, exact_tag(__tag.__get_num_threads()));
exact_tag(__tag.__get_num_threads())); }
}
// stable_multiway_merge // stable_multiway_merge
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut stable_multiway_merge(_RAIterPairIterator __seqs_begin,
stable_multiway_merge(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp __gnu_parallel::sequential_tag)
, __gnu_parallel::sequential_tag) {
{
typedef _DifferenceTp _DifferenceType; typedef _DifferenceTp _DifferenceType;
_GLIBCXX_CALL(__seqs_end - __seqs_begin) _GLIBCXX_CALL(__seqs_end - __seqs_begin)
...@@ -1650,21 +1625,20 @@ stable_multiway_merge(_RAIterPairIterator __seqs_begin ...@@ -1650,21 +1625,20 @@ stable_multiway_merge(_RAIterPairIterator __seqs_begin
</* __stable = */ true, /* __sentinels = */ false> </* __stable = */ true, /* __sentinels = */ false>
(__seqs_begin, __seqs_end, __target, *(__seqs_begin->second), __length, (__seqs_begin, __seqs_end, __target, *(__seqs_begin->second), __length,
__comp); __comp);
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut stable_multiway_merge(_RAIterPairIterator __seqs_begin,
stable_multiway_merge(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp __gnu_parallel::exact_tag __tag)
, __gnu_parallel::exact_tag __tag) {
{
typedef _DifferenceTp _DifferenceType; typedef _DifferenceTp _DifferenceType;
_GLIBCXX_CALL(__seqs_end - __seqs_begin) _GLIBCXX_CALL(__seqs_end - __seqs_begin)
...@@ -1695,21 +1669,20 @@ stable_multiway_merge(_RAIterPairIterator __seqs_begin ...@@ -1695,21 +1669,20 @@ stable_multiway_merge(_RAIterPairIterator __seqs_begin
/* __sentinels = */ false>( /* __sentinels = */ false>(
__seqs_begin, __seqs_end, __seqs_begin, __seqs_end,
__target, *(__seqs_begin->second), __length, __comp); __target, *(__seqs_begin->second), __length, __comp);
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut stable_multiway_merge(_RAIterPairIterator __seqs_begin,
stable_multiway_merge(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp sampling_tag __tag)
, sampling_tag __tag) {
{
typedef _DifferenceTp _DifferenceType; typedef _DifferenceTp _DifferenceType;
_GLIBCXX_CALL(__seqs_end - __seqs_begin) _GLIBCXX_CALL(__seqs_end - __seqs_begin)
...@@ -1740,44 +1713,41 @@ stable_multiway_merge(_RAIterPairIterator __seqs_begin ...@@ -1740,44 +1713,41 @@ stable_multiway_merge(_RAIterPairIterator __seqs_begin
</* __stable = */ true, /* __sentinels = */ false>( </* __stable = */ true, /* __sentinels = */ false>(
__seqs_begin, __seqs_end, __seqs_begin, __seqs_end,
__target, *(__seqs_begin->second), __length, __comp); __target, *(__seqs_begin->second), __length, __comp);
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut stable_multiway_merge(_RAIterPairIterator __seqs_begin,
stable_multiway_merge(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp parallel_tag __tag = parallel_tag(0))
, parallel_tag __tag = parallel_tag(0)) {
{ return stable_multiway_merge
return stable_multiway_merge( (__seqs_begin, __seqs_end, __target, __length, __comp,
__seqs_begin, __seqs_end, __target, __length, __comp,
exact_tag(__tag.__get_num_threads())); exact_tag(__tag.__get_num_threads()));
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut stable_multiway_merge(_RAIterPairIterator __seqs_begin,
stable_multiway_merge(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp default_parallel_tag __tag)
, default_parallel_tag __tag) {
{ return stable_multiway_merge
return stable_multiway_merge( (__seqs_begin, __seqs_end, __target, __length, __comp,
__seqs_begin, __seqs_end, __target, __length, __comp,
exact_tag(__tag.__get_num_threads())); exact_tag(__tag.__get_num_threads()));
} }
/** /**
* @brief Multiway Merge Frontend. * @brief Multiway Merge Frontend.
...@@ -1856,18 +1826,17 @@ stable_multiway_merge(_RAIterPairIterator __seqs_begin ...@@ -1856,18 +1826,17 @@ stable_multiway_merge(_RAIterPairIterator __seqs_begin
*/ */
// multiway_merge_sentinels // multiway_merge_sentinels
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
multiway_merge_sentinels(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp __gnu_parallel::sequential_tag)
, __gnu_parallel::sequential_tag) {
{
typedef _DifferenceTp _DifferenceType; typedef _DifferenceTp _DifferenceType;
_GLIBCXX_CALL(__seqs_end - __seqs_begin) _GLIBCXX_CALL(__seqs_end - __seqs_begin)
...@@ -1880,21 +1849,20 @@ multiway_merge_sentinels(_RAIterPairIterator __seqs_begin ...@@ -1880,21 +1849,20 @@ multiway_merge_sentinels(_RAIterPairIterator __seqs_begin
</* __stable = */ false, /* __sentinels = */ true> </* __stable = */ false, /* __sentinels = */ true>
(__seqs_begin, __seqs_end, (__seqs_begin, __seqs_end,
__target, *(__seqs_begin->second), __length, __comp); __target, *(__seqs_begin->second), __length, __comp);
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
multiway_merge_sentinels(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp __gnu_parallel::exact_tag __tag)
, __gnu_parallel::exact_tag __tag) {
{
typedef _DifferenceTp _DifferenceType; typedef _DifferenceTp _DifferenceType;
_GLIBCXX_CALL(__seqs_end - __seqs_begin) _GLIBCXX_CALL(__seqs_end - __seqs_begin)
...@@ -1925,21 +1893,20 @@ multiway_merge_sentinels(_RAIterPairIterator __seqs_begin ...@@ -1925,21 +1893,20 @@ multiway_merge_sentinels(_RAIterPairIterator __seqs_begin
</* __stable = */ false, /* __sentinels = */ true>( </* __stable = */ false, /* __sentinels = */ true>(
__seqs_begin, __seqs_end, __seqs_begin, __seqs_end,
__target, *(__seqs_begin->second), __length, __comp); __target, *(__seqs_begin->second), __length, __comp);
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
multiway_merge_sentinels(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp sampling_tag __tag)
, sampling_tag __tag) {
{
typedef _DifferenceTp _DifferenceType; typedef _DifferenceTp _DifferenceType;
_GLIBCXX_CALL(__seqs_end - __seqs_begin) _GLIBCXX_CALL(__seqs_end - __seqs_begin)
...@@ -1969,58 +1936,55 @@ multiway_merge_sentinels(_RAIterPairIterator __seqs_begin ...@@ -1969,58 +1936,55 @@ multiway_merge_sentinels(_RAIterPairIterator __seqs_begin
</* __stable = */false, /* __sentinels = */ true>( </* __stable = */false, /* __sentinels = */ true>(
__seqs_begin, __seqs_end, __seqs_begin, __seqs_end,
__target, *(__seqs_begin->second), __length, __comp); __target, *(__seqs_begin->second), __length, __comp);
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
multiway_merge_sentinels(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp parallel_tag __tag = parallel_tag(0))
, parallel_tag __tag = parallel_tag(0)) {
{ return multiway_merge_sentinels
return multiway_merge_sentinels( (__seqs_begin, __seqs_end, __target, __length, __comp,
__seqs_begin, __seqs_end, __target, __length, __comp,
exact_tag(__tag.__get_num_threads())); exact_tag(__tag.__get_num_threads()));
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
multiway_merge_sentinels(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp default_parallel_tag __tag)
, default_parallel_tag __tag) {
{ return multiway_merge_sentinels
return multiway_merge_sentinels( (__seqs_begin, __seqs_end, __target, __length, __comp,
__seqs_begin, __seqs_end, __target, __length, __comp,
exact_tag(__tag.__get_num_threads())); exact_tag(__tag.__get_num_threads()));
} }
// stable_multiway_merge_sentinels // stable_multiway_merge_sentinels
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp __gnu_parallel::sequential_tag)
, __gnu_parallel::sequential_tag) {
{
typedef _DifferenceTp _DifferenceType; typedef _DifferenceTp _DifferenceType;
_GLIBCXX_CALL(__seqs_end - __seqs_begin) _GLIBCXX_CALL(__seqs_end - __seqs_begin)
...@@ -2031,23 +1995,22 @@ stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin ...@@ -2031,23 +1995,22 @@ stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin
// Execute multiway merge *sequentially*. // Execute multiway merge *sequentially*.
return __sequential_multiway_merge return __sequential_multiway_merge
</* __stable = */ true, /* __sentinels = */ true> </* __stable = */ true, /* __sentinels = */ true>
(__seqs_begin, __seqs_end, __target, *(__seqs_begin->second), __length, (__seqs_begin, __seqs_end, __target, *(__seqs_begin->second),
__comp); __length, __comp);
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp __gnu_parallel::exact_tag __tag)
, __gnu_parallel::exact_tag __tag) {
{
typedef _DifferenceTp _DifferenceType; typedef _DifferenceTp _DifferenceType;
_GLIBCXX_CALL(__seqs_end - __seqs_begin) _GLIBCXX_CALL(__seqs_end - __seqs_begin)
...@@ -2078,21 +2041,21 @@ stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin ...@@ -2078,21 +2041,21 @@ stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin
</* __stable = */ true, /* __sentinels = */ true>( </* __stable = */ true, /* __sentinels = */ true>(
__seqs_begin, __seqs_end, __target, *(__seqs_begin->second), __seqs_begin, __seqs_end, __target, *(__seqs_begin->second),
__length, __comp); __length, __comp);
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length,
, _DifferenceTp __length, _Compare __comp _Compare __comp,
, sampling_tag __tag) sampling_tag __tag)
{ {
typedef _DifferenceTp _DifferenceType; typedef _DifferenceTp _DifferenceType;
_GLIBCXX_CALL(__seqs_end - __seqs_begin) _GLIBCXX_CALL(__seqs_end - __seqs_begin)
...@@ -2123,43 +2086,42 @@ stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin ...@@ -2123,43 +2086,42 @@ stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin
</* __stable = */ true, /* __sentinels = */ true>( </* __stable = */ true, /* __sentinels = */ true>(
__seqs_begin, __seqs_end, __seqs_begin, __seqs_end,
__target, *(__seqs_begin->second), __length, __comp); __target, *(__seqs_begin->second), __length, __comp);
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length,
, _DifferenceTp __length, _Compare __comp _Compare __comp,
, parallel_tag __tag = parallel_tag(0)) parallel_tag __tag = parallel_tag(0))
{ {
return stable_multiway_merge_sentinels( return stable_multiway_merge_sentinels
__seqs_begin, __seqs_end, __target, __length, __comp, (__seqs_begin, __seqs_end, __target, __length, __comp,
exact_tag(__tag.__get_num_threads())); exact_tag(__tag.__get_num_threads()));
} }
// public interface // public interface
template< template<typename _RAIterPairIterator,
typename _RAIterPairIterator typename _RAIterOut,
, typename _RAIterOut typename _DifferenceTp,
, typename _DifferenceTp typename _Compare>
, typename _Compare> _RAIterOut
_RAIterOut stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin,
stable_multiway_merge_sentinels(_RAIterPairIterator __seqs_begin _RAIterPairIterator __seqs_end,
, _RAIterPairIterator __seqs_end _RAIterOut __target,
, _RAIterOut __target _DifferenceTp __length, _Compare __comp,
, _DifferenceTp __length, _Compare __comp default_parallel_tag __tag)
, default_parallel_tag __tag) {
{ return stable_multiway_merge_sentinels
return stable_multiway_merge_sentinels( (__seqs_begin, __seqs_end, __target, __length, __comp,
__seqs_begin, __seqs_end, __target, __length, __comp,
exact_tag(__tag.__get_num_threads())); exact_tag(__tag.__get_num_threads()));
} }
}; // namespace __gnu_parallel }; // namespace __gnu_parallel
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment