enum ComparisonResult
{
less = -1,
equal = 0,
greater = 1
};
template<typename T>
class CompareChain : std::binary_function<const T&, const T&, bool>
{
typedef boost::function<ComparisonResult( const T& lhs, const T& rhs )> CompareFunctor;
public:
CompareChain( const CompareFunctor& f1 )
{
functions.push_back( f1 );
}
CompareChain( const CompareFunctor& f1, const CompareFunctor& f2 )
{
functions.push_back( f1 );
functions.push_back( f2 );
}
CompareChain( const CompareFunctor& f1, const CompareFunctor& f2, const CompareFunctor& f3 )
{
functions.push_back( f1 );
functions.push_back( f2 );
functions.push_back( f3 );
}
bool operator()( const T& lhs, const T& rhs ) const
{
BOOST_FOREACH( CompareFunctor f, functions )
{
switch( f( lhs, rhs ) )
{
case less:
return true;
case greater:
return false;
}
}
return false;
}
private:
std::vector<CompareFunctor> functions;
};