/src/gdal/third_party/flatbuffers/base.h
Line | Count | Source |
1 | | #ifndef FLATBUFFERS_BASE_H_ |
2 | | #define FLATBUFFERS_BASE_H_ |
3 | | |
4 | | // clang-format off |
5 | | |
6 | | // If activate should be declared and included first. |
7 | | #if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && \ |
8 | | defined(_MSC_VER) && defined(_DEBUG) |
9 | | // The _CRTDBG_MAP_ALLOC inside <crtdbg.h> will replace |
10 | | // calloc/free (etc) to its debug version using #define directives. |
11 | | #define _CRTDBG_MAP_ALLOC |
12 | | #include <stdlib.h> |
13 | | #include <crtdbg.h> |
14 | | // Replace operator new by trace-enabled version. |
15 | | #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) |
16 | | #define new DEBUG_NEW |
17 | | #endif |
18 | | |
19 | | #if !defined(FLATBUFFERS_ASSERT) |
20 | | #include <assert.h> |
21 | 688k | #define FLATBUFFERS_ASSERT assert |
22 | | #elif defined(FLATBUFFERS_ASSERT_INCLUDE) |
23 | | // Include file with forward declaration |
24 | | #include FLATBUFFERS_ASSERT_INCLUDE |
25 | | #endif |
26 | | |
27 | | #ifndef ARDUINO |
28 | | #include <cstdint> |
29 | | #endif |
30 | | |
31 | | #include <cstddef> |
32 | | #include <cstdlib> |
33 | | #include <cstring> |
34 | | |
35 | | #if defined(ARDUINO) && !defined(ARDUINOSTL_M_H) |
36 | | #include <utility.h> |
37 | | #else |
38 | | #include <utility> |
39 | | #endif |
40 | | |
41 | | #include <string> |
42 | | #include <type_traits> |
43 | | #include <vector> |
44 | | #include <set> |
45 | | #include <algorithm> |
46 | | #include <iterator> |
47 | | #include <memory> |
48 | | |
49 | | #if defined(__unix__) && !defined(FLATBUFFERS_LOCALE_INDEPENDENT) |
50 | | #include <unistd.h> |
51 | | #endif |
52 | | |
53 | | #ifdef __ANDROID__ |
54 | | #include <android/api-level.h> |
55 | | #endif |
56 | | |
57 | | #if defined(__ICCARM__) |
58 | | #include <intrinsics.h> |
59 | | #endif |
60 | | |
61 | | // Note the __clang__ check is needed, because clang presents itself |
62 | | // as an older GNUC compiler (4.2). |
63 | | // Clang 3.3 and later implement all of the ISO C++ 2011 standard. |
64 | | // Clang 3.4 and later implement all of the ISO C++ 2014 standard. |
65 | | // http://clang.llvm.org/cxx_status.html |
66 | | |
67 | | // Note the MSVC value '__cplusplus' may be incorrect: |
68 | | // The '__cplusplus' predefined macro in the MSVC stuck at the value 199711L, |
69 | | // indicating (erroneously!) that the compiler conformed to the C++98 Standard. |
70 | | // This value should be correct starting from MSVC2017-15.7-Preview-3. |
71 | | // The '__cplusplus' will be valid only if MSVC2017-15.7-P3 and the `/Zc:__cplusplus` switch is set. |
72 | | // Workaround (for details see MSDN): |
73 | | // Use the _MSC_VER and _MSVC_LANG definition instead of the __cplusplus for compatibility. |
74 | | // The _MSVC_LANG macro reports the Standard version regardless of the '/Zc:__cplusplus' switch. |
75 | | |
76 | | #if defined(__GNUC__) && !defined(__clang__) |
77 | | #define FLATBUFFERS_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) |
78 | | #else |
79 | | #define FLATBUFFERS_GCC 0 |
80 | | #endif |
81 | | |
82 | | #if defined(__clang__) |
83 | | #define FLATBUFFERS_CLANG (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) |
84 | | #else |
85 | | #define FLATBUFFERS_CLANG 0 |
86 | | #endif |
87 | | |
88 | | /// @cond FLATBUFFERS_INTERNAL |
89 | | #if __cplusplus <= 199711L && \ |
90 | | (!defined(_MSC_VER) || _MSC_VER < 1600) && \ |
91 | | (!defined(__GNUC__) || \ |
92 | | (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40400)) |
93 | | #error A C++11 compatible compiler with support for the auto typing is \ |
94 | | required for FlatBuffers. |
95 | | #error __cplusplus _MSC_VER __GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__ |
96 | | #endif |
97 | | |
98 | | #if !defined(__clang__) && \ |
99 | | defined(__GNUC__) && \ |
100 | | (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40600) |
101 | | // Backwards compatibility for g++ 4.4, and 4.5 which don't have the nullptr |
102 | | // and constexpr keywords. Note the __clang__ check is needed, because clang |
103 | | // presents itself as an older GNUC compiler. |
104 | | #ifndef nullptr_t |
105 | | const class nullptr_t { |
106 | | public: |
107 | | template<class T> inline operator T*() const { return 0; } |
108 | | private: |
109 | | void operator&() const; |
110 | | } nullptr = {}; |
111 | | #endif |
112 | | #ifndef constexpr |
113 | | #define constexpr const |
114 | | #endif |
115 | | #endif |
116 | | |
117 | | // The wire format uses a little endian encoding (since that's efficient for |
118 | | // the common platforms). |
119 | | #if defined(__s390x__) |
120 | | #define FLATBUFFERS_LITTLEENDIAN 0 |
121 | | #endif // __s390x__ |
122 | | #if !defined(FLATBUFFERS_LITTLEENDIAN) |
123 | | #if defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__) |
124 | | #if (defined(__BIG_ENDIAN__) || \ |
125 | | (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) |
126 | | #define FLATBUFFERS_LITTLEENDIAN 0 |
127 | | #else |
128 | | #define FLATBUFFERS_LITTLEENDIAN 1 |
129 | | #endif // __BIG_ENDIAN__ |
130 | | #elif defined(_MSC_VER) |
131 | | #if defined(_M_PPC) |
132 | | #define FLATBUFFERS_LITTLEENDIAN 0 |
133 | | #else |
134 | | #define FLATBUFFERS_LITTLEENDIAN 1 |
135 | | #endif |
136 | | #else |
137 | | #error Unable to determine endianness, define FLATBUFFERS_LITTLEENDIAN. |
138 | | #endif |
139 | | #endif // !defined(FLATBUFFERS_LITTLEENDIAN) |
140 | | |
141 | | #define FLATBUFFERS_VERSION_MAJOR 2 |
142 | | #define FLATBUFFERS_VERSION_MINOR 0 |
143 | | #define FLATBUFFERS_VERSION_REVISION 8 |
144 | | #define FLATBUFFERS_STRING_EXPAND(X) #X |
145 | | #define FLATBUFFERS_STRING(X) FLATBUFFERS_STRING_EXPAND(X) |
146 | | namespace flatbuffers { |
147 | | // Returns version as string "MAJOR.MINOR.REVISION". |
148 | | const char* FLATBUFFERS_VERSION(); |
149 | | } |
150 | | |
151 | | #if (!defined(_MSC_VER) || _MSC_VER > 1600) && \ |
152 | | (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 407)) || \ |
153 | | defined(__clang__) |
154 | | #define FLATBUFFERS_FINAL_CLASS final |
155 | | #define FLATBUFFERS_OVERRIDE override |
156 | | #define FLATBUFFERS_EXPLICIT_CPP11 explicit |
157 | | #define FLATBUFFERS_VTABLE_UNDERLYING_TYPE : flatbuffers::voffset_t |
158 | | #else |
159 | | #define FLATBUFFERS_FINAL_CLASS |
160 | | #define FLATBUFFERS_OVERRIDE |
161 | | #define FLATBUFFERS_EXPLICIT_CPP11 |
162 | | #define FLATBUFFERS_VTABLE_UNDERLYING_TYPE |
163 | | #endif |
164 | | |
165 | | #if (!defined(_MSC_VER) || _MSC_VER >= 1900) && \ |
166 | | (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) || \ |
167 | | (defined(__cpp_constexpr) && __cpp_constexpr >= 200704) |
168 | | #define FLATBUFFERS_CONSTEXPR constexpr |
169 | | #define FLATBUFFERS_CONSTEXPR_CPP11 constexpr |
170 | | #define FLATBUFFERS_CONSTEXPR_DEFINED |
171 | | #else |
172 | | #define FLATBUFFERS_CONSTEXPR const |
173 | | #define FLATBUFFERS_CONSTEXPR_CPP11 |
174 | | #endif |
175 | | |
176 | | #if (defined(__cplusplus) && __cplusplus >= 201402L) || \ |
177 | | (defined(__cpp_constexpr) && __cpp_constexpr >= 201304) |
178 | | #define FLATBUFFERS_CONSTEXPR_CPP14 FLATBUFFERS_CONSTEXPR_CPP11 |
179 | | #else |
180 | | #define FLATBUFFERS_CONSTEXPR_CPP14 |
181 | | #endif |
182 | | |
183 | | #if (defined(__GXX_EXPERIMENTAL_CXX0X__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) || \ |
184 | | (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190023026)) || \ |
185 | | defined(__clang__) |
186 | | #define FLATBUFFERS_NOEXCEPT noexcept |
187 | | #else |
188 | | #define FLATBUFFERS_NOEXCEPT |
189 | | #endif |
190 | | |
191 | | // NOTE: the FLATBUFFERS_DELETE_FUNC macro may change the access mode to |
192 | | // private, so be sure to put it at the end or reset access mode explicitly. |
193 | | #if (!defined(_MSC_VER) || _MSC_FULL_VER >= 180020827) && \ |
194 | | (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 404)) || \ |
195 | | defined(__clang__) |
196 | | #define FLATBUFFERS_DELETE_FUNC(func) func = delete |
197 | | #else |
198 | | #define FLATBUFFERS_DELETE_FUNC(func) private: func |
199 | | #endif |
200 | | |
201 | | #if (!defined(_MSC_VER) || _MSC_VER >= 1900) && \ |
202 | | (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)) || \ |
203 | | defined(__clang__) |
204 | | #define FLATBUFFERS_DEFAULT_DECLARATION |
205 | | #endif |
206 | | |
207 | | // Check if we can use template aliases |
208 | | // Not possible if Microsoft Compiler before 2012 |
209 | | // Possible is the language feature __cpp_alias_templates is defined well |
210 | | // Or possible if the C++ std is C+11 or newer |
211 | | #if (defined(_MSC_VER) && _MSC_VER > 1700 /* MSVC2012 */) \ |
212 | | || (defined(__cpp_alias_templates) && __cpp_alias_templates >= 200704) \ |
213 | | || (defined(__cplusplus) && __cplusplus >= 201103L) |
214 | | #define FLATBUFFERS_TEMPLATES_ALIASES |
215 | | #endif |
216 | | |
217 | | #ifndef FLATBUFFERS_HAS_STRING_VIEW |
218 | | // Only provide flatbuffers::string_view if __has_include can be used |
219 | | // to detect a header that provides an implementation |
220 | | #if defined(__has_include) |
221 | | // Check for std::string_view (in c++17) |
222 | | #if __has_include(<string_view>) && (__cplusplus >= 201606 || (defined(_HAS_CXX17) && _HAS_CXX17)) |
223 | | #include <string_view> |
224 | | namespace flatbuffers { |
225 | | typedef std::string_view string_view; |
226 | | } |
227 | | #define FLATBUFFERS_HAS_STRING_VIEW 1 |
228 | | // Check for std::experimental::string_view (in c++14, compiler-dependent) |
229 | | #elif __has_include(<experimental/string_view>) && (__cplusplus >= 201411) |
230 | | #include <experimental/string_view> |
231 | | namespace flatbuffers { |
232 | | typedef std::experimental::string_view string_view; |
233 | | } |
234 | | #define FLATBUFFERS_HAS_STRING_VIEW 1 |
235 | | // Check for absl::string_view |
236 | | #elif __has_include("absl/strings/string_view.h") |
237 | | #include "absl/strings/string_view.h" |
238 | | namespace flatbuffers { |
239 | | typedef absl::string_view string_view; |
240 | | } |
241 | | #define FLATBUFFERS_HAS_STRING_VIEW 1 |
242 | | #endif |
243 | | #endif // __has_include |
244 | | #endif // !FLATBUFFERS_HAS_STRING_VIEW |
245 | | |
246 | | #ifndef FLATBUFFERS_GENERAL_HEAP_ALLOC_OK |
247 | | // Allow heap allocations to be used |
248 | | #define FLATBUFFERS_GENERAL_HEAP_ALLOC_OK 1 |
249 | | #endif // !FLATBUFFERS_GENERAL_HEAP_ALLOC_OK |
250 | | |
251 | | #ifndef FLATBUFFERS_HAS_NEW_STRTOD |
252 | | // Modern (C++11) strtod and strtof functions are available for use. |
253 | | // 1) nan/inf strings as argument of strtod; |
254 | | // 2) hex-float as argument of strtod/strtof. |
255 | | #if (defined(_MSC_VER) && _MSC_VER >= 1900) || \ |
256 | | (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)) || \ |
257 | | (defined(__clang__)) |
258 | | #define FLATBUFFERS_HAS_NEW_STRTOD 1 |
259 | | #endif |
260 | | #endif // !FLATBUFFERS_HAS_NEW_STRTOD |
261 | | |
262 | | #ifndef FLATBUFFERS_LOCALE_INDEPENDENT |
263 | | // Enable locale independent functions {strtof_l, strtod_l,strtoll_l, |
264 | | // strtoull_l}. |
265 | | #if (defined(_MSC_VER) && _MSC_VER >= 1800) || \ |
266 | | (defined(__ANDROID_API__) && __ANDROID_API__>= 21) || \ |
267 | | (defined(_XOPEN_VERSION) && (_XOPEN_VERSION >= 700)) && \ |
268 | | (!defined(__Fuchsia__) && !defined(__ANDROID_API__)) |
269 | | #define FLATBUFFERS_LOCALE_INDEPENDENT 1 |
270 | | #else |
271 | | #define FLATBUFFERS_LOCALE_INDEPENDENT 0 |
272 | | #endif |
273 | | #endif // !FLATBUFFERS_LOCALE_INDEPENDENT |
274 | | |
275 | | // Suppress Undefined Behavior Sanitizer (recoverable only). Usage: |
276 | | // - __suppress_ubsan__("undefined") |
277 | | // - __suppress_ubsan__("signed-integer-overflow") |
278 | | #if defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >=7)) |
279 | | #define __suppress_ubsan__(type) __attribute__((no_sanitize(type))) |
280 | | #elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409) |
281 | | #define __suppress_ubsan__(type) __attribute__((no_sanitize_undefined)) |
282 | | #else |
283 | | #define __suppress_ubsan__(type) |
284 | | #endif |
285 | | |
286 | | // This is constexpr function used for checking compile-time constants. |
287 | | // Avoid `#pragma warning(disable: 4127) // C4127: expression is constant`. |
288 | | template<typename T> FLATBUFFERS_CONSTEXPR inline bool IsConstTrue(T t) { |
289 | | return !!t; |
290 | | } |
291 | | |
292 | | // Enable C++ attribute [[]] if std:c++17 or higher. |
293 | | #if ((__cplusplus >= 201703L) \ |
294 | | || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L))) |
295 | | // All attributes unknown to an implementation are ignored without causing an error. |
296 | | #define FLATBUFFERS_ATTRIBUTE(attr) attr |
297 | | |
298 | | #define FLATBUFFERS_FALLTHROUGH() [[fallthrough]] |
299 | | #else |
300 | | #define FLATBUFFERS_ATTRIBUTE(attr) |
301 | | |
302 | | #if FLATBUFFERS_CLANG >= 30800 |
303 | | #define FLATBUFFERS_FALLTHROUGH() [[clang::fallthrough]] |
304 | | #elif FLATBUFFERS_GCC >= 70300 |
305 | | #define FLATBUFFERS_FALLTHROUGH() [[gnu::fallthrough]] |
306 | | #else |
307 | | #define FLATBUFFERS_FALLTHROUGH() |
308 | | #endif |
309 | | #endif |
310 | | |
311 | | /// @endcond |
312 | | |
313 | | /// @file |
314 | | namespace flatbuffers { |
315 | | |
316 | | /// @cond FLATBUFFERS_INTERNAL |
317 | | // Our default offset / size type, 32bit on purpose on 64bit systems. |
318 | | // Also, using a consistent offset type maintains compatibility of serialized |
319 | | // offset values between 32bit and 64bit systems. |
320 | | typedef uint32_t uoffset_t; |
321 | | |
322 | | // Signed offsets for references that can go in both directions. |
323 | | typedef int32_t soffset_t; |
324 | | |
325 | | // Offset/index used in v-tables, can be changed to uint8_t in |
326 | | // format forks to save a bit of space if desired. |
327 | | typedef uint16_t voffset_t; |
328 | | |
329 | | typedef uintmax_t largest_scalar_t; |
330 | | |
331 | | // In 32bits, this evaluates to 2GB - 1 |
332 | 72.2k | #define FLATBUFFERS_MAX_BUFFER_SIZE ((1ULL << (sizeof(::flatbuffers::soffset_t) * 8 - 1)) - 1) |
333 | | |
334 | | // The minimum size buffer that can be a valid flatbuffer. |
335 | | // Includes the offset to the root table (uoffset_t), the offset to the vtable |
336 | | // of the root table (soffset_t), the size of the vtable (uint16_t), and the |
337 | | // size of the referring table (uint16_t). |
338 | 19.9k | #define FLATBUFFERS_MIN_BUFFER_SIZE sizeof(uoffset_t) + sizeof(soffset_t) + \ |
339 | 19.9k | sizeof(uint16_t) + sizeof(uint16_t) |
340 | | |
341 | | // We support aligning the contents of buffers up to this size. |
342 | | #ifndef FLATBUFFERS_MAX_ALIGNMENT |
343 | | #define FLATBUFFERS_MAX_ALIGNMENT 32 |
344 | | #endif |
345 | | |
346 | | /// @brief The length of a FlatBuffer file header. |
347 | | static const size_t kFileIdentifierLength = 4; |
348 | | |
349 | 0 | inline bool VerifyAlignmentRequirements(size_t align, size_t min_align = 1) { |
350 | 0 | return (min_align <= align) && (align <= (FLATBUFFERS_MAX_ALIGNMENT)) && |
351 | 0 | (align & (align - 1)) == 0; // must be power of 2 |
352 | 0 | } |
353 | | |
354 | | #if defined(_MSC_VER) |
355 | | #pragma warning(disable: 4351) // C4351: new behavior: elements of array ... will be default initialized |
356 | | #pragma warning(push) |
357 | | #pragma warning(disable: 4127) // C4127: conditional expression is constant |
358 | | #endif |
359 | | |
360 | | template<typename T> T EndianSwap(T t) { |
361 | | #if defined(_MSC_VER) |
362 | | #define FLATBUFFERS_BYTESWAP16 _byteswap_ushort |
363 | | #define FLATBUFFERS_BYTESWAP32 _byteswap_ulong |
364 | | #define FLATBUFFERS_BYTESWAP64 _byteswap_uint64 |
365 | | #elif defined(__ICCARM__) |
366 | | #define FLATBUFFERS_BYTESWAP16 __REV16 |
367 | | #define FLATBUFFERS_BYTESWAP32 __REV |
368 | | #define FLATBUFFERS_BYTESWAP64(x) \ |
369 | | ((__REV(static_cast<uint32_t>(x >> 32U))) | (static_cast<uint64_t>(__REV(static_cast<uint32_t>(x)))) << 32U) |
370 | | #else |
371 | | #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ < 408 && !defined(__clang__) |
372 | | // __builtin_bswap16 was missing prior to GCC 4.8. |
373 | | #define FLATBUFFERS_BYTESWAP16(x) \ |
374 | | static_cast<uint16_t>(__builtin_bswap32(static_cast<uint32_t>(x) << 16)) |
375 | | #else |
376 | | #define FLATBUFFERS_BYTESWAP16 __builtin_bswap16 |
377 | | #endif |
378 | | #define FLATBUFFERS_BYTESWAP32 __builtin_bswap32 |
379 | | #define FLATBUFFERS_BYTESWAP64 __builtin_bswap64 |
380 | | #endif |
381 | | if (sizeof(T) == 1) { // Compile-time if-then's. |
382 | | return t; |
383 | | } else if (sizeof(T) == 2) { |
384 | | union { T t; uint16_t i; } u = { t }; |
385 | | u.i = FLATBUFFERS_BYTESWAP16(u.i); |
386 | | return u.t; |
387 | | } else if (sizeof(T) == 4) { |
388 | | union { T t; uint32_t i; } u = { t }; |
389 | | u.i = FLATBUFFERS_BYTESWAP32(u.i); |
390 | | return u.t; |
391 | | } else if (sizeof(T) == 8) { |
392 | | union { T t; uint64_t i; } u = { t }; |
393 | | u.i = FLATBUFFERS_BYTESWAP64(u.i); |
394 | | return u.t; |
395 | | } else { |
396 | | FLATBUFFERS_ASSERT(0); |
397 | | return t; |
398 | | } |
399 | | } |
400 | | |
401 | | #if defined(_MSC_VER) |
402 | | #pragma warning(pop) |
403 | | #endif |
404 | | |
405 | | |
406 | 4.19M | template<typename T> T EndianScalar(T t) { |
407 | 4.19M | #if FLATBUFFERS_LITTLEENDIAN |
408 | 4.19M | return t; |
409 | | #else |
410 | | return EndianSwap(t); |
411 | | #endif |
412 | 4.19M | } unsigned int gdal_flatbuffers::EndianScalar<unsigned int>(unsigned int) Line | Count | Source | 406 | 537k | template<typename T> T EndianScalar(T t) { | 407 | 537k | #if FLATBUFFERS_LITTLEENDIAN | 408 | 537k | return t; | 409 | | #else | 410 | | return EndianSwap(t); | 411 | | #endif | 412 | 537k | } |
int gdal_flatbuffers::EndianScalar<int>(int) Line | Count | Source | 406 | 1.29M | template<typename T> T EndianScalar(T t) { | 407 | 1.29M | #if FLATBUFFERS_LITTLEENDIAN | 408 | 1.29M | return t; | 409 | | #else | 410 | | return EndianSwap(t); | 411 | | #endif | 412 | 1.29M | } |
unsigned short gdal_flatbuffers::EndianScalar<unsigned short>(unsigned short) Line | Count | Source | 406 | 2.26M | template<typename T> T EndianScalar(T t) { | 407 | 2.26M | #if FLATBUFFERS_LITTLEENDIAN | 408 | 2.26M | return t; | 409 | | #else | 410 | | return EndianSwap(t); | 411 | | #endif | 412 | 2.26M | } |
unsigned char gdal_flatbuffers::EndianScalar<unsigned char>(unsigned char) Line | Count | Source | 406 | 73.3k | template<typename T> T EndianScalar(T t) { | 407 | 73.3k | #if FLATBUFFERS_LITTLEENDIAN | 408 | 73.3k | return t; | 409 | | #else | 410 | | return EndianSwap(t); | 411 | | #endif | 412 | 73.3k | } |
unsigned long gdal_flatbuffers::EndianScalar<unsigned long>(unsigned long) Line | Count | Source | 406 | 12.1k | template<typename T> T EndianScalar(T t) { | 407 | 12.1k | #if FLATBUFFERS_LITTLEENDIAN | 408 | 12.1k | return t; | 409 | | #else | 410 | | return EndianSwap(t); | 411 | | #endif | 412 | 12.1k | } |
double gdal_flatbuffers::EndianScalar<double>(double) Line | Count | Source | 406 | 5.95k | template<typename T> T EndianScalar(T t) { | 407 | 5.95k | #if FLATBUFFERS_LITTLEENDIAN | 408 | 5.95k | return t; | 409 | | #else | 410 | | return EndianSwap(t); | 411 | | #endif | 412 | 5.95k | } |
Unexecuted instantiation: signed char gdal_flatbuffers::EndianScalar<signed char>(signed char) Unexecuted instantiation: short gdal_flatbuffers::EndianScalar<short>(short) Unexecuted instantiation: long gdal_flatbuffers::EndianScalar<long>(long) Unexecuted instantiation: float gdal_flatbuffers::EndianScalar<float>(float) Unexecuted instantiation: bool gdal_flatbuffers::EndianScalar<bool>(bool) Unexecuted instantiation: gdal_generated_icechunk::UpdateType gdal_flatbuffers::EndianScalar<gdal_generated_icechunk::UpdateType>(gdal_generated_icechunk::UpdateType) Unexecuted instantiation: gdal_generated_icechunk::NodeData gdal_flatbuffers::EndianScalar<gdal_generated_icechunk::NodeData>(gdal_generated_icechunk::NodeData) |
413 | | |
414 | | template<typename T> |
415 | | // UBSAN: C++ aliasing type rules, see std::bit_cast<> for details. |
416 | | __suppress_ubsan__("alignment") |
417 | 3.95M | T ReadScalar(const void *p) { |
418 | 3.95M | return EndianScalar(*reinterpret_cast<const T *>(p)); |
419 | 3.95M | } unsigned int gdal_flatbuffers::ReadScalar<unsigned int>(void const*) Line | Count | Source | 417 | 395k | T ReadScalar(const void *p) { | 418 | 395k | return EndianScalar(*reinterpret_cast<const T *>(p)); | 419 | 395k | } |
int gdal_flatbuffers::ReadScalar<int>(void const*) Line | Count | Source | 417 | 1.26M | T ReadScalar(const void *p) { | 418 | 1.26M | return EndianScalar(*reinterpret_cast<const T *>(p)); | 419 | 1.26M | } |
unsigned short gdal_flatbuffers::ReadScalar<unsigned short>(void const*) Line | Count | Source | 417 | 2.22M | T ReadScalar(const void *p) { | 418 | 2.22M | return EndianScalar(*reinterpret_cast<const T *>(p)); | 419 | 2.22M | } |
unsigned char gdal_flatbuffers::ReadScalar<unsigned char>(void const*) Line | Count | Source | 417 | 63.9k | T ReadScalar(const void *p) { | 418 | 63.9k | return EndianScalar(*reinterpret_cast<const T *>(p)); | 419 | 63.9k | } |
unsigned long gdal_flatbuffers::ReadScalar<unsigned long>(void const*) Line | Count | Source | 417 | 12.0k | T ReadScalar(const void *p) { | 418 | 12.0k | return EndianScalar(*reinterpret_cast<const T *>(p)); | 419 | 12.0k | } |
Unexecuted instantiation: signed char gdal_flatbuffers::ReadScalar<signed char>(void const*) Unexecuted instantiation: short gdal_flatbuffers::ReadScalar<short>(void const*) Unexecuted instantiation: long gdal_flatbuffers::ReadScalar<long>(void const*) Unexecuted instantiation: float gdal_flatbuffers::ReadScalar<float>(void const*) Unexecuted instantiation: double gdal_flatbuffers::ReadScalar<double>(void const*) |
420 | | |
421 | | // See https://github.com/google/flatbuffers/issues/5950 |
422 | | |
423 | | #if (FLATBUFFERS_GCC >= 100000) && (FLATBUFFERS_GCC < 110000) |
424 | | #pragma GCC diagnostic push |
425 | | #pragma GCC diagnostic ignored "-Wstringop-overflow" |
426 | | #endif |
427 | | |
428 | | template<typename T> |
429 | | // UBSAN: C++ aliasing type rules, see std::bit_cast<> for details. |
430 | | __suppress_ubsan__("alignment") |
431 | 58.3k | void WriteScalar(void *p, T t) { |
432 | 58.3k | *reinterpret_cast<T *>(p) = EndianScalar(t); |
433 | 58.3k | } Unexecuted instantiation: void gdal_flatbuffers::WriteScalar<unsigned int>(void*, unsigned int) void gdal_flatbuffers::WriteScalar<unsigned short>(void*, unsigned short) Line | Count | Source | 431 | 48.5k | void WriteScalar(void *p, T t) { | 432 | 48.5k | *reinterpret_cast<T *>(p) = EndianScalar(t); | 433 | 48.5k | } |
void gdal_flatbuffers::WriteScalar<int>(void*, int) Line | Count | Source | 431 | 9.78k | void WriteScalar(void *p, T t) { | 432 | 9.78k | *reinterpret_cast<T *>(p) = EndianScalar(t); | 433 | 9.78k | } |
|
434 | | |
435 | | template<typename T> struct Offset; |
436 | | template<typename T> __suppress_ubsan__("alignment") void WriteScalar(void *p, Offset<T> t) { |
437 | | *reinterpret_cast<uoffset_t *>(p) = EndianScalar(t.o); |
438 | | } |
439 | | |
440 | | #if (FLATBUFFERS_GCC >= 100000) && (FLATBUFFERS_GCC < 110000) |
441 | | #pragma GCC diagnostic pop |
442 | | #endif |
443 | | |
444 | | // Computes how many bytes you'd have to pad to be able to write an |
445 | | // "scalar_size" scalar if the buffer had grown to "buf_size" (downwards in |
446 | | // memory). |
447 | | __suppress_ubsan__("unsigned-integer-overflow") |
448 | 89.8k | inline size_t PaddingBytes(size_t buf_size, size_t scalar_size) { |
449 | 89.8k | return ((~buf_size) + 1) & (scalar_size - 1); |
450 | 89.8k | } |
451 | | |
452 | | // Generic 'operator==' with conditional specialisations. |
453 | | // T e - new value of a scalar field. |
454 | | // T def - default of scalar (is known at compile-time). |
455 | 75.3k | template<typename T> inline bool IsTheSameAs(T e, T def) { return e == def; }bool gdal_flatbuffers::IsTheSameAs<unsigned int>(unsigned int, unsigned int) Line | Count | Source | 455 | 10.3k | template<typename T> inline bool IsTheSameAs(T e, T def) { return e == def; } |
bool gdal_flatbuffers::IsTheSameAs<unsigned char>(unsigned char, unsigned char) Line | Count | Source | 455 | 37.4k | template<typename T> inline bool IsTheSameAs(T e, T def) { return e == def; } |
bool gdal_flatbuffers::IsTheSameAs<int>(int, int) Line | Count | Source | 455 | 27.2k | template<typename T> inline bool IsTheSameAs(T e, T def) { return e == def; } |
bool gdal_flatbuffers::IsTheSameAs<unsigned long>(unsigned long, unsigned long) Line | Count | Source | 455 | 167 | template<typename T> inline bool IsTheSameAs(T e, T def) { return e == def; } |
bool gdal_flatbuffers::IsTheSameAs<unsigned short>(unsigned short, unsigned short) Line | Count | Source | 455 | 167 | template<typename T> inline bool IsTheSameAs(T e, T def) { return e == def; } |
|
456 | | |
457 | | #if defined(FLATBUFFERS_NAN_DEFAULTS) && \ |
458 | | defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0) |
459 | | // Like `operator==(e, def)` with weak NaN if T=(float|double). |
460 | | template<typename T> inline bool IsFloatTheSameAs(T e, T def) { |
461 | | return (e == def) || ((def != def) && (e != e)); |
462 | | } |
463 | | template<> inline bool IsTheSameAs<float>(float e, float def) { |
464 | | return IsFloatTheSameAs(e, def); |
465 | | } |
466 | | template<> inline bool IsTheSameAs<double>(double e, double def) { |
467 | | return IsFloatTheSameAs(e, def); |
468 | | } |
469 | | #endif |
470 | | |
471 | | // Check 'v' is out of closed range [low; high]. |
472 | | // Workaround for GCC warning [-Werror=type-limits]: |
473 | | // comparison is always true due to limited range of data type. |
474 | | template<typename T> |
475 | 0 | inline bool IsOutRange(const T &v, const T &low, const T &high) { |
476 | 0 | return (v < low) || (high < v); |
477 | 0 | } Unexecuted instantiation: bool gdal_flatbuffers::IsOutRange<FlatGeobuf::GeometryType>(FlatGeobuf::GeometryType const&, FlatGeobuf::GeometryType const&, FlatGeobuf::GeometryType const&) Unexecuted instantiation: bool gdal_flatbuffers::IsOutRange<FlatGeobuf::ColumnType>(FlatGeobuf::ColumnType const&, FlatGeobuf::ColumnType const&, FlatGeobuf::ColumnType const&) Unexecuted instantiation: bool gdal_flatbuffers::IsOutRange<gdal_generated_icechunk::RepoAvailability>(gdal_generated_icechunk::RepoAvailability const&, gdal_generated_icechunk::RepoAvailability const&, gdal_generated_icechunk::RepoAvailability const&) Unexecuted instantiation: bool gdal_flatbuffers::IsOutRange<gdal_generated_icechunk::UpdateType>(gdal_generated_icechunk::UpdateType const&, gdal_generated_icechunk::UpdateType const&, gdal_generated_icechunk::UpdateType const&) Unexecuted instantiation: bool gdal_flatbuffers::IsOutRange<gdal_generated_icechunk::NodeData>(gdal_generated_icechunk::NodeData const&, gdal_generated_icechunk::NodeData const&, gdal_generated_icechunk::NodeData const&) |
478 | | |
479 | | // Check 'v' is in closed range [low; high]. |
480 | | template<typename T> |
481 | | inline bool IsInRange(const T &v, const T &low, const T &high) { |
482 | | return !IsOutRange(v, low, high); |
483 | | } |
484 | | |
485 | | } // namespace flatbuffers |
486 | | #endif // FLATBUFFERS_BASE_H_ |