7#ifndef ROOT_CORE_UTILS__ASSERT_H
8#define ROOT_CORE_UTILS__ASSERT_H
84 void fail (
const char *package,
const char *
file,
unsigned line,
94 template<
class T>
void
97 static_cast<const T *
>(object)->testInvariant ();
132#ifndef ROOTCORE_PACKAGE
133#define ROOTCORE_PACKAGE 0
139#define RCU_CHECK(type,condition,message) \
140 (condition) ? (void) 0 : ::RCU::Check::fail (ROOTCORE_PACKAGE, __FILE__, __LINE__, ::RCU::Check::type, message)
143#define RCU_CHECK_JOIN2(a,b) RCU_CHECK_JOIN2_HIDDEN(a,b)
144#define RCU_CHECK_JOIN2_HIDDEN(a,b) a ## b
148#define RCU_REQUIRE_SOFT(x) \
149 RCU_CHECK (require_soft, x, #x)
150#define RCU_REQUIRE2_SOFT(x,y) \
151 RCU_CHECK (require_soft, x, y)
152#define RCU_REQUIRE0_SOFT(y) \
153 RCU_CHECK (require_soft, 0, y)
155#define RCU_PROVIDE_SOFT(x) \
156 RCU_CHECK (provide_soft, x, #x)
157#define RCU_PROVIDE2_SOFT(x,y) \
158 RCU_CHECK (provide_soft, x, y)
159#define RCU_PROVIDE0_SOFT(y) \
160 RCU_CHECK (provide_soft, 0, y)
162#define RCU_ASSERT_SOFT(x) \
163 RCU_CHECK (assert_soft, x, #x)
164#define RCU_ASSERT2_SOFT(x,y) \
165 RCU_CHECK (assert_soft, x, y)
166#define RCU_ASSERT0_SOFT(y) \
167 RCU_CHECK (assert_soft, 0, y)
171#define RCU_REQUIRE_NOIMP(x) \
172 RCU_CHECK (require_noimp, x, #x)
173#define RCU_REQUIRE2_NOIMP(x,y) \
174 RCU_CHECK (require_noimp, x, y)
175#define RCU_REQUIRE0_NOIMP(y) \
176 RCU_CHECK (require_noimp, 0, y)
178#define RCU_PROVIDE_NOIMP(x) \
179 RCU_CHECK (provide_noimp, x, #x)
180#define RCU_PROVIDE2_NOIMP(x,y) \
181 RCU_CHECK (provide_noimp, x, y)
182#define RCU_PROVIDE0_NOIMP(y) \
183 RCU_CHECK (provide_noimp, 0, y)
185#define RCU_ASSERT_NOIMP(x) \
186 RCU_CHECK (assert_noimp, x, #x)
187#define RCU_ASSERT2_NOIMP(x,y) \
188 RCU_CHECK (assert_noimp, x, y)
189#define RCU_ASSERT0_NOIMP(y) \
190 RCU_CHECK (assert_noimp, 0, y)
196#define RCU_INVARIANT(x) \
197 RCU_CHECK (invariant, x, #x)
198#define RCU_INVARIANT2(x,y) \
199 RCU_CHECK (invariant, x, y)
200#define RCU_INVARIANT0(y) \
201 RCU_CHECK (invariant, 0, y)
203#define RCU_REQUIRE(x) \
204 RCU_CHECK (require_hard, x, #x)
205#define RCU_REQUIRE2(x,y) \
206 RCU_CHECK (require_hard, x, y)
207#define RCU_REQUIRE0(y) \
208 RCU_CHECK (require_hard, 0, y)
210#define RCU_PROVIDE(x) \
211 RCU_CHECK (provide_hard, x, #x)
212#define RCU_PROVIDE2(x,y) \
213 RCU_CHECK (provide_hard, x, y)
214#define RCU_PROVIDE0(y) \
215 RCU_CHECK (provide_hard, 0, y)
217#define RCU_ASSERT(x) \
218 RCU_CHECK (assert_hard, x, #x)
219#define RCU_ASSERT2(x,y) \
220 RCU_CHECK (assert_hard, x, y)
221#define RCU_ASSERT0(y) \
222 RCU_CHECK (assert_hard, 0, y)
224#define RCU_READ_INVARIANT(x) \
225 (x)->testInvariant ()
226#define RCU_CHANGE_INVARIANT(x) \
227 ::RCU::Check::TestInvariant RCU_CHECK_JOIN2 (invariant, __LINE__) = ::RCU::Check::invariant_tester (x);
228#define RCU_NEW_INVARIANT(x) \
229 (x)->testInvariant ()
230#define RCU_DESTROY_INVARIANT(x) \
231 (x)->testInvariant ()
237#define RCU_INVARIANT(x) \
239#define RCU_INVARIANT2(x,y) \
241#define RCU_INVARIANT0(y) \
243#define RCU_REQUIRE(x) \
245#define RCU_REQUIRE2(x,y) \
247#define RCU_REQUIRE0(y) \
249#define RCU_PROVIDE(x) \
251#define RCU_PROVIDE2(x,y) \
253#define RCU_PROVIDE0(y) \
255#define RCU_ASSERT(x) \
257#define RCU_ASSERT2(x,y) \
259#define RCU_ASSERT0(y) \
261#define RCU_READ_INVARIANT(x) \
263#define RCU_CHANGE_INVARIANT(x) \
265#define RCU_NEW_INVARIANT(x) \
267#define RCU_DESTROY_INVARIANT(x) \
278#define RCU_REQUIRE_SLOW(x) \
280#define RCU_REQUIRE2_SLOW(x,y) \
282#define RCU_PROVIDE_SLOW(x) \
284#define RCU_PROVIDE2_SLOW(x,y) \
286#define RCU_ASSERT_SLOW(x) \
288#define RCU_ASSERT2_SLOW(x,y) \
290#define RCU_READ_INVARIANT_SLOW(x) \
291 RCU_READ_INVARIANT (x)
292#define RCU_CHANGE_INVARIANT_SLOW(x) \
293 RCU_CHANGE_INVARIANT (x)
294#define RCU_NEW_INVARIANT_SLOW(x) \
295 RCU_NEW_INVARIANT (x)
296#define RCU_DESTROY_INVARIANT_SLOW(x) \
297 RCU_DESTROY_INVARIANT (x)
301#define RCU_REQUIRE_SLOW(x) \
303#define RCU_REQUIRE2_SLOW(x,y) \
305#define RCU_PROVIDE_SLOW(x) \
307#define RCU_PROVIDE2_SLOW(x,y) \
309#define RCU_ASSERT_SLOW(x) \
311#define RCU_ASSERT2_SLOW(x,y) \
313#define RCU_READ_INVARIANT_SLOW(x) \
315#define RCU_CHANGE_INVARIANT_SLOW(x) \
317#define RCU_NEW_INVARIANT_SLOW(x) \
319#define RCU_DESTROY_INVARIANT_SLOW(x) \
const bool typeAbort[typeNum]
TestInvariant invariant_tester(T *object)
effects: create the right invariant testing object returns: the tester
void fail(const char *package, 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: ...
void testInvariantVoid(const void *object)
@ require_soft
function parameter requirement
@ invariant
invariant violation
@ assert_soft
regular old style assertion
@ provide_soft
function postcondition
void(* TestInvariantFunction)(const void *object)
effects: apply the test invariant method on an object guarantee: no-fail availability: experts only r...
const char *const typeLiteral[typeNum]
This module defines a variety of assert style macros.
TestInvariantFunction m_function
TestInvariant(TestInvariantFunction function, const void *object)
availability: experts only description: this class will perform an invariant test as the object goes ...