STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Classes | Public Member Functions | Protected Attributes | List of all members
__gnu_parallel::_LoserTreeBase< _Tp, _Compare > Class Template Reference

Guarded loser/tournament tree. More...

#include <parallel/losertree.h>

Inheritance diagram for __gnu_parallel::_LoserTreeBase< _Tp, _Compare >:
__gnu_parallel::_LoserTree< __stable, _Tp, _Compare > __gnu_parallel::_LoserTree< false, _Tp, _Compare >

Classes

struct  _Loser
 Internal representation of a _LoserTree element. More...
 

Public Member Functions

 _LoserTreeBase (unsigned int __k, _Compare __comp)
 The constructor. More...
 
 ~_LoserTreeBase ()
 The destructor. More...
 
void __insert_start (const _Tp &__key, int __source, bool __sup)
 Initializes the sequence "_M_source" with the element "__key". More...
 
int __get_min_source ()
 

Protected Attributes

unsigned int _M_ik
 
unsigned int _M_k
 
unsigned int _M_offset
 
unsigned int _M_log_k
 
_Loser_M_losers
 _LoserTree __elements. More...
 
_Compare _M_comp
 _Compare to use. More...
 
bool _M_first_insert
 State flag that determines whether the _LoserTree is empty. More...
 

Detailed Description

template<typename _Tp, typename _Compare>
class __gnu_parallel::_LoserTreeBase< _Tp, _Compare >

Guarded loser/tournament tree.

The smallest element is at the top.

Guarding is done explicitly through one flag _M_sup per element, inf is not needed due to a better initialization routine. This is a well-performing variant.

Parameters
_Tpthe element type
_Comparethe comparator to use, defaults to std::less<_Tp>

Constructor & Destructor Documentation

template<typename _Tp , typename _Compare >
__gnu_parallel::_LoserTreeBase< _Tp, _Compare >::_LoserTreeBase ( unsigned int  __k,
_Compare  __comp 
)
inline

The constructor.

Parameters
__kThe number of sequences to merge.
__compThe comparator to use.
95  : _M_comp(__comp)
96  {
97  _M_ik = __k;
98 
99  // Compute log_2{_M_k} for the _Loser Tree
100  _M_log_k = __rd_log2(_M_ik - 1) + 1;
101 
102  // Next greater power of 2.
103  _M_k = 1 << _M_log_k;
104  _M_offset = _M_k;
105 
106  // Avoid default-constructing _M_losers[]._M_key
107  _M_losers = static_cast<_Loser*>(::operator new(2 * _M_k
108  * sizeof(_Loser)));
109  for (unsigned int __i = _M_ik - 1; __i < _M_k; ++__i)
110  _M_losers[__i + _M_k]._M_sup = true;
111 
112  _M_first_insert = true;
113  }
_Loser * _M_losers
_LoserTree __elements.
Definition: losertree.h:75
unsigned int _M_ik
Definition: losertree.h:69
unsigned int _M_offset
Definition: losertree.h:69
_Size __rd_log2(_Size __n)
Calculates the rounded-down logarithm of __n for base 2.
Definition: base.h:102
bool _M_first_insert
State flag that determines whether the _LoserTree is empty.
Definition: losertree.h:85
unsigned int _M_log_k
Definition: losertree.h:72
_Compare _M_comp
_Compare to use.
Definition: losertree.h:78
unsigned int _M_k
Definition: losertree.h:69
template<typename _Tp , typename _Compare >
__gnu_parallel::_LoserTreeBase< _Tp, _Compare >::~_LoserTreeBase ( )
inline

The destructor.

119  {
120  for (unsigned int __i = 0; __i < (2 * _M_k); ++__i)
121  _M_losers[__i].~_Loser();
122  ::operator delete(_M_losers);
123  }
_Loser * _M_losers
_LoserTree __elements.
Definition: losertree.h:75
unsigned int _M_k
Definition: losertree.h:69

Member Function Documentation

template<typename _Tp , typename _Compare >
int __gnu_parallel::_LoserTreeBase< _Tp, _Compare >::__get_min_source ( )
inline
Returns
the index of the sequence with the smallest element.
156  { return _M_losers[0]._M_source; }
_Loser * _M_losers
_LoserTree __elements.
Definition: losertree.h:75
int _M_source
__index of the __source __sequence.
Definition: losertree.h:64
template<typename _Tp , typename _Compare >
void __gnu_parallel::_LoserTreeBase< _Tp, _Compare >::__insert_start ( const _Tp &  __key,
int  __source,
bool  __sup 
)
inline

Initializes the sequence "_M_source" with the element "__key".

Parameters
__keythe element to insert
__source__index of the __source __sequence
__supflag that determines whether the value to insert is an explicit __supremum.
135  {
136  unsigned int __pos = _M_k + __source;
137 
138  if (_M_first_insert)
139  {
140  // Construct all keys, so we can easily destruct them.
141  for (unsigned int __i = 0; __i < (2 * _M_k); ++__i)
142  ::new(&(_M_losers[__i]._M_key)) _Tp(__key);
143  _M_first_insert = false;
144  }
145  else
146  _M_losers[__pos]._M_key = __key;
147 
148  _M_losers[__pos]._M_sup = __sup;
149  _M_losers[__pos]._M_source = __source;
150  }
bool _M_sup
flag, true iff this is a "maximum" __sentinel.
Definition: losertree.h:62
_Loser * _M_losers
_LoserTree __elements.
Definition: losertree.h:75
int _M_source
__index of the __source __sequence.
Definition: losertree.h:64
bool _M_first_insert
State flag that determines whether the _LoserTree is empty.
Definition: losertree.h:85
unsigned int _M_k
Definition: losertree.h:69
_Tp _M_key
_M_key of the element in the _LoserTree.
Definition: losertree.h:66

Member Data Documentation

template<typename _Tp , typename _Compare >
_Compare __gnu_parallel::_LoserTreeBase< _Tp, _Compare >::_M_comp
protected

_Compare to use.

template<typename _Tp , typename _Compare >
bool __gnu_parallel::_LoserTreeBase< _Tp, _Compare >::_M_first_insert
protected

State flag that determines whether the _LoserTree is empty.

Only used for building the _LoserTree.

template<typename _Tp , typename _Compare >
unsigned int __gnu_parallel::_LoserTreeBase< _Tp, _Compare >::_M_ik
protected
template<typename _Tp , typename _Compare >
unsigned int __gnu_parallel::_LoserTreeBase< _Tp, _Compare >::_M_k
protected
template<typename _Tp , typename _Compare >
unsigned int __gnu_parallel::_LoserTreeBase< _Tp, _Compare >::_M_log_k
protected

log_2{_M_k}

template<typename _Tp , typename _Compare >
_Loser* __gnu_parallel::_LoserTreeBase< _Tp, _Compare >::_M_losers
protected

_LoserTree __elements.

template<typename _Tp , typename _Compare >
unsigned int __gnu_parallel::_LoserTreeBase< _Tp, _Compare >::_M_offset
protected

The documentation for this class was generated from the following file: