http://stxxl.sourceforge.net
<dementiev@mpi-sb.mpg.de>
<beckmann@cs.uni-frankfurt.de>
http://www.boost.org/LICENSE_1_0.txt
#ifndef STXXL_STREAM__UNIQUE_H
#define STXXL_STREAM__UNIQUE_H
#include <stxxl/bits/namespace.h>
__STXXL_BEGIN_NAMESPACE
namespace stream
{
struct dummy_cmp_unique_ { };
template <class Input, class BinaryPredicate = dummy_cmp_unique_>
class unique
{
Input & input;
BinaryPredicate binary_pred;
typename Input::value_type current;
public:
typedef typename Input::value_type value_type;
unique(Input & input_, BinaryPredicate binary_pred_) : input(input_), binary_pred(binary_pred_)
{
if (!input.empty())
current = *input;
}
unique & operator ++ ()
{
value_type old_value = current;
++input;
while (!input.empty() && (binary_pred(current = *input, old_value)))
++input;
return *this;
}
const value_type & operator * () const
{
return current;
}
const value_type * operator -> () const
{
return ¤t;
}
bool empty() const
{
return input.empty();
}
};
template <class Input>
class unique<Input, dummy_cmp_unique_>
{
Input & input;
typename Input::value_type current;
public:
typedef typename Input::value_type value_type;
unique(Input & input_) : input(input_)
{
if (!input.empty())
current = *input;
}
unique & operator ++ ()
{
value_type old_value = current;
++input;
while (!input.empty() && ((current = *input) == old_value))
++input;
return *this;
}
const value_type & operator * () const
{
return current;
}
const value_type * operator -> () const
{
return ¤t;
}
bool empty() const
{
return input.empty();
}
};
}
__STXXL_END_NAMESPACE
#endif