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 COUNTER_H 11*58b9f456SAndroid Build Coastguard Worker #define COUNTER_H 12*58b9f456SAndroid Build Coastguard Worker 13*58b9f456SAndroid Build Coastguard Worker #include <functional> // for std::hash 14*58b9f456SAndroid Build Coastguard Worker 15*58b9f456SAndroid Build Coastguard Worker #include "test_macros.h" 16*58b9f456SAndroid Build Coastguard Worker 17*58b9f456SAndroid Build Coastguard Worker struct Counter_base { static int gConstructed; }; 18*58b9f456SAndroid Build Coastguard Worker 19*58b9f456SAndroid Build Coastguard Worker template <typename T> 20*58b9f456SAndroid Build Coastguard Worker class Counter : public Counter_base 21*58b9f456SAndroid Build Coastguard Worker { 22*58b9f456SAndroid Build Coastguard Worker public: Counter()23*58b9f456SAndroid Build Coastguard Worker Counter() : data_() { ++gConstructed; } Counter(const T & data)24*58b9f456SAndroid Build Coastguard Worker Counter(const T &data) : data_(data) { ++gConstructed; } Counter(const Counter & rhs)25*58b9f456SAndroid Build Coastguard Worker Counter(const Counter& rhs) : data_(rhs.data_) { ++gConstructed; } 26*58b9f456SAndroid Build Coastguard Worker Counter& operator=(const Counter& rhs) { data_ = rhs.data_; return *this; } 27*58b9f456SAndroid Build Coastguard Worker #if TEST_STD_VER >= 11 Counter(Counter && rhs)28*58b9f456SAndroid Build Coastguard Worker Counter(Counter&& rhs) : data_(std::move(rhs.data_)) { ++gConstructed; } 29*58b9f456SAndroid Build Coastguard Worker Counter& operator=(Counter&& rhs) { ++gConstructed; data_ = std::move(rhs.data_); return *this; } 30*58b9f456SAndroid Build Coastguard Worker #endif ~Counter()31*58b9f456SAndroid Build Coastguard Worker ~Counter() { --gConstructed; } 32*58b9f456SAndroid Build Coastguard Worker get()33*58b9f456SAndroid Build Coastguard Worker const T& get() const {return data_;} 34*58b9f456SAndroid Build Coastguard Worker 35*58b9f456SAndroid Build Coastguard Worker bool operator==(const Counter& x) const {return data_ == x.data_;} 36*58b9f456SAndroid Build Coastguard Worker bool operator< (const Counter& x) const {return data_ < x.data_;} 37*58b9f456SAndroid Build Coastguard Worker 38*58b9f456SAndroid Build Coastguard Worker private: 39*58b9f456SAndroid Build Coastguard Worker T data_; 40*58b9f456SAndroid Build Coastguard Worker }; 41*58b9f456SAndroid Build Coastguard Worker 42*58b9f456SAndroid Build Coastguard Worker int Counter_base::gConstructed = 0; 43*58b9f456SAndroid Build Coastguard Worker 44*58b9f456SAndroid Build Coastguard Worker namespace std { 45*58b9f456SAndroid Build Coastguard Worker 46*58b9f456SAndroid Build Coastguard Worker template <class T> 47*58b9f456SAndroid Build Coastguard Worker struct hash<Counter<T> > 48*58b9f456SAndroid Build Coastguard Worker { 49*58b9f456SAndroid Build Coastguard Worker typedef Counter<T> argument_type; 50*58b9f456SAndroid Build Coastguard Worker typedef std::size_t result_type; 51*58b9f456SAndroid Build Coastguard Worker 52*58b9f456SAndroid Build Coastguard Worker std::size_t operator()(const Counter<T>& x) const {return std::hash<T>()(x.get());} 53*58b9f456SAndroid Build Coastguard Worker }; 54*58b9f456SAndroid Build Coastguard Worker } 55*58b9f456SAndroid Build Coastguard Worker 56*58b9f456SAndroid Build Coastguard Worker #endif 57