1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
12 #include <functional> // for std::hash
14 #include "test_macros.h"
16 struct Counter_base
{ static int gConstructed
; };
19 class Counter
: public Counter_base
22 Counter() : data_() { ++gConstructed
; }
23 Counter(const T
&data
) : data_(data
) { ++gConstructed
; }
24 Counter(const Counter
& rhs
) : data_(rhs
.data_
) { ++gConstructed
; }
25 Counter
& operator=(const Counter
& rhs
) { data_
= rhs
.data_
; return *this; }
26 #if TEST_STD_VER >= 11
27 Counter(Counter
&& rhs
) : data_(std::move(rhs
.data_
)) { ++gConstructed
; }
28 Counter
& operator=(Counter
&& rhs
) { data_
= std::move(rhs
.data_
); return *this; }
30 ~Counter() { --gConstructed
; }
32 const T
& get() const {return data_
;}
34 bool operator==(const Counter
& x
) const {return data_
== x
.data_
;}
35 bool operator< (const Counter
& x
) const {return data_
< x
.data_
;}
41 int Counter_base::gConstructed
= 0;
46 struct hash
<Counter
<T
> >
48 typedef Counter
<T
> argument_type
;
49 typedef std::size_t result_type
;
51 std::size_t operator()(const Counter
<T
>& x
) const {return std::hash
<T
>()(x
.get());}