http://stxxl.sourceforge.net
<bingmann@kit.edu>
http://www.boost.org/LICENSE_1_0.txt
#ifndef STXXL_SORTER_HEADER
#define STXXL_SORTER_HEADER
#include <stxxl/bits/deprecated.h>
#include <stxxl/bits/stream/sort_stream.h>
__STXXL_BEGIN_NAMESPACE
#ifndef STXXL_VERBOSE_SORTER
#define STXXL_VERBOSE_SORTER STXXL_VERBOSE2
#endif
template <typename ValueType,
typename CompareType,
unsigned BlockSize = STXXL_DEFAULT_BLOCK_SIZE(ValueType),
class AllocStrategy = STXXL_DEFAULT_ALLOC_STRATEGY>
class sorter : private noncopyable
{
public:
typedef ValueType value_type;
typedef CompareType cmp_type;
enum {
block_size = BlockSize
};
typedef AllocStrategy alloc_strategy_type;
typedef stream::runs_creator< stream::use_push<ValueType>, cmp_type,
block_size, alloc_strategy_type > runs_creator_type;
typedef stream::runs_merger< typename runs_creator_type::sorted_runs_type,
cmp_type, alloc_strategy_type > runs_merger_type;
protected:
enum { STATE_INPUT, STATE_OUTPUT } m_state;
runs_creator_type m_runs_creator;
runs_merger_type m_runs_merger;
public:
sorter(const cmp_type& cmp, unsigned_type memory_to_use)
: m_state(STATE_INPUT),
m_runs_creator(cmp, memory_to_use),
m_runs_merger(cmp, memory_to_use)
{
}
sorter(const cmp_type& cmp, unsigned_type creator_memory_to_use, unsigned_type merger_memory_to_use)
: m_state(STATE_INPUT),
m_runs_creator(cmp, creator_memory_to_use),
m_runs_merger(cmp, merger_memory_to_use)
{
}
void clear()
{
if ( m_state == STATE_OUTPUT )
m_runs_merger.deallocate();
m_runs_creator.allocate();
m_state = STATE_INPUT;
}
void push(const value_type & val)
{
assert( m_state == STATE_INPUT );
m_runs_creator.push(val);
}
void finish()
{
if (m_state == STATE_OUTPUT)
{
m_runs_merger.deallocate();
}
m_runs_creator.deallocate();
}
void finish_clear()
{
if (m_state == STATE_OUTPUT)
{
m_runs_merger.deallocate();
m_runs_creator.result()->clear();
}
m_runs_creator.deallocate();
}
unsigned_type size() const
{
if ( m_state == STATE_INPUT )
return m_runs_creator.size();
else
return m_runs_merger.size();
}
void sort()
{
if (m_state == STATE_OUTPUT)
{
m_runs_merger.deallocate();
}
m_runs_creator.deallocate();
m_runs_merger.initialize(m_runs_creator.result());
m_state = STATE_OUTPUT;
}
void sort(unsigned_type merger_memory_to_use)
{
m_runs_merger.set_memory_to_use(merger_memory_to_use);
sort();
}
void sort_reuse()
{
assert( m_state == STATE_INPUT );
m_runs_merger.initialize(m_runs_creator.result());
m_state = STATE_OUTPUT;
}
void rewind()
{
assert( m_state == STATE_OUTPUT );
m_runs_merger.deallocate();
m_state = STATE_INPUT;
return sort();
}
void set_creator_memory_to_use(unsigned_type creator_memory_to_use)
{
m_runs_creator.set_memory_to_use(creator_memory_to_use);
}
void set_merger_memory_to_use(unsigned_type merger_memory_to_use)
{
m_runs_merger.set_memory_to_use(merger_memory_to_use);
}
bool empty() const
{
assert( m_state == STATE_OUTPUT );
return m_runs_merger.empty();
}
const value_type& operator * () const
{
assert( m_state == STATE_OUTPUT );
return *m_runs_merger;
}
const value_type* operator -> () const
{
return &(operator * ());
}
sorter& operator ++ ()
{
assert( m_state == STATE_OUTPUT );
++m_runs_merger;
return *this;
}
};
__STXXL_END_NAMESPACE
#endif