]> git.ipfire.org Git - thirdparty/squid.git/blob - test-suite/syntheticoperators.cc
Source Format Enforcement (#532)
[thirdparty/squid.git] / test-suite / syntheticoperators.cc
1 /*
2 * Copyright (C) 1996-2020 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9 #include "squid.h"
10 #include "mem_node.h"
11 #include "stmem.h"
12
13 #include <iostream>
14
15 class HasExplicit
16 {
17 public:
18 HasExplicit();
19 ~HasExplicit();
20 HasExplicit(HasExplicit const &);
21 HasExplicit &operator=(HasExplicit const &);
22 static int const &Instances();
23 static int const &Assignments();
24 static void Assignments(int const &);
25 private:
26 static void AddInstance();
27 static void RemoveInstance();
28 static void Assignment();
29 static int Instances_;
30 static int Assignments_;
31 };
32
33 int HasExplicit::Instances_(0);
34 int HasExplicit::Assignments_(0);
35
36 HasExplicit::HasExplicit()
37 {
38 AddInstance();
39 }
40
41 HasExplicit::~HasExplicit()
42 {
43 RemoveInstance();
44 }
45
46 HasExplicit::HasExplicit(HasExplicit const &)
47 {
48 AddInstance();
49 }
50
51 HasExplicit &
52 HasExplicit::operator= (HasExplicit const &)
53 {
54 Assignment();
55 return *this;
56 }
57
58 void
59 HasExplicit::AddInstance()
60 {
61 ++Instances_;
62 }
63
64 void
65 HasExplicit::RemoveInstance()
66 {
67 --Instances_;
68 }
69
70 void
71 HasExplicit::Assignment()
72 {
73 ++Assignments_;
74 }
75
76 int const &
77 HasExplicit::Instances()
78 {
79 return Instances_;
80 }
81
82 int const &
83 HasExplicit::Assignments()
84 {
85 return Assignments_;
86 }
87
88 void
89 HasExplicit::Assignments(int const &newValue)
90 {
91 Assignments_ = newValue;
92 }
93
94 void
95 CheckHasExplicitWorks()
96 {
97 assert (HasExplicit::Instances() == 0);
98 HasExplicit *one = new HasExplicit;
99 assert (HasExplicit::Instances() == 1);
100 HasExplicit *two = new HasExplicit;
101 assert (HasExplicit::Instances() == 2);
102 *two = *one;
103 assert (HasExplicit::Instances() == 2);
104 assert (HasExplicit::Assignments() == 1);
105 *two = *one;
106 assert (HasExplicit::Instances() == 2);
107 assert (HasExplicit::Assignments() == 2);
108 HasExplicit *three = new HasExplicit(*two);
109 assert (HasExplicit::Instances() == 3);
110 delete three;
111 assert (HasExplicit::Instances() == 2);
112 delete one;
113 assert (HasExplicit::Instances() == 1);
114 delete two;
115 assert (HasExplicit::Instances() == 0);
116 HasExplicit::Assignments(0);
117 assert (HasExplicit::Assignments() == 0);
118 }
119
120 class SyntheticOwnsExplicit
121 {
122 public:
123 HasExplicit aMember;
124 };
125
126 void
127 CheckSyntheticWorks()
128 {
129 assert (HasExplicit::Instances() == 0);
130 assert (HasExplicit::Assignments() == 0);
131 SyntheticOwnsExplicit *one = new SyntheticOwnsExplicit;
132 assert (HasExplicit::Instances() == 1);
133 SyntheticOwnsExplicit *two = new SyntheticOwnsExplicit;
134 assert (HasExplicit::Instances() == 2);
135 *two = *one;
136 assert (HasExplicit::Instances() == 2);
137 assert (HasExplicit::Assignments() == 1);
138 *two = *one;
139 assert (HasExplicit::Instances() == 2);
140 assert (HasExplicit::Assignments() == 2);
141 SyntheticOwnsExplicit *three = new SyntheticOwnsExplicit(*two);
142 assert (HasExplicit::Instances() == 3);
143 delete three;
144 assert (HasExplicit::Instances() == 2);
145 delete one;
146 assert (HasExplicit::Instances() == 1);
147 delete two;
148 assert (HasExplicit::Instances() == 0);
149 HasExplicit::Assignments(0);
150 assert (HasExplicit::Assignments() == 0);
151 }
152
153 int
154 main(int, char *[])
155 {
156 CheckHasExplicitWorks();
157 CheckSyntheticWorks();
158 return EXIT_SUCCESS;
159 }
160