ATLAS Offline Software
Loading...
Searching...
No Matches
Assert.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#ifndef ROOT_CORE_UTILS__ASSERT_H
8#define ROOT_CORE_UTILS__ASSERT_H
9
11
17
23
30
31
38
39
40
41
42
43namespace RCU
44{
45 namespace Check
46 {
67 const int typeNum = invariant + 1;
68 extern const char * const typeLiteral [typeNum];
69 extern const bool typeAbort [typeNum];
70
71
81 void fail (const char *file, unsigned line,
82 Type type, const char *error);
83
84
90 typedef void (*TestInvariantFunction) (const void *object);
91 template<class T> void
92 testInvariantVoid (const void *object)
93 {
94 static_cast<const T *>(object)->testInvariant ();
95 }
96
97
98
100 {
104
106 const void *object);
108
109 private:
111 const void *m_object;
112 };
113
114
115
118 template<class T> inline TestInvariant invariant_tester (T *object)
119 {
120 return TestInvariant (testInvariantVoid<T>, object);
121 }
122 }
123}
124
125
126
127
128
132#define RCU_CHECK(type,condition,message) \
133 (condition) ? (void) 0 : ::RCU::Check::fail (__FILE__, __LINE__, ::RCU::Check::type, message)
134
136#define RCU_CHECK_JOIN2(a,b) RCU_CHECK_JOIN2_HIDDEN(a,b)
137#define RCU_CHECK_JOIN2_HIDDEN(a,b) a ## b
138
139
140
141#define RCU_REQUIRE_SOFT(x) \
142 RCU_CHECK (require_soft, x, #x)
143#define RCU_REQUIRE2_SOFT(x,y) \
144 RCU_CHECK (require_soft, x, y)
145#define RCU_REQUIRE0_SOFT(y) \
146 RCU_CHECK (require_soft, 0, y)
147
148#define RCU_PROVIDE_SOFT(x) \
149 RCU_CHECK (provide_soft, x, #x)
150#define RCU_PROVIDE2_SOFT(x,y) \
151 RCU_CHECK (provide_soft, x, y)
152#define RCU_PROVIDE0_SOFT(y) \
153 RCU_CHECK (provide_soft, 0, y)
154
155#define RCU_ASSERT_SOFT(x) \
156 RCU_CHECK (assert_soft, x, #x)
157#define RCU_ASSERT2_SOFT(x,y) \
158 RCU_CHECK (assert_soft, x, y)
159#define RCU_ASSERT0_SOFT(y) \
160 RCU_CHECK (assert_soft, 0, y)
161
162
163
164#define RCU_REQUIRE_NOIMP(x) \
165 RCU_CHECK (require_noimp, x, #x)
166#define RCU_REQUIRE2_NOIMP(x,y) \
167 RCU_CHECK (require_noimp, x, y)
168#define RCU_REQUIRE0_NOIMP(y) \
169 RCU_CHECK (require_noimp, 0, y)
170
171#define RCU_PROVIDE_NOIMP(x) \
172 RCU_CHECK (provide_noimp, x, #x)
173#define RCU_PROVIDE2_NOIMP(x,y) \
174 RCU_CHECK (provide_noimp, x, y)
175#define RCU_PROVIDE0_NOIMP(y) \
176 RCU_CHECK (provide_noimp, 0, y)
177
178#define RCU_ASSERT_NOIMP(x) \
179 RCU_CHECK (assert_noimp, x, #x)
180#define RCU_ASSERT2_NOIMP(x,y) \
181 RCU_CHECK (assert_noimp, x, y)
182#define RCU_ASSERT0_NOIMP(y) \
183 RCU_CHECK (assert_noimp, 0, y)
184
185
186
187#define RCU_INVARIANT(x) \
188 RCU_CHECK (invariant, x, #x)
189#define RCU_INVARIANT2(x,y) \
190 RCU_CHECK (invariant, x, y)
191#define RCU_INVARIANT0(y) \
192 RCU_CHECK (invariant, 0, y)
193
194#ifndef NDEBUG
195
196#define RCU_REQUIRE(x) \
197 RCU_CHECK (require_hard, x, #x)
198#define RCU_REQUIRE2(x,y) \
199 RCU_CHECK (require_hard, x, y)
200#define RCU_REQUIRE0(y) \
201 RCU_CHECK (require_hard, 0, y)
202
203#define RCU_PROVIDE(x) \
204 RCU_CHECK (provide_hard, x, #x)
205#define RCU_PROVIDE2(x,y) \
206 RCU_CHECK (provide_hard, x, y)
207#define RCU_PROVIDE0(y) \
208 RCU_CHECK (provide_hard, 0, y)
209
210#define RCU_ASSERT(x) \
211 RCU_CHECK (assert_hard, x, #x)
212#define RCU_ASSERT2(x,y) \
213 RCU_CHECK (assert_hard, x, y)
214#define RCU_ASSERT0(y) \
215 RCU_CHECK (assert_hard, 0, y)
216
217#define RCU_READ_INVARIANT(x) \
218 (x)->testInvariant ()
219#define RCU_CHANGE_INVARIANT(x) \
220 ::RCU::Check::TestInvariant RCU_CHECK_JOIN2 (invariant, __LINE__) = ::RCU::Check::invariant_tester (x);
221#define RCU_NEW_INVARIANT(x) \
222 (x)->testInvariant ()
223#define RCU_DESTROY_INVARIANT(x) \
224 (x)->testInvariant ()
225
226#else
227
228#define RCU_REQUIRE(x) \
229 (void) 0
230#define RCU_REQUIRE2(x,y) \
231 (void) 0
232#define RCU_REQUIRE0(y) \
233 (void) 0
234#define RCU_PROVIDE(x) \
235 (void) 0
236#define RCU_PROVIDE2(x,y) \
237 (void) 0
238#define RCU_PROVIDE0(y) \
239 (void) 0
240#define RCU_ASSERT(x) \
241 (void) 0
242#define RCU_ASSERT2(x,y) \
243 (void) 0
244#define RCU_ASSERT0(y) \
245 (void) 0
246#define RCU_READ_INVARIANT(x) \
247 (void) 0
248#define RCU_CHANGE_INVARIANT(x) \
249 (void) 0
250#define RCU_NEW_INVARIANT(x) \
251 (void) 0
252#define RCU_DESTROY_INVARIANT(x) \
253 (void) 0
254
255#endif
256
257
258
259
260
261#ifdef RCU_DEBUG_SLOW
262
263#define RCU_REQUIRE_SLOW(x) \
264 RCU_REQUIRE(x)
265#define RCU_REQUIRE2_SLOW(x,y) \
266 RCU_REQUIRE2(x,y)
267#define RCU_PROVIDE_SLOW(x) \
268 RCU_PROVIDE(x)
269#define RCU_PROVIDE2_SLOW(x,y) \
270 RCU_PROVIDE2(x,y)
271#define RCU_ASSERT_SLOW(x) \
272 RCU_ASSERT(x)
273#define RCU_ASSERT2_SLOW(x,y) \
274 RCU_ASSERT2(x,y)
275#define RCU_READ_INVARIANT_SLOW(x) \
276 RCU_READ_INVARIANT (x)
277#define RCU_CHANGE_INVARIANT_SLOW(x) \
278 RCU_CHANGE_INVARIANT (x)
279#define RCU_NEW_INVARIANT_SLOW(x) \
280 RCU_NEW_INVARIANT (x)
281#define RCU_DESTROY_INVARIANT_SLOW(x) \
282 RCU_DESTROY_INVARIANT (x)
283
284#else
285
286#define RCU_REQUIRE_SLOW(x) \
287 (void) 0
288#define RCU_REQUIRE2_SLOW(x,y) \
289 (void) 0
290#define RCU_PROVIDE_SLOW(x) \
291 (void) 0
292#define RCU_PROVIDE2_SLOW(x,y) \
293 (void) 0
294#define RCU_ASSERT_SLOW(x) \
295 (void) 0
296#define RCU_ASSERT2_SLOW(x,y) \
297 (void) 0
298#define RCU_READ_INVARIANT_SLOW(x) \
299 (void) 0
300#define RCU_CHANGE_INVARIANT_SLOW(x) \
301 (void) 0
302#define RCU_NEW_INVARIANT_SLOW(x) \
303 (void) 0
304#define RCU_DESTROY_INVARIANT_SLOW(x) \
305 (void) 0
306
307#endif
308
309
310#endif
const bool typeAbort[typeNum]
Definition Assert.cxx:45
TestInvariant invariant_tester(T *object)
effects: create the right invariant testing object returns: the tester
Definition Assert.h:118
const int typeNum
Definition Assert.h:67
void testInvariantVoid(const void *object)
Definition Assert.h:92
@ require_hard
Definition Assert.h:56
@ provide_noimp
Definition Assert.h:62
@ require_soft
function parameter requirement
Definition Assert.h:55
@ invariant
invariant violation
Definition Assert.h:65
@ require_noimp
Definition Assert.h:57
@ assert_hard
Definition Assert.h:51
@ assert_noimp
Definition Assert.h:52
@ assert_soft
regular old style assertion
Definition Assert.h:50
@ provide_soft
function postcondition
Definition Assert.h:60
@ provide_hard
Definition Assert.h:61
void(* TestInvariantFunction)(const void *object)
effects: apply the test invariant method on an object guarantee: no-fail availability: experts only r...
Definition Assert.h:90
const char *const typeLiteral[typeNum]
Definition Assert.cxx:26
void fail(const char *file, unsigned line, Type type, const char *error)
effects: report the error and abort either by exception or assert like guarantee: all-fail failures: ...
Definition Assert.cxx:64
This module defines a variety of assert style macros.
Definition Assert.cxx:23
const void * m_object
Definition Assert.h:111
TestInvariantFunction m_function
Definition Assert.h:110
TestInvariant(TestInvariantFunction function, const void *object)
availability: experts only description: this class will perform an invariant test as the object goes ...
Definition Assert.cxx:88
TFile * file