Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups 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:80