SimpleITK  
sitkMacro.h
Go to the documentation of this file.
1/*=========================================================================
2 *
3 * Copyright NumFOCUS
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0.txt
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *=========================================================================*/
18#ifndef sitkMacro_h
19#define sitkMacro_h
20
21#include <stdint.h>
22#include <stddef.h>
23#include <cassert>
24#include <sstream>
25#include <limits>
26
27#include "sitkConfigure.h"
28
29
30// Setup symbol exports
31//
32#if defined _WIN32 || defined __CYGWIN__
33# ifdef __GNUC__
34# define SITK_ABI_EXPORT __attribute__((dllexport))
35# define SITK_ABI_IMPORT __attribute__((dllimport))
36# define SITK_ABI_HIDDEN
37# else
38# define SITK_ABI_EXPORT __declspec(dllexport) // Note: actually gcc seems to also supports this syntax.
39# define SITK_ABI_IMPORT __declspec(dllimport) // Note: actually gcc seems to also supports this syntax.
40# define SITK_ABI_HIDDEN
41# endif
42#else
43# if __GNUC__ >= 4
44# define SITK_ABI_EXPORT __attribute__((visibility("default")))
45# define SITK_ABI_IMPORT __attribute__((visibility("default")))
46# define SITK_ABI_HIDDEN __attribute__((visibility("hidden")))
47# else
48# define SITK_ABI_EXPORT
49# define SITK_ABI_IMPORT
50# define SITK_ABI_HIDDEN
51# endif
52#endif
53
54#if defined(SITK_HAS_TEMPLATE_DISAMBIGUATOR_DEPENDENT_NAME)
55# define CLANG_TEMPLATE template
56#else
57# define CLANG_TEMPLATE
58#endif
59
60namespace itk::simple
61{
62
63class GenericException;
64
65#define sitkExceptionMacro(x) \
66 { \
67 std::ostringstream message; \
68 message << "sitk::ERROR: " x; \
69 throw ::itk::simple::GenericException(__FILE__, __LINE__, message.str().c_str()); \
70 }
71
72#define sitkWarningMacro(x) \
73 { \
74 std::ostringstream msg; \
75 msg << this->GetName() << " (" << this << "): " x; \
76 itk::OutputWindowDisplayWarningText(msg.str().c_str()); \
77 }
78
79
80#define sitkDebugMacro(x) \
81 { \
82 if (this->GetDebug()) \
83 { \
84 std::ostringstream msg; \
85 msg << "Debug: " << this->GetName() << " (" << this << "): " x << "\n\n"; \
86 ::itk::OutputWindowDisplayDebugText(msg.str().c_str()); \
87 } \
88 }
89
90#define sitkMacroJoin(X, Y) sitkDoMacroJoin(X, Y)
91#define sitkDoMacroJoin(X, Y) sitkDoMacroJoin2(X, Y)
92#define sitkDoMacroJoin2(X, Y) X##Y
93
94} // namespace itk::simple
95
96#define sitkPragma(x) _Pragma(#x)
97
98#if defined(__clang__) && defined(__has_warning)
99# define sitkClangDiagnosticPush() sitkPragma(clang diagnostic push)
100# define sitkClangDiagnosticPop() sitkPragma(clang diagnostic pop)
101# define sitkClangWarningIgnore_0(x)
102# define sitkClangWarningIgnore_1(x) sitkPragma(clang diagnostic ignored x)
103# define sitkClangWarningIgnore(x) sitkMacroJoin(sitkClangWarningIgnore_, __has_warning(x))(x)
104#else
105# define sitkClangDiagnosticPush()
106# define sitkClangDiagnosticPop()
107# define sitkClangWarningIgnore(x)
108#endif
109
110
111#endif