// Description: Complement indicator
// Detail: Accepts objects rejected by another indicator.
// Documentation: indicator.txt
#ifndef PASTELSYS_COMPLEMENT_INDICATOR_H
#define PASTELSYS_COMPLEMENT_INDICATOR_H
#include "pastel/sys/indicator/indicator_concept.h"
namespace Pastel
{
    template <typename Indicator>
    class Complement_Indicator
    {
    public:
        Complement_Indicator()
            : inner_()
        {
        }
        explicit Complement_Indicator(
            const Indicator& that)
            : inner_(that)
        {
        }
        template <typename Type>
        bool operator()(const Type& that) const
        {
            return !inner_(that);
        }
    private:
        Indicator inner_;
    };
    template <typename Indicator>
    Complement_Indicator<Indicator> complementIndicator(
        const Indicator& that)
    {
        return Complement_Indicator<Indicator>(that);
    }
}
#endif