111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//                     The LLVM Compiler Infrastructure
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details.
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __COUNTING_PREDICATES_H
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __COUNTING_PREDICATES_H
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename Predicate, typename Arg>
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct unary_counting_predicate : public std::unary_function<Arg, bool>  {
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    unary_counting_predicate(Predicate p) : p_(p), count_(0) {}
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ~unary_counting_predicate() {}
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    bool operator () (const Arg &a) const { ++count_; return p_(a); }
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    size_t count() const { return count_; }
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void reset() { count_ = 0; }
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprivate:
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    Predicate p_;
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    mutable size_t count_;
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename Predicate, typename Arg1, typename Arg2=Arg1>
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct binary_counting_predicate : public std::binary_function<Arg1, Arg2, bool> {
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    binary_counting_predicate ( Predicate p ) : p_(p), count_(0) {}
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ~binary_counting_predicate() {}
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    bool operator () (const Arg1 &a1, const Arg2 &a2) const { ++count_; return p_(a1, a2); }
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    size_t count() const { return count_; }
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void reset() { count_ = 0; }
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprivate:
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    Predicate p_;
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    mutable size_t count_;
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // __COUNTING_PREDICATES_H
47