mirror of
https://github.com/google/flatbuffers.git
synced 2026-07-04 16:31:11 +00:00
allow to use reflection in constant time evaluation (#8978)
* Update reflection.h allow to use reflection in constant time evaluation * make GetTypeSize constexpr * fix clang-format
This commit is contained in:
@@ -30,23 +30,21 @@ namespace flatbuffers {
|
|||||||
|
|
||||||
// ------------------------- GETTERS -------------------------
|
// ------------------------- GETTERS -------------------------
|
||||||
|
|
||||||
inline bool IsScalar(reflection::BaseType t) {
|
constexpr bool IsScalar(reflection::BaseType t) {
|
||||||
return t >= reflection::UType && t <= reflection::Double;
|
return t >= reflection::UType && t <= reflection::Double;
|
||||||
}
|
}
|
||||||
inline bool IsInteger(reflection::BaseType t) {
|
constexpr bool IsInteger(reflection::BaseType t) {
|
||||||
return t >= reflection::UType && t <= reflection::ULong;
|
return t >= reflection::UType && t <= reflection::ULong;
|
||||||
}
|
}
|
||||||
inline bool IsFloat(reflection::BaseType t) {
|
constexpr bool IsFloat(reflection::BaseType t) {
|
||||||
return t == reflection::Float || t == reflection::Double;
|
return t == reflection::Float || t == reflection::Double;
|
||||||
}
|
}
|
||||||
inline bool IsLong(reflection::BaseType t) {
|
constexpr bool IsLong(reflection::BaseType t) {
|
||||||
return t == reflection::Long || t == reflection::ULong;
|
return t == reflection::Long || t == reflection::ULong;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Size of a basic type, don't use with structs.
|
|
||||||
inline size_t GetTypeSize(reflection::BaseType base_type) {
|
|
||||||
// This needs to correspond to the BaseType enum.
|
// This needs to correspond to the BaseType enum.
|
||||||
static size_t sizes[] = {
|
constexpr size_t kBaseTypeSize[] = {
|
||||||
0, // None
|
0, // None
|
||||||
1, // UType
|
1, // UType
|
||||||
1, // Bool
|
1, // Bool
|
||||||
@@ -70,10 +68,14 @@ inline size_t GetTypeSize(reflection::BaseType base_type) {
|
|||||||
|
|
||||||
0 // MaxBaseType. This must be kept the last entry in this array.
|
0 // MaxBaseType. This must be kept the last entry in this array.
|
||||||
};
|
};
|
||||||
static_assert(sizeof(sizes) / sizeof(size_t) == reflection::MaxBaseType + 1,
|
static_assert(sizeof(kBaseTypeSize) / sizeof(size_t) ==
|
||||||
|
reflection::MaxBaseType + 1,
|
||||||
"Size of sizes[] array does not match the count of BaseType "
|
"Size of sizes[] array does not match the count of BaseType "
|
||||||
"enum values.");
|
"enum values.");
|
||||||
return sizes[base_type];
|
|
||||||
|
// Size of a basic type, don't use with structs.
|
||||||
|
constexpr size_t GetTypeSize(reflection::BaseType base_type) {
|
||||||
|
return kBaseTypeSize[base_type];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Same as above, but now correctly returns the size of a struct if
|
// Same as above, but now correctly returns the size of a struct if
|
||||||
@@ -420,7 +422,7 @@ pointer_inside_vector<T, U> piv(T* ptr, std::vector<U>& vec) {
|
|||||||
return pointer_inside_vector<T, U>(ptr, vec);
|
return pointer_inside_vector<T, U>(ptr, vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const char* UnionTypeFieldSuffix() { return "_type"; }
|
constexpr const char* UnionTypeFieldSuffix() { return "_type"; }
|
||||||
|
|
||||||
// Helper to figure out the actual table type a union refers to.
|
// Helper to figure out the actual table type a union refers to.
|
||||||
inline const reflection::Object& GetUnionType(
|
inline const reflection::Object& GetUnionType(
|
||||||
|
|||||||
Reference in New Issue
Block a user