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