1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef COUNTER_H
#define COUNTER_H
#include <functional> // for std::hash
#include "test_macros.h"
struct Counter_base
{
static int gConstructed;
};
template <typename T>
class Counter : public Counter_base
{
public:
Counter()
: data_()
{
++gConstructed;
}
Counter(const T& data)
: data_(data)
{
++gConstructed;
}
Counter(const Counter& rhs)
: data_(rhs.data_)
{
++gConstructed;
}
Counter& operator=(const Counter& rhs)
{
data_ = rhs.data_;
return *this;
}
Counter(Counter&& rhs)
: data_(std::move(rhs.data_))
{
++gConstructed;
}
Counter& operator=(Counter&& rhs)
{
++gConstructed;
data_ = std::move(rhs.data_);
return *this;
}
~Counter()
{
--gConstructed;
}
const T& get() const
{
return data_;
}
bool operator==(const Counter& x) const
{
return data_ == x.data_;
}
bool operator<(const Counter& x) const
{
return data_ < x.data_;
}
private:
T data_;
};
int Counter_base::gConstructed = 0;
namespace std
{
template <class T>
struct hash<Counter<T>>
{
typedef Counter<T> argument_type;
typedef std::size_t result_type;
std::size_t operator()(const Counter<T>& x) const
{
return std::hash<T>()(x.get());
}
};
} // namespace std
#endif
|