Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
OpenCV-python
Commits
fbd3199c
Commit
fbd3199c
authored
Apr 18, 2025
by
fengzch-das
Browse files
Initial commit
parents
Changes
103
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
850 additions
and
0 deletions
+850
-0
opencv/3rdparty/flatbuffers/include/flatbuffers/flatbuffers.h
...cv/3rdparty/flatbuffers/include/flatbuffers/flatbuffers.h
+273
-0
opencv/3rdparty/flatbuffers/include/flatbuffers/stl_emulation.h
.../3rdparty/flatbuffers/include/flatbuffers/stl_emulation.h
+513
-0
opencv/3rdparty/flatbuffers/include/flatbuffers/string.h
opencv/3rdparty/flatbuffers/include/flatbuffers/string.h
+64
-0
No files found.
Too many changes to show.
To preserve performance only
103 of 103+
files are displayed.
Plain diff
Email patch
opencv/3rdparty/flatbuffers/include/flatbuffers/flatbuffers.h
0 → 100644
View file @
fbd3199c
/*
* Copyright 2014 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef FLATBUFFERS_H_
#define FLATBUFFERS_H_
#include <algorithm>
// TODO: These includes are for mitigating the pains of users editing their
// source because they relied on flatbuffers.h to include everything for them.
#include "flatbuffers/array.h"
#include "flatbuffers/base.h"
#include "flatbuffers/buffer.h"
#include "flatbuffers/buffer_ref.h"
#include "flatbuffers/detached_buffer.h"
#include "flatbuffers/flatbuffer_builder.h"
#include "flatbuffers/stl_emulation.h"
#include "flatbuffers/string.h"
#include "flatbuffers/struct.h"
#include "flatbuffers/table.h"
#include "flatbuffers/vector.h"
#include "flatbuffers/vector_downward.h"
#include "flatbuffers/verifier.h"
namespace
flatbuffers
{
/// @brief This can compute the start of a FlatBuffer from a root pointer, i.e.
/// it is the opposite transformation of GetRoot().
/// This may be useful if you want to pass on a root and have the recipient
/// delete the buffer afterwards.
inline
const
uint8_t
*
GetBufferStartFromRootPointer
(
const
void
*
root
)
{
auto
table
=
reinterpret_cast
<
const
Table
*>
(
root
);
auto
vtable
=
table
->
GetVTable
();
// Either the vtable is before the root or after the root.
auto
start
=
(
std
::
min
)(
vtable
,
reinterpret_cast
<
const
uint8_t
*>
(
root
));
// Align to at least sizeof(uoffset_t).
start
=
reinterpret_cast
<
const
uint8_t
*>
(
reinterpret_cast
<
uintptr_t
>
(
start
)
&
~
(
sizeof
(
uoffset_t
)
-
1
));
// Additionally, there may be a file_identifier in the buffer, and the root
// offset. The buffer may have been aligned to any size between
// sizeof(uoffset_t) and FLATBUFFERS_MAX_ALIGNMENT (see "force_align").
// Sadly, the exact alignment is only known when constructing the buffer,
// since it depends on the presence of values with said alignment properties.
// So instead, we simply look at the next uoffset_t values (root,
// file_identifier, and alignment padding) to see which points to the root.
// None of the other values can "impersonate" the root since they will either
// be 0 or four ASCII characters.
static_assert
(
flatbuffers
::
kFileIdentifierLength
==
sizeof
(
uoffset_t
),
"file_identifier is assumed to be the same size as uoffset_t"
);
for
(
auto
possible_roots
=
FLATBUFFERS_MAX_ALIGNMENT
/
sizeof
(
uoffset_t
)
+
1
;
possible_roots
;
possible_roots
--
)
{
start
-=
sizeof
(
uoffset_t
);
if
(
ReadScalar
<
uoffset_t
>
(
start
)
+
start
==
reinterpret_cast
<
const
uint8_t
*>
(
root
))
return
start
;
}
// We didn't find the root, either the "root" passed isn't really a root,
// or the buffer is corrupt.
// Assert, because calling this function with bad data may cause reads
// outside of buffer boundaries.
FLATBUFFERS_ASSERT
(
false
);
return
nullptr
;
}
/// @brief This return the prefixed size of a FlatBuffer.
template
<
typename
SizeT
=
uoffset_t
>
inline
SizeT
GetPrefixedSize
(
const
uint8_t
*
buf
)
{
return
ReadScalar
<
SizeT
>
(
buf
);
}
// Base class for native objects (FlatBuffer data de-serialized into native
// C++ data structures).
// Contains no functionality, purely documentative.
struct
NativeTable
{};
/// @brief Function types to be used with resolving hashes into objects and
/// back again. The resolver gets a pointer to a field inside an object API
/// object that is of the type specified in the schema using the attribute
/// `cpp_type` (it is thus important whatever you write to this address
/// matches that type). The value of this field is initially null, so you
/// may choose to implement a delayed binding lookup using this function
/// if you wish. The resolver does the opposite lookup, for when the object
/// is being serialized again.
typedef
uint64_t
hash_value_t
;
typedef
std
::
function
<
void
(
void
**
pointer_adr
,
hash_value_t
hash
)
>
resolver_function_t
;
typedef
std
::
function
<
hash_value_t
(
void
*
pointer
)
>
rehasher_function_t
;
// Helper function to test if a field is present, using any of the field
// enums in the generated code.
// `table` must be a generated table type. Since this is a template parameter,
// this is not typechecked to be a subclass of Table, so beware!
// Note: this function will return false for fields equal to the default
// value, since they're not stored in the buffer (unless force_defaults was
// used).
template
<
typename
T
>
bool
IsFieldPresent
(
const
T
*
table
,
typename
T
::
FlatBuffersVTableOffset
field
)
{
// Cast, since Table is a private baseclass of any table types.
return
reinterpret_cast
<
const
Table
*>
(
table
)
->
CheckField
(
static_cast
<
voffset_t
>
(
field
));
}
// Utility function for reverse lookups on the EnumNames*() functions
// (in the generated C++ code)
// names must be NULL terminated.
inline
int
LookupEnum
(
const
char
**
names
,
const
char
*
name
)
{
for
(
const
char
**
p
=
names
;
*
p
;
p
++
)
if
(
!
strcmp
(
*
p
,
name
))
return
static_cast
<
int
>
(
p
-
names
);
return
-
1
;
}
// These macros allow us to layout a struct with a guarantee that they'll end
// up looking the same on different compilers and platforms.
// It does this by disallowing the compiler to do any padding, and then
// does padding itself by inserting extra padding fields that make every
// element aligned to its own size.
// Additionally, it manually sets the alignment of the struct as a whole,
// which is typically its largest element, or a custom size set in the schema
// by the force_align attribute.
// These are used in the generated code only.
// clang-format off
#if defined(_MSC_VER)
#define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \
__pragma(pack(1)) \
struct __declspec(align(alignment))
#define FLATBUFFERS_STRUCT_END(name, size) \
__pragma(pack()) \
static_assert(sizeof(name) == size, "compiler breaks packing rules")
#elif defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__)
#define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \
_Pragma("pack(1)") \
struct __attribute__((aligned(alignment)))
#define FLATBUFFERS_STRUCT_END(name, size) \
_Pragma("pack()") \
static_assert(sizeof(name) == size, "compiler breaks packing rules")
#else
#error Unknown compiler, please define structure alignment macros
#endif
// clang-format on
// Minimal reflection via code generation.
// Besides full-fat reflection (see reflection.h) and parsing/printing by
// loading schemas (see idl.h), we can also have code generation for minimal
// reflection data which allows pretty-printing and other uses without needing
// a schema or a parser.
// Generate code with --reflect-types (types only) or --reflect-names (names
// also) to enable.
// See minireflect.h for utilities using this functionality.
// These types are organized slightly differently as the ones in idl.h.
enum
SequenceType
{
ST_TABLE
,
ST_STRUCT
,
ST_UNION
,
ST_ENUM
};
// Scalars have the same order as in idl.h
// clang-format off
#define FLATBUFFERS_GEN_ELEMENTARY_TYPES(ET) \
ET(ET_UTYPE) \
ET(ET_BOOL) \
ET(ET_CHAR) \
ET(ET_UCHAR) \
ET(ET_SHORT) \
ET(ET_USHORT) \
ET(ET_INT) \
ET(ET_UINT) \
ET(ET_LONG) \
ET(ET_ULONG) \
ET(ET_FLOAT) \
ET(ET_DOUBLE) \
ET(ET_STRING) \
ET(ET_SEQUENCE) // See SequenceType.
enum
ElementaryType
{
#define FLATBUFFERS_ET(E) E,
FLATBUFFERS_GEN_ELEMENTARY_TYPES
(
FLATBUFFERS_ET
)
#undef FLATBUFFERS_ET
};
inline
const
char
*
const
*
ElementaryTypeNames
()
{
static
const
char
*
const
names
[]
=
{
#define FLATBUFFERS_ET(E) #E,
FLATBUFFERS_GEN_ELEMENTARY_TYPES
(
FLATBUFFERS_ET
)
#undef FLATBUFFERS_ET
};
return
names
;
}
// clang-format on
// Basic type info cost just 16bits per field!
// We're explicitly defining the signedness since the signedness of integer
// bitfields is otherwise implementation-defined and causes warnings on older
// GCC compilers.
struct
TypeCode
{
// ElementaryType
unsigned
short
base_type
:
4
;
// Either vector (in table) or array (in struct)
unsigned
short
is_repeating
:
1
;
// Index into type_refs below, or -1 for none.
signed
short
sequence_ref
:
11
;
};
static_assert
(
sizeof
(
TypeCode
)
==
2
,
"TypeCode"
);
struct
TypeTable
;
// Signature of the static method present in each type.
typedef
const
TypeTable
*
(
*
TypeFunction
)();
struct
TypeTable
{
SequenceType
st
;
size_t
num_elems
;
// of type_codes, values, names (but not type_refs).
const
TypeCode
*
type_codes
;
// num_elems count
const
TypeFunction
*
type_refs
;
// less than num_elems entries (see TypeCode).
const
int16_t
*
array_sizes
;
// less than num_elems entries (see TypeCode).
const
int64_t
*
values
;
// Only set for non-consecutive enum/union or structs.
const
char
*
const
*
names
;
// Only set if compiled with --reflect-names.
};
// String which identifies the current version of FlatBuffers.
inline
const
char
*
flatbuffers_version_string
()
{
return
"FlatBuffers "
FLATBUFFERS_STRING
(
FLATBUFFERS_VERSION_MAJOR
)
"."
FLATBUFFERS_STRING
(
FLATBUFFERS_VERSION_MINOR
)
"."
FLATBUFFERS_STRING
(
FLATBUFFERS_VERSION_REVISION
);
}
// clang-format off
#define FLATBUFFERS_DEFINE_BITMASK_OPERATORS(E, T)\
inline E operator | (E lhs, E rhs){\
return E(T(lhs) | T(rhs));\
}\
inline E operator & (E lhs, E rhs){\
return E(T(lhs) & T(rhs));\
}\
inline E operator ^ (E lhs, E rhs){\
return E(T(lhs) ^ T(rhs));\
}\
inline E operator ~ (E lhs){\
return E(~T(lhs));\
}\
inline E operator |= (E &lhs, E rhs){\
lhs = lhs | rhs;\
return lhs;\
}\
inline E operator &= (E &lhs, E rhs){\
lhs = lhs & rhs;\
return lhs;\
}\
inline E operator ^= (E &lhs, E rhs){\
lhs = lhs ^ rhs;\
return lhs;\
}\
inline bool operator !(E rhs) \
{\
return !bool(T(rhs)); \
}
/// @endcond
}
// namespace flatbuffers
// clang-format on
#endif // FLATBUFFERS_H_
opencv/3rdparty/flatbuffers/include/flatbuffers/stl_emulation.h
0 → 100644
View file @
fbd3199c
/*
* Copyright 2017 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef FLATBUFFERS_STL_EMULATION_H_
#define FLATBUFFERS_STL_EMULATION_H_
// clang-format off
#include "flatbuffers/base.h"
#include <string>
#include <type_traits>
#include <vector>
#include <memory>
#include <limits>
#ifndef FLATBUFFERS_USE_STD_OPTIONAL
// Detect C++17 compatible compiler.
// __cplusplus >= 201703L - a compiler has support of 'static inline' variables.
#if (defined(__cplusplus) && __cplusplus >= 201703L) \
|| (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
#define FLATBUFFERS_USE_STD_OPTIONAL 1
#else
#define FLATBUFFERS_USE_STD_OPTIONAL 0
#endif // (defined(__cplusplus) && __cplusplus >= 201703L) ...
#endif // FLATBUFFERS_USE_STD_OPTIONAL
#if FLATBUFFERS_USE_STD_OPTIONAL
#include <optional>
#endif
#ifndef FLATBUFFERS_USE_STD_SPAN
// Testing __cpp_lib_span requires including either <version> or <span>,
// both of which were added in C++20.
// See: https://en.cppreference.com/w/cpp/utility/feature_test
#if defined(__cplusplus) && __cplusplus >= 202002L
#define FLATBUFFERS_USE_STD_SPAN 1
#endif
#endif // FLATBUFFERS_USE_STD_SPAN
#if defined(FLATBUFFERS_USE_STD_SPAN)
#include <array>
#include <span>
#else
// Disable non-trivial ctors if FLATBUFFERS_SPAN_MINIMAL defined.
#if !defined(FLATBUFFERS_TEMPLATES_ALIASES)
#define FLATBUFFERS_SPAN_MINIMAL
#else
// Enable implicit construction of a span<T,N> from a std::array<T,N>.
#include <array>
#endif
#endif // defined(FLATBUFFERS_USE_STD_SPAN)
// This header provides backwards compatibility for older versions of the STL.
namespace
flatbuffers
{
#if defined(FLATBUFFERS_TEMPLATES_ALIASES)
template
<
typename
T
>
using
numeric_limits
=
std
::
numeric_limits
<
T
>
;
#else
template
<
typename
T
>
class
numeric_limits
:
public
std
::
numeric_limits
<
T
>
{};
#endif // defined(FLATBUFFERS_TEMPLATES_ALIASES)
#if defined(FLATBUFFERS_TEMPLATES_ALIASES)
template
<
typename
T
>
using
is_scalar
=
std
::
is_scalar
<
T
>
;
template
<
typename
T
,
typename
U
>
using
is_same
=
std
::
is_same
<
T
,
U
>
;
template
<
typename
T
>
using
is_floating_point
=
std
::
is_floating_point
<
T
>
;
template
<
typename
T
>
using
is_unsigned
=
std
::
is_unsigned
<
T
>
;
template
<
typename
T
>
using
is_enum
=
std
::
is_enum
<
T
>
;
template
<
typename
T
>
using
make_unsigned
=
std
::
make_unsigned
<
T
>
;
template
<
bool
B
,
class
T
,
class
F
>
using
conditional
=
std
::
conditional
<
B
,
T
,
F
>
;
template
<
class
T
,
T
v
>
using
integral_constant
=
std
::
integral_constant
<
T
,
v
>
;
template
<
bool
B
>
using
bool_constant
=
integral_constant
<
bool
,
B
>
;
using
true_type
=
std
::
true_type
;
using
false_type
=
std
::
false_type
;
#else
// MSVC 2010 doesn't support C++11 aliases.
template
<
typename
T
>
struct
is_scalar
:
public
std
::
is_scalar
<
T
>
{};
template
<
typename
T
,
typename
U
>
struct
is_same
:
public
std
::
is_same
<
T
,
U
>
{};
template
<
typename
T
>
struct
is_floating_point
:
public
std
::
is_floating_point
<
T
>
{};
template
<
typename
T
>
struct
is_unsigned
:
public
std
::
is_unsigned
<
T
>
{};
template
<
typename
T
>
struct
is_enum
:
public
std
::
is_enum
<
T
>
{};
template
<
typename
T
>
struct
make_unsigned
:
public
std
::
make_unsigned
<
T
>
{};
template
<
bool
B
,
class
T
,
class
F
>
struct
conditional
:
public
std
::
conditional
<
B
,
T
,
F
>
{};
template
<
class
T
,
T
v
>
struct
integral_constant
:
public
std
::
integral_constant
<
T
,
v
>
{};
template
<
bool
B
>
struct
bool_constant
:
public
integral_constant
<
bool
,
B
>
{};
typedef
bool_constant
<
true
>
true_type
;
typedef
bool_constant
<
false
>
false_type
;
#endif // defined(FLATBUFFERS_TEMPLATES_ALIASES)
#if defined(FLATBUFFERS_TEMPLATES_ALIASES)
template
<
class
T
>
using
unique_ptr
=
std
::
unique_ptr
<
T
>
;
#else
// MSVC 2010 doesn't support C++11 aliases.
// We're manually "aliasing" the class here as we want to bring unique_ptr
// into the flatbuffers namespace. We have unique_ptr in the flatbuffers
// namespace we have a completely independent implementation (see below)
// for C++98 STL implementations.
template
<
class
T
>
class
unique_ptr
:
public
std
::
unique_ptr
<
T
>
{
public:
unique_ptr
()
{}
explicit
unique_ptr
(
T
*
p
)
:
std
::
unique_ptr
<
T
>
(
p
)
{}
unique_ptr
(
std
::
unique_ptr
<
T
>&&
u
)
{
*
this
=
std
::
move
(
u
);
}
unique_ptr
(
unique_ptr
&&
u
)
{
*
this
=
std
::
move
(
u
);
}
unique_ptr
&
operator
=
(
std
::
unique_ptr
<
T
>&&
u
)
{
std
::
unique_ptr
<
T
>::
reset
(
u
.
release
());
return
*
this
;
}
unique_ptr
&
operator
=
(
unique_ptr
&&
u
)
{
std
::
unique_ptr
<
T
>::
reset
(
u
.
release
());
return
*
this
;
}
unique_ptr
&
operator
=
(
T
*
p
)
{
return
std
::
unique_ptr
<
T
>::
operator
=
(
p
);
}
};
#endif // defined(FLATBUFFERS_TEMPLATES_ALIASES)
#if FLATBUFFERS_USE_STD_OPTIONAL
template
<
class
T
>
using
Optional
=
std
::
optional
<
T
>
;
using
nullopt_t
=
std
::
nullopt_t
;
inline
constexpr
nullopt_t
nullopt
=
std
::
nullopt
;
#else
// Limited implementation of Optional<T> type for a scalar T.
// This implementation limited by trivial types compatible with
// std::is_arithmetic<T> or std::is_enum<T> type traits.
// A tag to indicate an empty flatbuffers::optional<T>.
struct
nullopt_t
{
explicit
FLATBUFFERS_CONSTEXPR_CPP11
nullopt_t
(
int
)
{}
};
#if defined(FLATBUFFERS_CONSTEXPR_DEFINED)
namespace
internal
{
template
<
class
>
struct
nullopt_holder
{
static
constexpr
nullopt_t
instance_
=
nullopt_t
(
0
);
};
template
<
class
Dummy
>
constexpr
nullopt_t
nullopt_holder
<
Dummy
>::
instance_
;
}
static
constexpr
const
nullopt_t
&
nullopt
=
internal
::
nullopt_holder
<
void
>::
instance_
;
#else
namespace
internal
{
template
<
class
>
struct
nullopt_holder
{
static
const
nullopt_t
instance_
;
};
template
<
class
Dummy
>
const
nullopt_t
nullopt_holder
<
Dummy
>::
instance_
=
nullopt_t
(
0
);
}
static
const
nullopt_t
&
nullopt
=
internal
::
nullopt_holder
<
void
>::
instance_
;
#endif
template
<
class
T
>
class
Optional
FLATBUFFERS_FINAL_CLASS
{
// Non-scalar 'T' would extremely complicated Optional<T>.
// Use is_scalar<T> checking because flatbuffers flatbuffers::is_arithmetic<T>
// isn't implemented.
static_assert
(
flatbuffers
::
is_scalar
<
T
>::
value
,
"unexpected type T"
);
public:
~
Optional
()
{}
FLATBUFFERS_CONSTEXPR_CPP11
Optional
()
FLATBUFFERS_NOEXCEPT
:
value_
(),
has_value_
(
false
)
{}
FLATBUFFERS_CONSTEXPR_CPP11
Optional
(
nullopt_t
)
FLATBUFFERS_NOEXCEPT
:
value_
(),
has_value_
(
false
)
{}
FLATBUFFERS_CONSTEXPR_CPP11
Optional
(
T
val
)
FLATBUFFERS_NOEXCEPT
:
value_
(
val
),
has_value_
(
true
)
{}
FLATBUFFERS_CONSTEXPR_CPP11
Optional
(
const
Optional
&
other
)
FLATBUFFERS_NOEXCEPT
:
value_
(
other
.
value_
),
has_value_
(
other
.
has_value_
)
{}
FLATBUFFERS_CONSTEXPR_CPP14
Optional
&
operator
=
(
const
Optional
&
other
)
FLATBUFFERS_NOEXCEPT
{
value_
=
other
.
value_
;
has_value_
=
other
.
has_value_
;
return
*
this
;
}
FLATBUFFERS_CONSTEXPR_CPP14
Optional
&
operator
=
(
nullopt_t
)
FLATBUFFERS_NOEXCEPT
{
value_
=
T
();
has_value_
=
false
;
return
*
this
;
}
FLATBUFFERS_CONSTEXPR_CPP14
Optional
&
operator
=
(
T
val
)
FLATBUFFERS_NOEXCEPT
{
value_
=
val
;
has_value_
=
true
;
return
*
this
;
}
void
reset
()
FLATBUFFERS_NOEXCEPT
{
*
this
=
nullopt
;
}
void
swap
(
Optional
&
other
)
FLATBUFFERS_NOEXCEPT
{
std
::
swap
(
value_
,
other
.
value_
);
std
::
swap
(
has_value_
,
other
.
has_value_
);
}
FLATBUFFERS_CONSTEXPR_CPP11
FLATBUFFERS_EXPLICIT_CPP11
operator
bool
()
const
FLATBUFFERS_NOEXCEPT
{
return
has_value_
;
}
FLATBUFFERS_CONSTEXPR_CPP11
bool
has_value
()
const
FLATBUFFERS_NOEXCEPT
{
return
has_value_
;
}
FLATBUFFERS_CONSTEXPR_CPP11
const
T
&
operator
*
()
const
FLATBUFFERS_NOEXCEPT
{
return
value_
;
}
const
T
&
value
()
const
{
FLATBUFFERS_ASSERT
(
has_value
());
return
value_
;
}
T
value_or
(
T
default_value
)
const
FLATBUFFERS_NOEXCEPT
{
return
has_value
()
?
value_
:
default_value
;
}
private:
T
value_
;
bool
has_value_
;
};
template
<
class
T
>
FLATBUFFERS_CONSTEXPR_CPP11
bool
operator
==
(
const
Optional
<
T
>&
opt
,
nullopt_t
)
FLATBUFFERS_NOEXCEPT
{
return
!
opt
;
}
template
<
class
T
>
FLATBUFFERS_CONSTEXPR_CPP11
bool
operator
==
(
nullopt_t
,
const
Optional
<
T
>&
opt
)
FLATBUFFERS_NOEXCEPT
{
return
!
opt
;
}
template
<
class
T
,
class
U
>
FLATBUFFERS_CONSTEXPR_CPP11
bool
operator
==
(
const
Optional
<
T
>&
lhs
,
const
U
&
rhs
)
FLATBUFFERS_NOEXCEPT
{
return
static_cast
<
bool
>
(
lhs
)
&&
(
*
lhs
==
rhs
);
}
template
<
class
T
,
class
U
>
FLATBUFFERS_CONSTEXPR_CPP11
bool
operator
==
(
const
T
&
lhs
,
const
Optional
<
U
>&
rhs
)
FLATBUFFERS_NOEXCEPT
{
return
static_cast
<
bool
>
(
rhs
)
&&
(
lhs
==
*
rhs
);
}
template
<
class
T
,
class
U
>
FLATBUFFERS_CONSTEXPR_CPP11
bool
operator
==
(
const
Optional
<
T
>&
lhs
,
const
Optional
<
U
>&
rhs
)
FLATBUFFERS_NOEXCEPT
{
return
static_cast
<
bool
>
(
lhs
)
!=
static_cast
<
bool
>
(
rhs
)
?
false
:
!
static_cast
<
bool
>
(
lhs
)
?
false
:
(
*
lhs
==
*
rhs
);
}
#endif // FLATBUFFERS_USE_STD_OPTIONAL
// Very limited and naive partial implementation of C++20 std::span<T,Extent>.
#if defined(FLATBUFFERS_USE_STD_SPAN)
inline
constexpr
std
::
size_t
dynamic_extent
=
std
::
dynamic_extent
;
template
<
class
T
,
std
::
size_t
Extent
=
std
::
dynamic_extent
>
using
span
=
std
::
span
<
T
,
Extent
>
;
#else // !defined(FLATBUFFERS_USE_STD_SPAN)
FLATBUFFERS_CONSTEXPR
std
::
size_t
dynamic_extent
=
static_cast
<
std
::
size_t
>
(
-
1
);
// Exclude this code if MSVC2010 or non-STL Android is active.
// The non-STL Android doesn't have `std::is_convertible` required for SFINAE.
#if !defined(FLATBUFFERS_SPAN_MINIMAL)
namespace
internal
{
// This is SFINAE helper class for checking of a common condition:
// > This overload only participates in overload resolution
// > Check whether a pointer to an array of From can be converted
// > to a pointer to an array of To.
// This helper is used for checking of 'From -> const From'.
template
<
class
To
,
std
::
size_t
Extent
,
class
From
,
std
::
size_t
N
>
struct
is_span_convertible
{
using
type
=
typename
std
::
conditional
<
std
::
is_convertible
<
From
(
*
)[],
To
(
*
)[]
>::
value
&&
(
Extent
==
dynamic_extent
||
N
==
Extent
),
int
,
void
>::
type
;
};
template
<
typename
T
>
struct
SpanIterator
{
// TODO: upgrade to std::random_access_iterator_tag.
using
iterator_category
=
std
::
forward_iterator_tag
;
using
difference_type
=
std
::
ptrdiff_t
;
using
value_type
=
typename
std
::
remove_cv
<
T
>::
type
;
using
reference
=
T
&
;
using
pointer
=
T
*
;
// Convince MSVC compiler that this iterator is trusted (it is verified).
#ifdef _MSC_VER
using
_Unchecked_type
=
pointer
;
#endif // _MSC_VER
SpanIterator
(
pointer
ptr
)
:
ptr_
(
ptr
)
{}
reference
operator
*
()
const
{
return
*
ptr_
;
}
pointer
operator
->
()
{
return
ptr_
;
}
SpanIterator
&
operator
++
()
{
ptr_
++
;
return
*
this
;
}
SpanIterator
operator
++
(
int
)
{
auto
tmp
=
*
this
;
++
(
*
this
);
return
tmp
;
}
friend
bool
operator
==
(
const
SpanIterator
&
lhs
,
const
SpanIterator
&
rhs
)
{
return
lhs
.
ptr_
==
rhs
.
ptr_
;
}
friend
bool
operator
!=
(
const
SpanIterator
&
lhs
,
const
SpanIterator
&
rhs
)
{
return
lhs
.
ptr_
!=
rhs
.
ptr_
;
}
private:
pointer
ptr_
;
};
}
// namespace internal
#endif // !defined(FLATBUFFERS_SPAN_MINIMAL)
// T - element type; must be a complete type that is not an abstract
// class type.
// Extent - the number of elements in the sequence, or dynamic.
template
<
class
T
,
std
::
size_t
Extent
=
dynamic_extent
>
class
span
FLATBUFFERS_FINAL_CLASS
{
public:
typedef
T
element_type
;
typedef
T
&
reference
;
typedef
const
T
&
const_reference
;
typedef
T
*
pointer
;
typedef
const
T
*
const_pointer
;
typedef
std
::
size_t
size_type
;
static
FLATBUFFERS_CONSTEXPR
size_type
extent
=
Extent
;
// Returns the number of elements in the span.
FLATBUFFERS_CONSTEXPR_CPP11
size_type
size
()
const
FLATBUFFERS_NOEXCEPT
{
return
count_
;
}
// Returns the size of the sequence in bytes.
FLATBUFFERS_CONSTEXPR_CPP11
size_type
size_bytes
()
const
FLATBUFFERS_NOEXCEPT
{
return
size
()
*
sizeof
(
element_type
);
}
// Checks if the span is empty.
FLATBUFFERS_CONSTEXPR_CPP11
bool
empty
()
const
FLATBUFFERS_NOEXCEPT
{
return
size
()
==
0
;
}
// Returns a pointer to the beginning of the sequence.
FLATBUFFERS_CONSTEXPR_CPP11
pointer
data
()
const
FLATBUFFERS_NOEXCEPT
{
return
data_
;
}
#if !defined(FLATBUFFERS_SPAN_MINIMAL)
using
Iterator
=
internal
::
SpanIterator
<
T
>
;
Iterator
begin
()
const
{
return
Iterator
(
data
());
}
Iterator
end
()
const
{
return
Iterator
(
data
()
+
size
());
}
#endif
// Returns a reference to the idx-th element of the sequence.
// The behavior is undefined if the idx is greater than or equal to size().
FLATBUFFERS_CONSTEXPR_CPP11
reference
operator
[](
size_type
idx
)
const
{
return
data
()[
idx
];
}
FLATBUFFERS_CONSTEXPR_CPP11
span
(
const
span
&
other
)
FLATBUFFERS_NOEXCEPT
:
data_
(
other
.
data_
),
count_
(
other
.
count_
)
{}
FLATBUFFERS_CONSTEXPR_CPP14
span
&
operator
=
(
const
span
&
other
)
FLATBUFFERS_NOEXCEPT
{
data_
=
other
.
data_
;
count_
=
other
.
count_
;
}
// Limited implementation of
// `template <class It> constexpr std::span(It first, size_type count);`.
//
// Constructs a span that is a view over the range [first, first + count);
// the resulting span has: data() == first and size() == count.
// The behavior is undefined if [first, first + count) is not a valid range,
// or if (extent != flatbuffers::dynamic_extent && count != extent).
FLATBUFFERS_CONSTEXPR_CPP11
explicit
span
(
pointer
first
,
size_type
count
)
FLATBUFFERS_NOEXCEPT
:
data_
(
Extent
==
dynamic_extent
?
first
:
(
Extent
==
count
?
first
:
nullptr
)),
count_
(
Extent
==
dynamic_extent
?
count
:
(
Extent
==
count
?
Extent
:
0
))
{
// Make span empty if the count argument is incompatible with span<T,N>.
}
// Exclude this code if MSVC2010 is active. The MSVC2010 isn't C++11
// compliant, it doesn't support default template arguments for functions.
#if defined(FLATBUFFERS_SPAN_MINIMAL)
FLATBUFFERS_CONSTEXPR_CPP11
span
()
FLATBUFFERS_NOEXCEPT
:
data_
(
nullptr
),
count_
(
0
)
{
static_assert
(
extent
==
0
||
extent
==
dynamic_extent
,
"invalid span"
);
}
#else
// Constructs an empty span whose data() == nullptr and size() == 0.
// This overload only participates in overload resolution if
// extent == 0 || extent == flatbuffers::dynamic_extent.
// A dummy template argument N is need dependency for SFINAE.
template
<
std
::
size_t
N
=
0
,
typename
internal
::
is_span_convertible
<
element_type
,
Extent
,
element_type
,
(
N
-
N
)>
::
type
=
0
>
FLATBUFFERS_CONSTEXPR_CPP11
span
()
FLATBUFFERS_NOEXCEPT
:
data_
(
nullptr
),
count_
(
0
)
{
static_assert
(
extent
==
0
||
extent
==
dynamic_extent
,
"invalid span"
);
}
// Constructs a span that is a view over the array arr; the resulting span
// has size() == N and data() == std::data(arr). These overloads only
// participate in overload resolution if
// extent == std::dynamic_extent || N == extent is true and
// std::remove_pointer_t<decltype(std::data(arr))>(*)[]
// is convertible to element_type (*)[].
template
<
std
::
size_t
N
,
typename
internal
::
is_span_convertible
<
element_type
,
Extent
,
element_type
,
N
>
::
type
=
0
>
FLATBUFFERS_CONSTEXPR_CPP11
span
(
element_type
(
&
arr
)[
N
])
FLATBUFFERS_NOEXCEPT
:
data_
(
arr
),
count_
(
N
)
{}
template
<
class
U
,
std
::
size_t
N
,
typename
internal
::
is_span_convertible
<
element_type
,
Extent
,
U
,
N
>
::
type
=
0
>
FLATBUFFERS_CONSTEXPR_CPP11
span
(
std
::
array
<
U
,
N
>
&
arr
)
FLATBUFFERS_NOEXCEPT
:
data_
(
arr
.
data
()),
count_
(
N
)
{}
//template<class U, std::size_t N,
// int = 0>
//FLATBUFFERS_CONSTEXPR_CPP11 span(std::array<U, N> &arr) FLATBUFFERS_NOEXCEPT
// : data_(arr.data()), count_(N) {}
template
<
class
U
,
std
::
size_t
N
,
typename
internal
::
is_span_convertible
<
element_type
,
Extent
,
U
,
N
>
::
type
=
0
>
FLATBUFFERS_CONSTEXPR_CPP11
span
(
const
std
::
array
<
U
,
N
>
&
arr
)
FLATBUFFERS_NOEXCEPT
:
data_
(
arr
.
data
()),
count_
(
N
)
{}
// Converting constructor from another span s;
// the resulting span has size() == s.size() and data() == s.data().
// This overload only participates in overload resolution
// if extent == std::dynamic_extent || N == extent is true and U (*)[]
// is convertible to element_type (*)[].
template
<
class
U
,
std
::
size_t
N
,
typename
internal
::
is_span_convertible
<
element_type
,
Extent
,
U
,
N
>
::
type
=
0
>
FLATBUFFERS_CONSTEXPR_CPP11
span
(
const
flatbuffers
::
span
<
U
,
N
>
&
s
)
FLATBUFFERS_NOEXCEPT
:
span
(
s
.
data
(),
s
.
size
())
{
}
#endif // !defined(FLATBUFFERS_SPAN_MINIMAL)
private:
// This is a naive implementation with 'count_' member even if (Extent != dynamic_extent).
pointer
const
data_
;
size_type
count_
;
};
#endif // defined(FLATBUFFERS_USE_STD_SPAN)
#if !defined(FLATBUFFERS_SPAN_MINIMAL)
template
<
class
ElementType
,
std
::
size_t
Extent
>
FLATBUFFERS_CONSTEXPR_CPP11
flatbuffers
::
span
<
ElementType
,
Extent
>
make_span
(
ElementType
(
&
arr
)[
Extent
])
FLATBUFFERS_NOEXCEPT
{
return
span
<
ElementType
,
Extent
>
(
arr
);
}
template
<
class
ElementType
,
std
::
size_t
Extent
>
FLATBUFFERS_CONSTEXPR_CPP11
flatbuffers
::
span
<
const
ElementType
,
Extent
>
make_span
(
const
ElementType
(
&
arr
)[
Extent
])
FLATBUFFERS_NOEXCEPT
{
return
span
<
const
ElementType
,
Extent
>
(
arr
);
}
template
<
class
ElementType
,
std
::
size_t
Extent
>
FLATBUFFERS_CONSTEXPR_CPP11
flatbuffers
::
span
<
ElementType
,
Extent
>
make_span
(
std
::
array
<
ElementType
,
Extent
>
&
arr
)
FLATBUFFERS_NOEXCEPT
{
return
span
<
ElementType
,
Extent
>
(
arr
);
}
template
<
class
ElementType
,
std
::
size_t
Extent
>
FLATBUFFERS_CONSTEXPR_CPP11
flatbuffers
::
span
<
const
ElementType
,
Extent
>
make_span
(
const
std
::
array
<
ElementType
,
Extent
>
&
arr
)
FLATBUFFERS_NOEXCEPT
{
return
span
<
const
ElementType
,
Extent
>
(
arr
);
}
template
<
class
ElementType
,
std
::
size_t
Extent
>
FLATBUFFERS_CONSTEXPR_CPP11
flatbuffers
::
span
<
ElementType
,
dynamic_extent
>
make_span
(
ElementType
*
first
,
std
::
size_t
count
)
FLATBUFFERS_NOEXCEPT
{
return
span
<
ElementType
,
dynamic_extent
>
(
first
,
count
);
}
template
<
class
ElementType
,
std
::
size_t
Extent
>
FLATBUFFERS_CONSTEXPR_CPP11
flatbuffers
::
span
<
const
ElementType
,
dynamic_extent
>
make_span
(
const
ElementType
*
first
,
std
::
size_t
count
)
FLATBUFFERS_NOEXCEPT
{
return
span
<
const
ElementType
,
dynamic_extent
>
(
first
,
count
);
}
#endif // !defined(FLATBUFFERS_SPAN_MINIMAL)
}
// namespace flatbuffers
#endif // FLATBUFFERS_STL_EMULATION_H_
opencv/3rdparty/flatbuffers/include/flatbuffers/string.h
0 → 100644
View file @
fbd3199c
/*
* Copyright 2021 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef FLATBUFFERS_STRING_H_
#define FLATBUFFERS_STRING_H_
#include "flatbuffers/base.h"
#include "flatbuffers/vector.h"
namespace
flatbuffers
{
struct
String
:
public
Vector
<
char
>
{
const
char
*
c_str
()
const
{
return
reinterpret_cast
<
const
char
*>
(
Data
());
}
std
::
string
str
()
const
{
return
std
::
string
(
c_str
(),
size
());
}
// clang-format off
#ifdef FLATBUFFERS_HAS_STRING_VIEW
flatbuffers
::
string_view
string_view
()
const
{
return
flatbuffers
::
string_view
(
c_str
(),
size
());
}
#endif // FLATBUFFERS_HAS_STRING_VIEW
// clang-format on
bool
operator
<
(
const
String
&
o
)
const
{
return
StringLessThan
(
this
->
data
(),
this
->
size
(),
o
.
data
(),
o
.
size
());
}
};
// Convenience function to get std::string from a String returning an empty
// string on null pointer.
static
inline
std
::
string
GetString
(
const
String
*
str
)
{
return
str
?
str
->
str
()
:
""
;
}
// Convenience function to get char* from a String returning an empty string on
// null pointer.
static
inline
const
char
*
GetCstring
(
const
String
*
str
)
{
return
str
?
str
->
c_str
()
:
""
;
}
#ifdef FLATBUFFERS_HAS_STRING_VIEW
// Convenience function to get string_view from a String returning an empty
// string_view on null pointer.
static
inline
flatbuffers
::
string_view
GetStringView
(
const
String
*
str
)
{
return
str
?
str
->
string_view
()
:
flatbuffers
::
string_view
();
}
#endif // FLATBUFFERS_HAS_STRING_VIEW
}
// namespace flatbuffers
#endif // FLATBUFFERS_STRING_H_
Prev
1
2
3
4
5
6
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment