• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 ******************************************************************************
5 *
6 *   Copyright (C) 2002-2011, International Business Machines
7 *   Corporation and others.  All Rights Reserved.
8 *
9 ******************************************************************************
10 *
11 * File uassert.h
12 *
13 *  Contains the U_ASSERT and UPRV_UNREACHABLE_* macros
14 *
15 ******************************************************************************
16 */
17 #ifndef U_ASSERT_H
18 #define U_ASSERT_H
19 
20 /* utypes.h is included to get the proper define for uint8_t */
21 #include "unicode/utypes.h"
22 /* for abort */
23 #include <stdlib.h>
24 
25 /**
26  * \def U_ASSERT
27  * By default, U_ASSERT just wraps the C library assert macro.
28  * By changing the definition here, the assert behavior for ICU can be changed
29  * without affecting other non - ICU uses of the C library assert().
30 */
31 #if U_DEBUG
32 #   include <assert.h>
33 #   define U_ASSERT(exp) assert(exp)
34 #elif U_CPLUSPLUS_VERSION
35 #   define U_ASSERT(exp) (void)0
36 #else
37 #   define U_ASSERT(exp)
38 #endif
39 
40 /**
41  * \def UPRV_UNREACHABLE_ASSERT
42  * This macro is used in places that we had believed were unreachable, but
43  * experience has shown otherwise (possibly due to memory corruption, etc).
44  * In this case we call assert() in debug versions as with U_ASSERT, instead
45  * of unconditionally calling abort(). However we also allow redefinition as
46  * with UPRV_UNREACHABLE_EXIT.
47  * @internal
48 */
49 #if defined(UPRV_UNREACHABLE_ASSERT)
50     // Use the predefined value.
51 #elif U_DEBUG
52 #   include <assert.h>
53 #   define UPRV_UNREACHABLE_ASSERT assert(false)
54 #elif U_CPLUSPLUS_VERSION
55 #   define UPRV_UNREACHABLE_ASSERT (void)0
56 #else
57 #   define UPRV_UNREACHABLE_ASSERT
58 #endif
59 
60 /**
61  * \def UPRV_UNREACHABLE_EXIT
62  * This macro is used to unconditionally abort if unreachable code is ever executed.
63  * @internal
64 */
65 #if defined(UPRV_UNREACHABLE_EXIT)
66     // Use the predefined value.
67 #else
68 #   define UPRV_UNREACHABLE_EXIT abort()
69 #endif
70 
71 #endif
72