1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
13 #include <functional> // for std::hash
15 struct Counter_base
{ static int gConstructed
; };
18 class Counter
: public Counter_base
21 Counter() : data_() { ++gConstructed
; }
22 Counter(const T
&data
) : data_(data
) { ++gConstructed
; }
23 Counter(const Counter
& rhs
) : data_(rhs
.data_
) { ++gConstructed
; }
24 Counter
& operator=(const Counter
& rhs
) { ++gConstructed
; data_
= rhs
.data_
; return *this; }
25 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
26 Counter(Counter
&& rhs
) : data_(std::move(rhs
.data_
)) { ++gConstructed
; }
27 Counter
& operator=(Counter
&& rhs
) { ++gConstructed
; data_
= std::move(rhs
.data_
); return *this; }
29 ~Counter() { --gConstructed
; }
31 const T
& get() const {return data_
;}
33 bool operator==(const Counter
& x
) const {return data_
== x
.data_
;}
34 bool operator< (const Counter
& x
) const {return data_
< x
.data_
;}
40 int Counter_base::gConstructed
= 0;
45 struct hash
<Counter
<T
> >
46 : public std::unary_function
<Counter
<T
>, std::size_t>
48 std::size_t operator()(const Counter
<T
>& x
) const {return std::hash
<T
>(x
.get());}