Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4FFGDebuggingMacros.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26/*
27 * File: G4FFGDebuggingMacros.hh
28 * Author: B. Wendt (wendbryc@isu.edu)
29 *
30 * Created on August 17, 2012, 12:54
31 */
32
33#ifndef G4FFGDEBUGGINGMACROS_HH
34#define G4FFGDEBUGGINGMACROS_HH
35
36#include "globals.hh"
37
38#include "G4FFGEnumerations.hh"
39#include "G4FFGVerboseMacros.hh"
40
41// Define the function as available by the compiler
42#if defined(__GNUC__)
43 #define G4FFG_FUNCTION_SIGNATURE__ G4String(__func__) + "()"
44#elif defined(_MSC_VER)
45 // I'm not sure if this is the correct syntax for MS VC
46 #define G4FFG_FUNCTION_SIGNATURE__ G4String(__FUNCTION__) + "()"
47#else
48 #define G4FFG_FUNCTION_SIGNATURE__ "a function"
49#endif
50
51// Only define the variables and macros if G4DEBUG_VERBOSE is set
52#if defined(G4DEBUG_VERBOSE)
53 /** G4FFGDEBUG_RECURSIVE_REPRESSION is used to aid in the repression of
54 * debugging messages from recursive function calls.
55 */
56 extern G4long G4FFGDEBUG_RECURSIVE_REPRESSION;
57 /** G4FFGDEBUG_RECURSIVE_REPRESSION_COUNTER tracks the number of recursive
58 * function debugging messages were repressed.
59 */
60 extern G4long G4FFGDEBUG_RECURSIVE_REPRESSION_COUNTER;
61 /** G4FFGDEBUG_DATA_STRUCTURE_REPRESSION is used to aid in the repression of
62 * debugging messages from functions that sort/access data elements.
63 */
64 extern G4long G4FFGDEBUG_DATA_STRUCTURE_REPRESSION;
65 /** G4FFGDEBUG_DATA_STRUCTURE_REPRESSION_COUNTER tracks the number of recursive
66 * function debugging messages were repressed.
67 */
68 extern G4long G4FFGDEBUG_DATA_STRUCTURE_REPRESSION_COUNTER;
69
70// Entering functions
71 /** G4FFG_FUNCTIONENTER__ is blank if G4DEBUG_VERBOSE is not defined at compile time.
72 * Otherwise, it is used by the fission fragment code to notify when a function is
73 * first entered.
74 */
75 #define G4FFG_FUNCTIONENTER__ \
76 if((Verbosity_ & G4FFGEnumerations::DEBUG) && !(Verbosity_ & G4FFGEnumerations::REPRESS_FUNCTION_ENTER_LEAVE_MESSAGES)) \
77 { \
78 G4FFG_SPACING__ \
79 G4cout << "Entering ";\
80 G4FFG_LOCATION__ \
81 G4cout << G4endl; \
82 } \
83 G4FFG_DEPTH++;
84
85 /** G4FFG_SAMPLING_FUNCTIONENTER__ wraps around G4FFG_FUNCTIONENTER__ and
86 * can be used in conjunctions with
87 * G4FFGEnumeration::REPRESS_RANDOM_SAMPLING_MESSAGES to repress debugging output
88 * for psuedorandom number generation functions
89 */
90 #define G4FFG_SAMPLING_FUNCTIONENTER__ \
91 if(!(Verbosity_ & G4FFGEnumerations::REPRESS_RANDOM_SAMPLING_MESSAGES)) \
92 { \
93 G4FFG_FUNCTIONENTER__ \
94 }
95
96 /** G4FFG_RECURSIVE_FUNCTIONENTER__ wraps around G4FFG_FUNCTIONENTER__ and
97 * can be used in conjunctions with
98 * G4FFGEnumeration::REPRESS_RECURSIVE_DEBUG_MESSAGES to repress debugging output
99 * recursive function calls.
100 */
101 #define G4FFG_RECURSIVE_FUNCTIONENTER__ \
102 if(Verbosity_ & G4FFGEnumerations::REPRESS_RECURSIVE_DEBUG_MESSAGES)\
103 { \
104 if(G4FFGDEBUG_RECURSIVE_REPRESSION == 0) \
105 { \
106 G4FFG_FUNCTIONENTER__ \
107 } else \
108 { \
109 G4FFGDEBUG_RECURSIVE_REPRESSION_COUNTER++; \
110 } \
111 G4FFGDEBUG_RECURSIVE_REPRESSION++; \
112 } else \
113 { \
114 G4FFG_FUNCTIONENTER__ \
115 }
116
117 /** G4FFG_DATA_FUNCTIONENTER__ wraps around G4FFG_FUNCTIONENTER__ and
118 * can be used in conjunctions with
119 * G4FFGEnumeration::REPRESS_DATA_STRUCTURE_DEBUG_MESSAGES to repress debugging output
120 * recursive function calls.
121 */
122 #define G4FFG_DATA_FUNCTIONENTER__ \
123 if(Verbosity_ & G4FFGEnumerations::REPRESS_DATA_STRUCTURE_DEBUG_MESSAGES)\
124 { \
125 if(G4FFGDEBUG_RECURSIVE_REPRESSION == 0) \
126 { \
127 G4FFG_FUNCTIONENTER__ \
128 } else \
129 { \
130 G4FFGDEBUG_DATA_STRUCTURE_REPRESSION_COUNTER++; \
131 } \
132 G4FFGDEBUG_RECURSIVE_REPRESSION++; \
133 } else \
134 { \
135 G4FFG_FUNCTIONENTER__ \
136 }
137
138// Leaving functions
139 /** G4FFG_FUNCTIONLEAVE__ is blank if G4DEBUG_VERBOSE is not defined at compile time.
140 * Otherwise, it is used by the fission fragment code to notify when a function is
141 * exited. It will also be found before \p return statements, since those exit a
142 * funtion as well.
143 */
144 #define G4FFG_FUNCTIONLEAVE__ \
145 G4FFG_DEPTH--; \
146 if((Verbosity_ & G4FFGEnumerations::DEBUG) && !(Verbosity_ & G4FFGEnumerations::REPRESS_FUNCTION_ENTER_LEAVE_MESSAGES)) \
147 { \
148 G4FFG_SPACING__ \
149 G4cout << "Leaving ";\
150 G4FFG_LOCATION__ \
151 G4cout << G4endl; \
152 }
153
154 /** G4FFG_SAMPLING_FUNCTIONLEAVE__ wraps around G4FFG_FUNCTIONLEAVE__ and
155 * can be used in conjunctions with
156 * G4FFGEnumeration::REPRESS_RANDOM_SAMPLING_MESSAGES to repress debugging output
157 * for psuedorandom number generation functions
158 */
159 #define G4FFG_SAMPLING_FUNCTIONLEAVE__ \
160 if(!(Verbosity_ & G4FFGEnumerations::REPRESS_RANDOM_SAMPLING_MESSAGES)) \
161 { \
162 G4FFG_FUNCTIONLEAVE__ \
163 }
164
165 /** G4FFG_RECURSIVE_FUNCTIONLEAVE__ wraps around G4FFG_FUNCTIONLEAVE__ and
166 * can be used in conjunctions with
167 * G4FFGEnumeration::REPRESS_RECURSIVE_DEBUG_MESSAGES to repress debugging output
168 * recursive function calls.
169 */
170 #define G4FFG_RECURSIVE_FUNCTIONLEAVE__ \
171 if(Verbosity_ & G4FFGEnumerations::REPRESS_RECURSIVE_DEBUG_MESSAGES)\
172 { \
173 G4FFGDEBUG_RECURSIVE_REPRESSION--; \
174 if(G4FFGDEBUG_RECURSIVE_REPRESSION == 0) \
175 { \
176 if(G4FFGDEBUG_RECURSIVE_REPRESSION_COUNTER > 0) \
177 { \
178 G4FFG_SPACING__ \
179 G4cout << "==== " << G4FFGDEBUG_RECURSIVE_REPRESSION_COUNTER * 2 << " recursive function messages suppressed ====" << G4endl; \
180 G4FFGDEBUG_RECURSIVE_REPRESSION_COUNTER = 0; \
181 } \
182 G4FFG_FUNCTIONLEAVE__ \
183 } \
184 } else \
185 { \
186 G4FFG_FUNCTIONLEAVE__ \
187 }
188
189 /** G4FFG_DATA_FUNCTIONLEAVE__ wraps around G4FFG_FUNCTIONLEAVE__ and
190 * can be used in conjunctions with
191 * G4FFGEnumeration::REPRESS_DATA_STRUCTURE_DEBUG_MESSAGES to repress debugging output
192 * recursive function calls.
193 */
194 #define G4FFG_DATA_FUNCTIONLEAVE__ \
195 if(Verbosity_ & G4FFGEnumerations::REPRESS_DATA_STRUCTURE_DEBUG_MESSAGES)\
196 { \
197 G4FFGDEBUG_RECURSIVE_REPRESSION--; \
198 if(G4FFGDEBUG_RECURSIVE_REPRESSION == 0) \
199 { \
200 if(G4FFGDEBUG_DATA_STRUCTURE_REPRESSION_COUNTER > 0) \
201 { \
202 G4FFG_SPACING__ \
203 G4cout << "==== " << G4FFGDEBUG_DATA_STRUCTURE_REPRESSION_COUNTER * 2 << " data structure function messages suppressed ====" << G4endl; \
204 G4FFGDEBUG_DATA_STRUCTURE_REPRESSION_COUNTER = 0; \
205 } \
206 G4FFG_FUNCTIONLEAVE__ \
207 } \
208 } else \
209 { \
210 G4FFG_FUNCTIONLEAVE__ \
211 }
212#else /* G4DEBUG_VERBOSE */
213// If G4DEBUG_VERBOSE is not defined then we will need to define these macros but leave them empty
214// Except for G4FFG_FUNCTIONENTER__ and G4FFG_FUNCTIONLEAVE__, which will be used to track G4FFG_DEPTH
215 #define G4FFG_FUNCTIONENTER__ G4FFG_DEPTH++;
216 #define G4FFG_SAMPLING_FUNCTIONENTER__
217 #define G4FFG_RECURSIVE_FUNCTIONENTER__
218 #define G4FFG_DATA_FUNCTIONENTER__
219 #define G4FFG_FUNCTIONLEAVE__ G4FFG_DEPTH--;
220 #define G4FFG_SAMPLING_FUNCTIONLEAVE__
221 #define G4FFG_RECURSIVE_FUNCTIONLEAVE__
222 #define G4FFG_DATA_FUNCTIONLEAVE__
223#endif /* G4DEBUG_VERBOSE */
224
225#endif /* G4FFGDEBUGGINGMACROS_HH */
226
long G4long
Definition: G4Types.hh:87