All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
diagnosticLite.h
Go to the documentation of this file.
1 //
2 // Copyright 2016 Pixar
3 //
4 // Licensed under the Apache License, Version 2.0 (the "Apache License")
5 // with the following modification; you may not use this file except in
6 // compliance with the Apache License and the following modification to it:
7 // Section 6. Trademarks. is deleted and replaced with:
8 //
9 // 6. Trademarks. This License does not grant permission to use the trade
10 // names, trademarks, service marks, or product names of the Licensor
11 // and its affiliates, except as required to comply with Section 4(c) of
12 // the License and to reproduce the content of the NOTICE file.
13 //
14 // You may obtain a copy of the Apache License at
15 //
16 // http://www.apache.org/licenses/LICENSE-2.0
17 //
18 // Unless required by applicable law or agreed to in writing, software
19 // distributed under the Apache License with the above modification is
20 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21 // KIND, either express or implied. See the Apache License for the specific
22 // language governing permissions and limitations under the Apache License.
23 //
24 #ifndef PXR_BASE_TF_DIAGNOSTIC_LITE_H
25 #define PXR_BASE_TF_DIAGNOSTIC_LITE_H
26 
41 
42 #include "pxr/pxr.h"
43 #include "pxr/base/arch/attributes.h"
44 #include "pxr/base/tf/api.h"
45 #include "pxr/base/arch/buildMode.h"
46 #include "pxr/base/arch/hints.h"
47 #include "pxr/base/tf/callContext.h"
48 
49 #include <stddef.h>
50 
51 PXR_NAMESPACE_OPEN_SCOPE
52 
55 enum TfDiagnosticType : int {
56  TF_DIAGNOSTIC_INVALID_TYPE = 0,
57  TF_DIAGNOSTIC_CODING_ERROR_TYPE,
58  TF_DIAGNOSTIC_FATAL_CODING_ERROR_TYPE,
59  TF_DIAGNOSTIC_RUNTIME_ERROR_TYPE,
60  TF_DIAGNOSTIC_FATAL_ERROR_TYPE,
61  TF_DIAGNOSTIC_NONFATAL_ERROR_TYPE,
62  TF_DIAGNOSTIC_WARNING_TYPE,
63  TF_DIAGNOSTIC_STATUS_TYPE,
64  TF_APPLICATION_EXIT_TYPE,
65 };
66 
67 
68 #if !defined(doxygen)
69 
70 struct Tf_DiagnosticLiteHelper {
71  constexpr Tf_DiagnosticLiteHelper(TfCallContext const &context,
72  TfDiagnosticType type)
73  : _context(context),
74  _type(type)
75  {
76  }
77 
78  TF_API void IssueError(
79  char const *fmt, ...) const ARCH_PRINTF_FUNCTION(2,3);
80  TF_API void IssueFatalError(
81  char const *fmt, ...) const ARCH_PRINTF_FUNCTION(2,3);
82  TF_API void IssueWarning(
83  char const *fmt, ...) const ARCH_PRINTF_FUNCTION(2,3);
84  TF_API void IssueStatus(
85  char const *fmt, ...) const ARCH_PRINTF_FUNCTION(2,3);
86 
87 private:
88  TfCallContext _context;
89  TfDiagnosticType _type;
90 };
91 
92 #define TF_CODING_ERROR \
93  Tf_DiagnosticLiteHelper(TF_CALL_CONTEXT, \
94  TF_DIAGNOSTIC_CODING_ERROR_TYPE).IssueError
95 
96 #define TF_CODING_WARNING \
97  Tf_DiagnosticLiteHelper(TF_CALL_CONTEXT, \
98  TF_DIAGNOSTIC_CODING_ERROR_TYPE).IssueWarning \
99 
100 #define TF_FATAL_CODING_ERROR \
101  Tf_DiagnosticLiteHelper(TF_CALL_CONTEXT, \
102  TF_DIAGNOSTIC_CODING_ERROR_TYPE).IssueFatalError
103 
104 #define TF_RUNTIME_ERROR \
105  Tf_DiagnosticLiteHelper(TF_CALL_CONTEXT, \
106  TF_DIAGNOSTIC_RUNTIME_ERROR_TYPE).IssueError
107 
108 #define TF_FATAL_ERROR \
109  Tf_DiagnosticLiteHelper(TF_CALL_CONTEXT, \
110  TF_DIAGNOSTIC_FATAL_ERROR_TYPE).IssueFatalError
111 
112 #define TF_DIAGNOSTIC_FATAL_ERROR \
113  Tf_DiagnosticLiteHelper(TF_CALL_CONTEXT, \
114  TF_DIAGNOSTIC_RUNTIME_ERROR_TYPE).IssueFatalError
115 
116 #define TF_DIAGNOSTIC_NONFATAL_ERROR \
117  Tf_DiagnosticLiteHelper(TF_CALL_CONTEXT, \
118  TF_DIAGNOSTIC_WARNING_TYPE).IssueWarning
119 
120 #define TF_DIAGNOSTIC_WARNING \
121  Tf_DiagnosticLiteHelper(TF_CALL_CONTEXT.Hide(), \
122  TF_DIAGNOSTIC_WARNING_TYPE).IssueWarning
123 
124 #define TF_WARN \
125  Tf_DiagnosticLiteHelper(TF_CALL_CONTEXT, \
126  TF_DIAGNOSTIC_WARNING_TYPE).IssueWarning
127 
128 #define TF_STATUS \
129  Tf_DiagnosticLiteHelper(TF_CALL_CONTEXT, \
130  TF_DIAGNOSTIC_STATUS_TYPE).IssueStatus
131 
132 constexpr bool
133 Tf_AxiomHelper(bool val, TfCallContext const &ctx, char const *txt) {
134  return (ARCH_LIKELY(val)) ? true :
135  (Tf_DiagnosticLiteHelper(ctx, TF_DIAGNOSTIC_FATAL_ERROR_TYPE).
136  IssueFatalError("Failed axiom: ' %s '", txt), false);
137 }
138 
139 #define TF_AXIOM(cond) \
140  Tf_AxiomHelper(static_cast<bool>((cond)), TF_CALL_CONTEXT, #cond)
141 
142 #define TF_DEV_AXIOM(cond) \
143  Tf_AxiomHelper(!ARCH_DEV_BUILD || \
144  static_cast<bool>((cond)), TF_CALL_CONTEXT, #cond)
145 
146 #endif // !defined(doxygen)
147 
148 PXR_NAMESPACE_CLOSE_SCOPE
149 
150 #endif // PXR_BASE_TF_DIAGNOSTIC_LITE_H
#define ARCH_PRINTF_FUNCTION(_fmt, _firstArg)
Macro used to indicate a function takes a printf-like specification.
Definition: attributes.h:51
TfDiagnosticType
Enum describing various diagnostic conditions.