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