CppAD: A C++ Algorithmic Differentiation Package  20171217
Go to the documentation of this file.
3
4 /* --------------------------------------------------------------------------
6
8 the terms of the
9  Eclipse Public License Version 1.0.
10
11 A copy of this license is included in the COPYING file of this distribution.
13 -------------------------------------------------------------------------- */
14
15 /*!
17 Define the CppAD error checking macros (all of which begin with CPPAD_ASSERT_)
18 */
19
20 /*
21 -------------------------------------------------------------------------------
22 $begin cppad_assert$$23 spell 24 CppAD 25 exp 26 const 27 bool 28$$ 29 30 31$section CppAD Assertions During Execution$$32 mindex assert macro CPPAD_ASSERT_KNOWN CPPAD_ASSERT_UNKNOWN$$
33
34 $head Syntax$$35 codei%CPPAD_ASSERT_KNOWN(%exp%, %msg%) 36 %$$ 37$codei%CPPAD_ASSERT_UNKNOWN(%exp%)%$$38 39 40 head Purpose$$
42 They are documented here because they correspond to the C++
43 source code that the error is reported at.
44
45 $head NDEBUG$$46 If the preprocessor symbol 47 cref/NDEBUG/Faq/Speed/NDEBUG/$$ is defined, 48 these macros do nothing; i.e., they are optimized out. 49 50$head Restriction$$51 The CppAD user should not uses these macros. 52 You can however write your own macros that do not begin with code CPPAD$$
53 and that call the $cref/CppAD error handler/ErrorHandler/$$. 54 55 head Known$$ 56 The$code CPPAD_ASSERT_KNOWN$$macro is used to check for an error 57 with a known cause. 58 For example, many CppAD routines uses these macros 59 to make sure their arguments conform to their specifications. 60 61 head Unknown$$
62 The $code CPPAD_ASSERT_UNKNOWN$$macro is used to check that the 63 CppAD internal data structures conform as expected. 64 If this is not the case, CppAD does not know why the error has 65 occurred; for example, the user may have written past the end 66 of an allocated array. 67 68 head Exp$$ 69 The argument$icode exp$$is a C++ source code expression 70 that results in a code bool$$ value that should be true.
71 If it is false, an error has occurred.
72 This expression may be execute any number of times
73 (including zero times) so it must have not side effects.
74
75 $head Msg$$76 The argument icode msg$$ has prototype 77$codei%
78  const char *%msg%
79 %$$80 and contains a code '\0'$$ terminated character string.
81 This string is a description of the error
82 corresponding to $icode exp$$being false. 83 84 head Error Handler$$ 85 These macros use the 86$cref/CppAD error handler/ErrorHandler/ to report errors.
87 This error handler can be replaced by the user.
88
89 \$end
90 ------------------------------------------------------------------------------
91 */
92
93 # include <cassert>
94 # include <iostream>
96
97 /*!
99 Check that \a exp is true, if not print \a msg and terminate execution.
100
101 The C++ expression \a exp is expected to be true.
102 If it is false,
103 the CppAD use has made an error that is described by \a msg.
104 If the preprocessor symbol \a NDEBUG is not defined,
105 and \a exp is false,
106 this macro will report the source code line number at
107 which this expected result occurred.
108 In addition, it will print the specified error message \a msg.
109 */
110 # ifdef NDEBUG
111 # define CPPAD_ASSERT_KNOWN(exp, msg) // do nothing
112 # else
113 # define CPPAD_ASSERT_KNOWN(exp, msg) \
114 { if( ! ( exp ) ) \
116  true , \
117  __LINE__ , \
118  __FILE__ , \
119  #exp , \
120  msg ); \
121 }
122 # endif
123
124 /*!
126 Check that \a exp is true, if not terminate execution.
127
128 The C++ expression \a exp is expected to be true.
129 If it is false,
130 CppAD has detected an error but does not know the cause of the error.
131 If the preprocessor symbol \a NDEBUG is not defined,
132 and \a exp is false,
133 this macro will report the source code line number at
134 which this expected result occurred.
135 */
136 # ifdef NDEBUG
137 # define CPPAD_ASSERT_UNKNOWN(exp) // do nothing
138 # else
140 { if( ! ( exp ) ) \
142  false , \
143  __LINE__ , \
144  __FILE__ , \
145  #exp , \
146  "" ); \
147 }
148 # endif
149
150 /*!
152 Check that operator \a op has the specified number of of arguments and results.
153
154 If \a NDEBUG is not defined and either the number of arguments
155 or the number of results are not as expected,
156 execution is terminated and the source code line number is reported.
157 */
158 # define CPPAD_ASSERT_NARG_NRES(op, n_arg, n_res) \
159  CPPAD_ASSERT_UNKNOWN( NumArg(op) == n_arg ) \
160  CPPAD_ASSERT_UNKNOWN( NumRes(op) == n_res )
161
162 /*!
164 Check that the first call to a routine is not during parallel execution mode.
165
166 If \c NDEBUG is defined, this macro has no effect
167 (not even the definition of (\c assert_first_call).
168 Otherwise, the variable
169 \code
170  static bool assert_first_call
171 \endcode
172 is defined and if the first call is executed in parallel mode,
173 execution is terminated and the source code line number is reported.
174 */
175 # ifdef NDEBUG