1*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 2*58b9f456SAndroid Build Coastguard Worker // 3*58b9f456SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*58b9f456SAndroid Build Coastguard Worker // 5*58b9f456SAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open 6*58b9f456SAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details. 7*58b9f456SAndroid Build Coastguard Worker // 8*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*58b9f456SAndroid Build Coastguard Worker 10*58b9f456SAndroid Build Coastguard Worker #ifndef TEST_SUPPORT_COUNTING_PREDICATES_H 11*58b9f456SAndroid Build Coastguard Worker #define TEST_SUPPORT_COUNTING_PREDICATES_H 12*58b9f456SAndroid Build Coastguard Worker 13*58b9f456SAndroid Build Coastguard Worker #include <cstddef> 14*58b9f456SAndroid Build Coastguard Worker 15*58b9f456SAndroid Build Coastguard Worker template <typename Predicate, typename Arg> 16*58b9f456SAndroid Build Coastguard Worker struct unary_counting_predicate { 17*58b9f456SAndroid Build Coastguard Worker public: 18*58b9f456SAndroid Build Coastguard Worker typedef Arg argument_type; 19*58b9f456SAndroid Build Coastguard Worker typedef bool result_type; 20*58b9f456SAndroid Build Coastguard Worker unary_counting_predicateunary_counting_predicate21*58b9f456SAndroid Build Coastguard Worker unary_counting_predicate(Predicate p) : p_(p), count_(0) {} ~unary_counting_predicateunary_counting_predicate22*58b9f456SAndroid Build Coastguard Worker ~unary_counting_predicate() {} 23*58b9f456SAndroid Build Coastguard Worker operator ()unary_counting_predicate24*58b9f456SAndroid Build Coastguard Worker bool operator () (const Arg &a) const { ++count_; return p_(a); } countunary_counting_predicate25*58b9f456SAndroid Build Coastguard Worker size_t count() const { return count_; } resetunary_counting_predicate26*58b9f456SAndroid Build Coastguard Worker void reset() { count_ = 0; } 27*58b9f456SAndroid Build Coastguard Worker 28*58b9f456SAndroid Build Coastguard Worker private: 29*58b9f456SAndroid Build Coastguard Worker Predicate p_; 30*58b9f456SAndroid Build Coastguard Worker mutable size_t count_; 31*58b9f456SAndroid Build Coastguard Worker }; 32*58b9f456SAndroid Build Coastguard Worker 33*58b9f456SAndroid Build Coastguard Worker 34*58b9f456SAndroid Build Coastguard Worker template <typename Predicate, typename Arg1, typename Arg2=Arg1> 35*58b9f456SAndroid Build Coastguard Worker struct binary_counting_predicate { 36*58b9f456SAndroid Build Coastguard Worker public: 37*58b9f456SAndroid Build Coastguard Worker typedef Arg1 first_argument_type; 38*58b9f456SAndroid Build Coastguard Worker typedef Arg2 second_argument_type; 39*58b9f456SAndroid Build Coastguard Worker typedef bool result_type; 40*58b9f456SAndroid Build Coastguard Worker binary_counting_predicatebinary_counting_predicate41*58b9f456SAndroid Build Coastguard Worker binary_counting_predicate ( Predicate p ) : p_(p), count_(0) {} ~binary_counting_predicatebinary_counting_predicate42*58b9f456SAndroid Build Coastguard Worker ~binary_counting_predicate() {} 43*58b9f456SAndroid Build Coastguard Worker operator ()binary_counting_predicate44*58b9f456SAndroid Build Coastguard Worker bool operator () (const Arg1 &a1, const Arg2 &a2) const { ++count_; return p_(a1, a2); } countbinary_counting_predicate45*58b9f456SAndroid Build Coastguard Worker size_t count() const { return count_; } resetbinary_counting_predicate46*58b9f456SAndroid Build Coastguard Worker void reset() { count_ = 0; } 47*58b9f456SAndroid Build Coastguard Worker 48*58b9f456SAndroid Build Coastguard Worker private: 49*58b9f456SAndroid Build Coastguard Worker Predicate p_; 50*58b9f456SAndroid Build Coastguard Worker mutable size_t count_; 51*58b9f456SAndroid Build Coastguard Worker }; 52*58b9f456SAndroid Build Coastguard Worker 53*58b9f456SAndroid Build Coastguard Worker #endif // TEST_SUPPORT_COUNTING_PREDICATES_H 54