GCC Code Coverage Report


Directory: src/gate/
File: src/gate/gatetypes.hpp
Date: 2025-09-14 13:10:38
Exec Total Coverage
Lines: 4 9 44.4%
Functions: 3 8 37.5%
Branches: 0 2 0.0%

Line Branch Exec Source
1 /* GATE PROJECT LICENSE:
2 +----------------------------------------------------------------------------+
3 | Copyright(c) 2018-2025, Stefan Meislinger <sm@opengate.at> |
4 | All rights reserved. |
5 | |
6 | Redistribution and use in source and binary forms, with or without |
7 | modification, are permitted provided that the following conditions are met:|
8 | |
9 | 1. Redistributions of source code must retain the above copyright notice, |
10 | this list of conditions and the following disclaimer. |
11 | 2. Redistributions in binary form must reproduce the above copyright |
12 | notice, this list of conditions and the following disclaimer in the |
13 | documentation and/or other materials provided with the distribution. |
14 | |
15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"|
16 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
17 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
18 | ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
19 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
20 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
21 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
22 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
23 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
24 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
25 | THE POSSIBILITY OF SUCH DAMAGE. |
26 +----------------------------------------------------------------------------+
27 */
28
29 /** @file
30 * @brief Basic gate namespace typedefs and utility interfaces
31 * @ingroup gatecore_cpp
32 */
33
34
35 #ifndef GATE_GATETYPES_HPP_INCLUDED
36 #define GATE_GATETYPES_HPP_INCLUDED
37
38 #include "gate/gate_core_api.hpp"
39 #include "gate/gatetypes.h"
40
41 #if defined(_MSC_VER)
42
43 # if (_MSC_VER <= 1309)
44 /* VC++ 6.0 + VC++ 7.0 */
45 # define GATE_COMPILER_USE_ENUMS_AS_TEMPLATE_CONSTANTS 1
46 # endif
47
48 # if (_MSC_VER >= 1310) /* VC++ 2003 or newer */
49 # define GATE_COMPILER_SUPPORTS_CPP_ARRAY_SIZE_DEDUCTION 1
50 # define GATE_COMPILER_SUPPORTS_CPP_PARTIAL_TEMPLATE_SPECIALIZATION 1
51 # endif
52
53 # if (_MSC_VER >= 1600) /* VC++ 2010 or newer */
54 # define GATE_COMPILER_SUPPORTS_CPP_AUTO 1
55 # define GATE_COMPILER_SUPPORTS_CPP_DECLTYPE 1
56 # define GATE_COMPILER_SUPPORTS_CPP_MOVEREFS 1
57 # define GATE_COMPILER_SUPPORTS_CPP_OVERRIDE 1
58 # define GATE_COMPILER_SUPPORTS_CPP_LAMBDA 1
59 # define GATE_COMPILER_SUPPORTS_CPP_STD11 1 /* C++11 support available */
60
61 # endif
62
63 # if (_MSC_VER >= 1700) /* VC++ 2012 or newer */
64 # define GATE_COMPILER_SUPPORTS_CPP_FINAL 1
65 # endif
66
67 # if (_MSC_VER >= 1800) /* VC++ 2013 or newer */
68 # if (_MSC_VER < 1900)
69 # define GATEXX_ATTR_NORETURN __declspec(noreturn)
70 # endif
71 # endif
72
73 # if (_MSC_VER >= 1900) /* VC++ 2015 or newer */
74 # define GATE_COMPULER_SUPPORTS_CPP_NORETURN 1
75 # define GATE_COMPILER_SUPPORTS_CPP_CONSTEXPR 1
76 # define GATE_COMPILER_SUPPORTS_CPP_NOEXCEPT 1
77 # endif
78
79 # if (_MSC_VER < 1900) /* prior VC 2015 */
80 # if (_MSC_VER >= 1700) /* special case for VC2012: allow C++ macro-keywords like noexcept */
81 # define _ALLOW_KEYWORD_MACROS 1
82 # endif
83 # endif
84
85 #endif
86
87 #if defined(__GNUC__) || defined(__clang__)
88 # define GATE_COMPILER_SUPPORTS_CPP_ARRAY_SIZE_DEDUCTION 1
89 # define GATE_COMPILER_SUPPORTS_CPP_PARTIAL_TEMPLATE_SPECIALIZATION 1
90
91 # if __cplusplus >= 201103L
92 # define GATE_COMPILER_SUPPORTS_CPP_AUTO 1
93 # define GATE_COMPILER_SUPPORTS_CPP_DECLTYPE 1
94 # define GATE_COMPILER_SUPPORTS_CPP_MOVEREFS 1
95 # define GATE_COMPILER_SUPPORTS_CPP_OVERRIDE 1
96 # define GATE_COMPILER_SUPPORTS_CPP_LAMBDA 1
97 # define GATE_COMPILER_SUPPORTS_CPP_STD11 1
98 # define GATE_COMPILER_SUPPORTS_CPP_FINAL 1
99 # define GATE_COMPILER_SUPPORTS_CPP_NOEXCEPT 1
100 # define GATE_COMPILER_SUPPORTS_CPP_CONSTEXPR 1
101 # endif
102 #endif
103
104 #if defined(__WATCOMC__)
105 # define GATE_COMPILER_SUPPORTS_CPP_PARTIAL_TEMPLATE_SPECIALIZATION
106 /* no further C++11 features expected */
107 #endif
108
109
110 #if !defined(GATE_COMPILER_SUPPORTS_CPP_NOEXCEPT)
111 # define noexcept throw()
112 #endif
113
114 #if !defined(GATE_COMPILER_SUPPORTS_CPP_OVERRIDE)
115 # define override
116 #endif
117
118 #if !defined(GATE_COMPILER_SUPPORTS_CPP_FINAL)
119 # define final
120 #endif
121
122 #if !defined(GATE_COMPILER_SUPPORTS_CPP_CONSTEXPR)
123 # define constexpr const
124 # define GATE_CONSTEXPR_VAR
125 # define GATE_CONSTEXPR_FUNC
126 #else
127 # define GATE_CONSTEXPR_VAR constexpr
128 # define GATE_CONSTEXPR_FUNC constexpr
129 #endif
130
131 #if !defined(GATEXX_ATTR_NORETURN)
132 # if defined(GATE_COMPULER_SUPPORTS_CPP_NORETURN)
133 # define GATEXX_ATTR_NORETURN [[noreturn]]
134 # else
135 # define GATEXX_ATTR_NORETURN
136 # endif
137 #endif
138
139 namespace gate
140 {
141
142 #if __cplusplus >= 201103L
143 # define GATEXX_TYPE_ALIAS(existing_name, new_name) using new_name = existing_name
144 #else
145 # define GATEXX_TYPE_ALIAS(existing_name, new_name) typedef existing_name new_name
146 #endif
147 GATEXX_TYPE_ALIAS(::gate_char8_t, char_8_t);
148 GATEXX_TYPE_ALIAS(::gate_char16_t, char_16_t);
149 GATEXX_TYPE_ALIAS(::gate_char32_t, char_32_t);
150
151 GATEXX_TYPE_ALIAS(::gate_bool_t, bool_t);
152 GATEXX_TYPE_ALIAS(::gate_int8_t, int8_t);
153 GATEXX_TYPE_ALIAS(::gate_int16_t, int16_t);
154 GATEXX_TYPE_ALIAS(::gate_int32_t, int32_t);
155 GATEXX_TYPE_ALIAS(::gate_int64_t, int64_t);
156 GATEXX_TYPE_ALIAS(::gate_uint8_t, uint8_t);
157 GATEXX_TYPE_ALIAS(::gate_uint16_t, uint16_t);
158 GATEXX_TYPE_ALIAS(::gate_uint32_t, uint32_t);
159 GATEXX_TYPE_ALIAS(::gate_uint64_t, uint64_t);
160
161 GATEXX_TYPE_ALIAS(::gate_real32_t, real32_t);
162 GATEXX_TYPE_ALIAS(::gate_real64_t, real64_t);
163
164 GATEXX_TYPE_ALIAS(::gate_intptr_t, intptr_t);
165 GATEXX_TYPE_ALIAS(::gate_uintptr_t, uintptr_t);
166 GATEXX_TYPE_ALIAS(::gate_size_t, size_t);
167 GATEXX_TYPE_ALIAS(::gate_index_t, index_t);
168
169 GATEXX_TYPE_ALIAS(::gate_result_t, result_t);
170 GATEXX_TYPE_ALIAS(::gate_enumint_t, enumint_t);
171 GATEXX_TYPE_ALIAS(::gate_handle_t, handle_t);
172
173 GATEXX_TYPE_ALIAS(::gate_hash_code_t, hash_code_t);
174
175
176 GATE_CORE_CPP_API extern void panic(result_t resultCode, char const* source);
177
178 #define GATE_PANIC(resultCode) panic(resultCode, GATE_CURRENT_FUNCTION_NAME)
179
180
181 /// @brief
182 class GATE_CORE_CPP_API IRunnable
183 {
184 public:
185 virtual ~IRunnable() noexcept;
186
187 virtual void run() = 0;
188 };
189
190
191 /// @brief
192 class GATE_CORE_CPP_API IQuitable
193 {
194 public:
195 virtual ~IQuitable() noexcept;
196
197 virtual void quit() = 0;
198 };
199
200
201 /// @brief
202 class GATE_CORE_CPP_API ICancelable
203 {
204 public:
205 virtual ~ICancelable() noexcept;
206
207 virtual void cancel() = 0;
208 };
209
210
211 /// @brief
212 class UnusableType
213 {
214 private:
215 UnusableType();
216 UnusableType(UnusableType&);
217 UnusableType& operator=(UnusableType&);
218 ~UnusableType();
219 public:
220 static const bool value;
221 };
222
223
224 /// @brief
225 /// @tparam T
226 template<class T>
227 class SafeBoolBase
228 {
229 private:
230 void safe_bool_method() const
231 {
232 }
233
234 public:
235 typedef void(SafeBoolBase::* bool_type)() const;
236
237 public:
238 operator bool_type() const
239 {
240 T const& derived_impl = *static_cast<T const*>(this);
241 return !derived_impl ? 0 : &SafeBoolBase<T>::safe_bool_method;
242 }
243 };
244
245 struct GATE_CORE_CPP_API NonCopyable
246 {
247 private:
248 NonCopyable(NonCopyable const&);
249 NonCopyable& operator=(NonCopyable const&);
250 protected:
251 279 NonCopyable() noexcept {}
252 };
253
254 #if defined(GATE_COMPILER_SUPPORTS_CPP_MOVEREFS)
255 # define GATE_MOVEREF(type) type &&
256 #else
257 # define GATE_MOVEREF(type) UnusableType &
258 #endif
259
260 53 template<class T, class U> T union_cast(U src)
261 {
262 union
263 {
264 U src;
265 T dst;
266 } converter;
267
268 53 converter.src = src;
269 53 return converter.dst;
270 }
271
272 }
273
274 #define GATE_ENUM_FLAGS_DECLARE(enum_type) \
275 template<class T> T operator|(T const& a, enum_type const& b) \
276 { \
277 return static_cast< T >(static_cast<int>(a) | static_cast<int>(b)); \
278 } \
279 template<class T> T operator&(T const& a, enum_type const& b) \
280 { \
281 return static_cast< T >(static_cast<int>(a) & static_cast<int>(b)); \
282 } \
283 template<class T> T operator==(T const& a, enum_type const& b) \
284 { \
285 return static_cast<int>(a) == static_cast<int>(b); \
286 }
287
288 #endif
289