xref: /llvm-project/llvm/unittests/ADT/CountCopyAndMove.h (revision e8ca306fbefdb8385c53d6cc029251d1d5be7049)
1 //===- llvm/unittest/ADT/CountCopyAndMove.h - Optional unit tests ---------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_UNITTESTS_ADT_COUNTCOPYANDMOVE_H
10 #define LLVM_UNITTESTS_ADT_COUNTCOPYANDMOVE_H
11 
12 namespace llvm {
13 
14 struct CountCopyAndMove {
15   static int DefaultConstructions;
16   static int ValueConstructions;
17   static int CopyConstructions;
18   static int CopyAssignments;
19   static int MoveConstructions;
20   static int MoveAssignments;
21   static int Destructions;
22   int val;
23 
24   CountCopyAndMove() { ++DefaultConstructions; }
25   explicit CountCopyAndMove(int val) : val(val) { ++ValueConstructions; }
26   CountCopyAndMove(const CountCopyAndMove &other) : val(other.val) {
27     ++CopyConstructions;
28   }
29   CountCopyAndMove &operator=(const CountCopyAndMove &other) {
30     val = other.val;
31     ++CopyAssignments;
32     return *this;
33   }
34   CountCopyAndMove(CountCopyAndMove &&other) : val(other.val) {
35     ++MoveConstructions;
36   }
37   CountCopyAndMove &operator=(CountCopyAndMove &&other) {
38     val = other.val;
39     ++MoveAssignments;
40     return *this;
41   }
42   ~CountCopyAndMove() { ++Destructions; }
43 
44   static void ResetCounts() {
45     DefaultConstructions = 0;
46     ValueConstructions = 0;
47     CopyConstructions = 0;
48     CopyAssignments = 0;
49     MoveConstructions = 0;
50     MoveAssignments = 0;
51     Destructions = 0;
52   }
53 
54   static int TotalConstructions() {
55     return DefaultConstructions + ValueConstructions + MoveConstructions +
56            CopyConstructions;
57   }
58 
59   static int TotalCopies() { return CopyConstructions + CopyAssignments; }
60 
61   static int TotalMoves() { return MoveConstructions + MoveAssignments; }
62 };
63 
64 } // end namespace llvm
65 
66 #endif // LLVM_UNITTESTS_ADT_COUNTCOPYANDMOVE_H
67