// Description: Dereferenced predicates
// Documentation: derived_predicates.txt
#ifndef PASTELSYS_DEREFERENCED_PREDICATE_H
#define PASTELSYS_DEREFERENCED_PREDICATE_H
#include "pastel/sys/predicate/predicate_concept.h"
#include "pastel/sys/operators.h"
namespace Pastel
{
    template <typename Predicate>
    class Dereferenced_Predicate
    {
    public:
        template <
            typename Left, 
            typename Right>
        bool operator()(
            const Left& left, 
            const Right& right) const
        {
            return Predicate()(*left, *right);
        }
    };
    using Dereferenced_LessThan = Dereferenced_Predicate<LessThan>;
    using Dereferenced_LessEqual = Dereferenced_Predicate<LessEqual>;
    using Dereferenced_GreaterThan = Dereferenced_Predicate<GreaterThan>;
    using Dereferenced_GreaterEqual = Dereferenced_Predicate<GreaterEqual>;
    using Dereferenced_EqualTo = Dereferenced_Predicate<EqualTo>;
    using Dereferenced_NotEqualTo = Dereferenced_Predicate<NotEqualTo>;
    template <typename Predicate>
    Dereferenced_Predicate<Predicate> dereferencedPredicate(
        const Predicate& predicate)
    {
        return Dereferenced_Predicate<Predicate>();
    }
}
#endif