MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
myassert.h
Go to the documentation of this file.
1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/libraries/libmbutil/myassert.h,v 1.26 2017/01/12 14:44:05 masarati Exp $ */
2 /*
3  * This library comes with MBDyn (C), a multibody analysis code.
4  * http://www.mbdyn.org
5  *
6  * Copyright (C) 1996-2017
7  *
8  * Pierangelo Masarati <masarati@aero.polimi.it>
9  *
10  * Dipartimento di Ingegneria Aerospaziale - Politecnico di Milano
11  * via La Masa, 34 - 20156 Milano, Italy
12  * http://www.aero.polimi.it
13  *
14  * Changing this copyright notice is forbidden.
15  *
16  * This program is free software; you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation (version 2 of the License).
19  *
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program; if not, write to the Free Software
28  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29  */
30 
31 /******************************************************************************
32 
33 Macro di assert personalizzate
34 
35 Uso:
36 
37  ASSERT(<expr>);
38  - se <expr> e' vera ( != 0 ) non fa nulla;
39  - se <expr> e' falsa, scrive sul flusso di errore cerr il file e la riga
40  solo se DEBUG e' definita.
41 
42  ASSERTMSG(<expr>, <msg>);
43  - se <expr> e' vera ( != 0 ) non fa nulla;
44  - se <expr> e' falsa, scrive sul flusso di errore cerr il file e la riga,
45  seguiti dal messaggio <msg>, solo se DEBUG e' definita.
46 
47  ASSERTBREAK(<expr>)
48  ASSERTMSGBREAK(<expr>, <msg>)
49 
50  sono analoghe alle precedenti, ma in piu' chiamano exit(1) per
51  interrompere il programma.
52 
53 
54  Sono definite inoltre le macro COUT e CERR.
55  Entrambe antepongono al messaggio che le segue una intestazione
56  con il nome del file ed il numero di riga da cui proviene la chiamata.
57  Prima della scrittura viene forzato il flush dello standard output
58  nel caso che i due flussi di uscita facessero capo alla stessa device.
59  Infine le macro DEBUGCOUT(msg) e DEBUGCERR(msg) che scrivono
60  il messaggio desiderato sui rispettivi flussi in uscita
61  solo se e' definito #define DEBUG. Attenzione, se si concatenano
62  piu' item con l'operatore << non occorre usare parentesi strane.
63 
64 ******************************************************************************/
65 
66 
67 #ifndef MYASSERT_H
68 #define MYASSERT_H
69 
70 #include <stdlib.h>
71 #include <iostream>
72 #include <except.h>
73 
74 #define NO_OP do {} while(0)
75 
76 #ifdef DEBUG
77 /* predefined debug level flags (reserved from 0x0000001 to 0x00000080) */
78 const long int MYDEBUG_NONE = 0x00000000;
79 const long int MYDEBUG_ANY = 0xFFFFFFFF;
80 const long int MYDEBUG_FNAMES = 0x00000001;
81 #ifdef __GNUC__
82 const long int MYDEBUG_PRETTYFN = 0x00000002;
83 #endif /* __GNUC__ */
84 
85 /* debug level global var */
86 extern long int debug_level /* = MYDEBUG_ANY */ ;
87 extern long int DEFAULT_DEBUG_LEVEL;
88 
89 struct debug_array {
90  const char* s;
91  long int l;
92 };
93 
94 extern int get_debug_options(const char *const s, const debug_array da[]);
95 
96 
97 
98 
99 class MyAssert {
100  public:
101  class ErrGeneric : public MBDynErrBase {
102  public:
104  };
105 };
106 
107 extern void _Assert(const char* file, const int line, const char* msg = NULL);
108 extern std::ostream& _Out(std::ostream& out, const char* file, const int line);
109 
110 #define ASSERT(expr) \
111  do { \
112  if (!(expr)) { \
113  _Assert(__FILE__, __LINE__); \
114  } \
115  } while (0)
116 
117 
118 #define ASSERTBREAK(expr) \
119  do { \
120  if (!(expr)) { \
121  _Assert(__FILE__, __LINE__); \
122  throw MyAssert::ErrGeneric(MBDYN_EXCEPT_ARGS); \
123  } \
124  } while (0)
125 
126 #define ASSERTMSG(expr, msg) \
127  do { \
128  if (!(expr)) { \
129  _Assert(__FILE__, __LINE__, (msg)); \
130  } \
131  } while (0)
132 
133 #define ASSERTMSGBREAK(expr, msg) \
134  do { \
135  if (!(expr)) { \
136  _Assert(__FILE__, __LINE__, (msg)); \
137  throw MyAssert::ErrGeneric(MBDYN_EXCEPT_ARGS); \
138  } \
139  } while (0)
140 
141 
142 
143 
144 #define COUT \
145  _Out(std::cout, __FILE__, __LINE__)
146 
147 #define CERR \
148  _Out(std::cerr, __FILE__, __LINE__)
149 
150 
151 
152 #define DEBUGCOUT(msg) \
153  do { \
154  _Out(std::cout, __FILE__, __LINE__) << msg; std::cout.flush(); \
155  } while (0)
156 
157 #define DEBUGCERR(msg) \
158  do { \
159  _Out(std::cerr, __FILE__, __LINE__) << msg; std::cerr.flush(); \
160  } while (0)
161 
162 #define DEBUG_LEVEL(level) \
163  ((level) & ::debug_level)
164 
165 #define DEBUG_LEVEL_MATCH(level) \
166  (((level) & ::debug_level) == (level))
167 
168 #define DEBUGLCOUT(level, msg) \
169  do { \
170  if (::debug_level & (level)) { \
171  DEBUGCOUT(msg); \
172  } \
173  } while (0)
174 
175 #define DEBUGLCERR(level, msg) \
176  do { \
177  if (::debug_level & (level)) { \
178  DEBUGCERR(msg); \
179  } \
180  } while (0)
181 
182 #define DEBUGLMCOUT(level, msg) \
183  do { \
184  if ((::debug_level & (level)) == (level)) { \
185  DEBUGCOUT(msg); \
186  } \
187  } while (0)
188 
189 #define DEBUGLMCERR(level, msg) \
190  do { \
191  if ((::debug_level & (level)) == (level)) { \
192  DEBUGCERR(msg); \
193  } \
194  } while (0)
195 
196 #if defined(__GNUC__)
197 #define DEBUGCOUTFNAME(fname) \
198  do { \
199  if (::debug_level & MYDEBUG_FNAMES) { \
200  if (::debug_level & MYDEBUG_PRETTYFN) { \
201  DEBUGCOUT("Entering `" << __PRETTY_FUNCTION__ << "'" << std::endl); \
202  } else { \
203  DEBUGCOUT("Entering `" << __FUNCTION__ << "'" << std::endl); \
204  } \
205  } \
206  } while (0)
207 #else /* !__GNUC__ */
208 #define DEBUGCOUTFNAME(fname) \
209  DEBUGLCOUT(MYDEBUG_FNAMES, "Entering `" << fname << "'" << std::endl)
210 #endif /* !__GNUC__ */
211 
212 #else /* !DEBUG */
213 #define ASSERT(expr) \
214  NO_OP
215 
216 #define ASSERTBREAK(expr) \
217  NO_OP
218 
219 #define ASSERTMSG(expr, msg) \
220  NO_OP
221 
222 #define ASSERTMSGBREAK(expr, msg) \
223  NO_OP
224 
225 #define COUT \
226  std::cout
227 
228 #define CERR \
229  std::cerr
230 
231 
232 #define DEBUGCOUT(msg) \
233  do { } while (0)
234 
235 #define DEBUGCERR(msg) \
236  do { } while (0)
237 
238 #define DEBUG_LEVEL(level) \
239  0
240 
241 #define DEBUG_LEVEL_MATCH(level) \
242  0
243 
244 #define DEBUGLCOUT(level, msg) \
245  do { } while (0)
246 
247 #define DEBUGLCERR(level, msg) \
248  do { } while (0)
249 
250 #define DEBUGLMCOUT(level, msg) \
251  do { } while (0)
252 
253 #define DEBUGLMCERR(level, msg) \
254  do { } while (0)
255 
256 #define DEBUGCOUTFNAME(fname) \
257  do { } while (0)
258 
259 #endif /* !DEBUG */
260 
261 #endif /* MYASSERT_H */
#define MBDYN_EXCEPT_ARGS_PASSTHRU
Definition: except.h:55
#define MBDYN_EXCEPT_ARGS_DECL
Definition: except.h:43
static char * file
Definition: ann_in.c:101
struct mbrtai_msg_t msg