Coverage Report

Created: 2025-07-18 06:48

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