RTI Connext Traditional C++ API Version 7.3.0
ExceptionHelper.hpp
1/*
2(c) Copyright, Real-Time Innovations, 2018.
3All rights reserved.
4
5No duplications, whole or partial, manual or electronic, may be made
6without express written permission. Any such copies, or
7revisions thereof, must display this notice unaltered.
8This code contains trade secrets of Real-Time Innovations, Inc.
9*/
10
11
12#ifndef RTI_DDS_FLAT_EXCEPTIONHELPER_HPP_
13#define RTI_DDS_FLAT_EXCEPTIONHELPER_HPP_
14
15//
16// Enable debug assertions (RTI_FLAT_ASSERT) in debug mode
17//
18#if !defined(NDEBUG)
19#define RTI_FLAT_DATA_ENABLE_DEBUG_ASSERTIONS
20#endif
21
22//
23// Error handling without C++ exceptions (traditional C++ and Micro C++ APIs)
24//
25#ifdef RTI_FLAT_DATA_NO_EXCEPTIONS
26 // TODO: use MSG
27 #ifdef RTI_FLAT_DATA_ENABLE_DEBUG_ASSERTIONS
28 #define RTI_FLAT_ASSERT(COND, ACTION) \
29 if (!(COND)) { \
30 RTIXCdrFlatData_logPreconditionError(__FILE__, __LINE__, "Assertion failure: " #COND); \
31 ACTION; \
32 }
33 #else
34 #define RTI_FLAT_ASSERT(COND, ACTION)
35 #endif
36
37 // CR decission: Log error messages. Export function for each log kind (serialize, deserialize, precondition, skip)
38 // pass type/field (if possible) to serialization errors
39 #define RTI_FLAT_OFFSET_CHECK_NOT_NULL(ACTION) \
40 if (this->is_null()) { \
41 RTIXCdrFlatData_logPreconditionError(__FILE__, __LINE__, "null offset"); \
42 ACTION; \
43 }
44
45 #define RTI_FLAT_OFFSET_PRECONDITION_ERROR(MSG, ACTION) \
46 RTIXCdrFlatData_logPreconditionError(__FILE__, __LINE__, MSG); \
47 ACTION
48
49 #define RTI_FLAT_CHECK_PRECONDITION(COND, ACTION) \
50 if (!(COND)) { \
51 RTIXCdrFlatData_logPreconditionError(__FILE__, __LINE__, "Precondition failure: " #COND); \
52 ACTION; \
53 }
54
55 #define RTI_FLAT_BUILDER_CHECK_NOT_BOUND(ACTION) \
56 if (this->bind_position_) { \
57 RTIXCdrFlatData_logPreconditionError(__FILE__, __LINE__, "Builder is currently bound - call finish() first"); \
58 ACTION; \
59 }
60
61 #define RTI_FLAT_BUILDER_CHECK_CAN_FINISH(ACTION) \
62 if (!this->is_nested()) { \
63 RTIXCdrFlatData_logPreconditionError(__FILE__, __LINE__, "This is not a member builder; call finish_sample() instead"); \
64 ACTION; \
65 }
66
67 #define RTI_FLAT_BUILDER_CHECK_CAN_FINISH_SAMPLE(ACTION) \
68 if (this->is_nested()) { \
69 RTIXCdrFlatData_logPreconditionError(__FILE__, __LINE__, "This is a member builder; call finish() instead"); \
70 ACTION; \
71 }
72
73 #define RTI_FLAT_BUILDER_CHECK_VALID(ACTION) \
74 if (!this->is_valid()) { \
75 RTIXCdrFlatData_logPreconditionError(__FILE__, __LINE__, "This Builder is not valid"); \
76 ACTION; \
77 }
78
79 #define RTI_FLAT_BUILDER_CHECK_CREATE_BUILDER(BUILDER, ACTION) \
80 if (!BUILDER.is_valid()) { \
81 this->set_failure(); \
82 RTIXCdrFlatData_logCreationError(__FILE__, __LINE__, "Builder"); \
83 ACTION; \
84 }
85
86 #define RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(ACTION) \
87 this->set_failure(); \
88 RTIXCdrFlatData_logBuilderOutOfResources(__FILE__, __LINE__); \
89 ACTION
90
91 #define RTI_FLAT_BUILDER_PRECONDITION_ERROR(MSG, ACTION) \
92 this->set_failure(); \
93 RTIXCdrFlatData_logPreconditionError(__FILE__, __LINE__, MSG); \
94 ACTION
95
96//
97// Error handling with C++ exceptions (modern C++ API)
98//
99#else // !RTI_FLAT_DATA_NO_EXCEPTIONS
100
101 #ifdef RTI_FLAT_DATA_ENABLE_DEBUG_ASSERTIONS
102 #define RTI_FLAT_ASSERT(COND, ACTION) \
103 if (!(COND)) throw dds::core::PreconditionNotMetError("Assertion failure: " #COND)
104 #else
105 #define RTI_FLAT_ASSERT(COND, ACTION)
106 #endif
107
108 #define RTI_FLAT_OFFSET_CHECK_NOT_NULL(ACTION) \
109 if (this->is_null()) throw dds::core::NullReferenceError("null offset")
110
111 #define RTI_FLAT_OFFSET_PRECONDITION_ERROR(MSG, ACTION) \
112 throw dds::core::PreconditionNotMetError(MSG)
113
114 #define RTI_FLAT_CHECK_PRECONDITION(COND, ACTION) \
115 if (!(COND)) throw dds::core::PreconditionNotMetError("Precondition failure: " #COND)
116
117 #define RTI_FLAT_BUILDER_CHECK_NOT_BOUND(ACTION) \
118 if (bind_position_) \
119 throw dds::core::PreconditionNotMetError( \
120 "Builder is currently bound - call finish() first")
121
122 #define RTI_FLAT_BUILDER_CHECK_CAN_FINISH(ACTION) \
123 if (!is_nested()) \
124 throw dds::core::PreconditionNotMetError( \
125 "This is not a member builder; call finish_sample() instead")
126
127 #define RTI_FLAT_BUILDER_CHECK_CAN_FINISH_SAMPLE(ACTION) \
128 if (is_nested()) \
129 throw dds::core::PreconditionNotMetError( \
130 "This is a member builder; call finish() instead")
131
132 #define RTI_FLAT_BUILDER_CHECK_VALID(ACTION) \
133 if (!is_valid()) \
134 throw dds::core::PreconditionNotMetError("This Builder is not valid")
135
136 // With exceptions, nothing to check (exception would have been thrown)
137 #define RTI_FLAT_BUILDER_CHECK_CREATE_BUILDER(BUILDER, ACTION)
138
139 #define RTI_FLAT_BUILDER_OUT_OF_RESOURCES_ERROR(ACTION) \
140 throw dds::core::OutOfResourcesError("builder reached end of buffer")
141
142 #define RTI_FLAT_BUILDER_PRECONDITION_ERROR(MSG, ACTION) \
143 throw dds::core::PreconditionNotMetError(MSG)
144
145
146#endif // RTI_FLAT_DATA_NO_EXCEPTIONS
147
148//
149// Error checking (other than assertions) in release mode is enabled unless
150// the sources are compiled with -DRTI_FLAT_DATA_DISABLE_ERROR_CHECKING
151//
152// In that case, most error checks that deal with preconditions due to incorrect
153// usage of the API are disabled in release mode. This would lead to undefined
154// behavior in case of bad usage, but can improve performance.
155//
156#if defined(RTI_FLAT_DATA_ENABLE_DEBUG_ASSERTIONS) \
157 || !defined(RTI_FLAT_DATA_DISABLE_ERROR_CHECKING)
158#define RTI_FLAT_DATA_ENABLE_ERROR_CHECKING
159#endif
160
161#ifndef RTI_FLAT_DATA_ENABLE_ERROR_CHECKING
162
163 #define RTI_FLAT_OFFSET_CHECK_NOT_NULL(ACTION)
164 #define RTI_FLAT_ASSERT(COND, ACTION)
165 #define RTI_FLAT_CHECK_PRECONDITION(COND, ACTION)
166 #define RTI_FLAT_BUILDER_CHECK_NOT_BOUND(ACTION)
167 #define RTI_FLAT_BUILDER_CHECK_CAN_FINISH(ACTION)
168 #define RTI_FLAT_BUILDER_CHECK_CAN_FINISH_SAMPLE(ACTION)
169 #define RTI_FLAT_BUILDER_CHECK_VALID(ACTION)
170 #define RTI_FLAT_BUILDER_CHECK_CREATE_BUILDER(BUILDER, ACTION)
171
172#endif // RTI_FLAT_DATA_ENABLE_ERROR_CHECKING
173
174namespace rti { namespace flat { namespace detail {
175
176} } }
177
178#endif // RTI_DDS_FLAT_EXCEPTIONHELPER_HPP_
179
The RTI namespace.
Definition: AggregationBuilders.hpp:17