Canonicalize mjVisual macros to include type and dimension.
PiperOrigin-RevId: 928506110 Change-Id: If5d031f9d87892f13486ae9ccde23c16131212de
This commit is contained in:
committed by
Copybara-Service
parent
da5500c202
commit
6c33e16bf1
+28
-37
@@ -153,14 +153,8 @@ TEST_F(HeaderTest, MjVisualFields) {
|
||||
mjVisual v;
|
||||
std::vector<std::pair<const void*, const char*>> fields;
|
||||
|
||||
// All member fields in quality, map, scale, and rgba have the same type.
|
||||
using QualityMemberType = int;
|
||||
using MapMemberType = float;
|
||||
using ScaleMemberType = float;
|
||||
using RgbaMemberType = float[4];
|
||||
|
||||
// check that all X macros have the correct type and dim
|
||||
#define X(type, name) \
|
||||
#define X(type, name, dim) \
|
||||
static_assert( \
|
||||
std::is_same_v<decltype(v.global.name), type>, \
|
||||
"incorrect type for mjVisual::global::" #name);
|
||||
@@ -169,10 +163,9 @@ TEST_F(HeaderTest, MjVisualFields) {
|
||||
|
||||
#undef X
|
||||
|
||||
#define X(name) \
|
||||
static_assert( \
|
||||
std::is_same_v<decltype(v.quality.name), QualityMemberType>, \
|
||||
"incorrect type for mjVisual::quality::" #name);
|
||||
#define X(type, name, dim) \
|
||||
static_assert(std::is_same_v<decltype(v.quality.name), type>, \
|
||||
"incorrect type for mjVisual::quality::" #name);
|
||||
|
||||
MJVISUAL_QUALITY_FIELDS
|
||||
|
||||
@@ -185,8 +178,8 @@ TEST_F(HeaderTest, MjVisualFields) {
|
||||
#define X(type, name, dim) \
|
||||
static_assert(dim == 1, "use XVEC for non-scalar fields"); \
|
||||
XIMPL(type, name, dim)
|
||||
#define XVEC(type, name, dim) \
|
||||
static_assert(dim > 1, "use X for scalar fields"); \
|
||||
#define XVEC(type, name, dim) \
|
||||
static_assert(dim > 1, "use X for scalar fields"); \
|
||||
XIMPL(type, name, dim)
|
||||
|
||||
MJVISUAL_HEADLIGHT_FIELDS
|
||||
@@ -194,39 +187,37 @@ TEST_F(HeaderTest, MjVisualFields) {
|
||||
#undef X
|
||||
#undef XVEC
|
||||
|
||||
#define X(name) \
|
||||
static_assert( \
|
||||
std::is_same_v<decltype(v.map.name), MapMemberType>, \
|
||||
"incorrect type for mjVisual::map::" #name);
|
||||
#define X(type, name, dim) \
|
||||
static_assert(std::is_same_v<decltype(v.map.name), type>, \
|
||||
"incorrect type for mjVisual::map::" #name);
|
||||
|
||||
MJVISUAL_MAP_FIELDS
|
||||
|
||||
#undef X
|
||||
|
||||
#define X(name) \
|
||||
static_assert( \
|
||||
std::is_same_v<decltype(v.scale.name), ScaleMemberType>, \
|
||||
"incorrect type for mjVisual::scale::" #name);
|
||||
#define X(type, name, dim) \
|
||||
static_assert(std::is_same_v<decltype(v.scale.name), type>, \
|
||||
"incorrect type for mjVisual::scale::" #name);
|
||||
|
||||
MJVISUAL_SCALE_FIELDS
|
||||
|
||||
#undef X
|
||||
|
||||
#define X(name) \
|
||||
static_assert( \
|
||||
std::is_same_v<decltype(v.rgba.name), RgbaMemberType>, \
|
||||
#define XVEC(type, name, dim) \
|
||||
static_assert( \
|
||||
std::is_same_v<decltype(v.rgba.name), ArrayOrScalarT<type, dim>>, \
|
||||
"incorrect type for mjVisual::rgba::" #name);
|
||||
|
||||
MJVISUAL_RGBA_FIELDS
|
||||
|
||||
#undef X
|
||||
#undef XVEC
|
||||
|
||||
// check that the ordering of X macros agrees with the struct fields
|
||||
#define X(type, name) \
|
||||
#define X(type, name, dim) \
|
||||
fields.push_back({static_cast<const void*>(&v.global.name), #name});
|
||||
MJVISUAL_GLOBAL_FIELDS
|
||||
#undef X
|
||||
#define X(name) \
|
||||
#define X(type, name, dim) \
|
||||
fields.push_back({static_cast<const void*>(&v.quality.name), #name});
|
||||
MJVISUAL_QUALITY_FIELDS
|
||||
#undef X
|
||||
@@ -236,30 +227,30 @@ TEST_F(HeaderTest, MjVisualFields) {
|
||||
MJVISUAL_HEADLIGHT_FIELDS
|
||||
#undef XVEC
|
||||
#undef X
|
||||
#define X(name) \
|
||||
#define X(type, name, dim) \
|
||||
fields.push_back({static_cast<const void*>(&v.map.name), #name});
|
||||
MJVISUAL_MAP_FIELDS
|
||||
#undef X
|
||||
#define X(name) \
|
||||
#define X(type, name, dim) \
|
||||
fields.push_back({static_cast<const void*>(&v.scale.name), #name});
|
||||
MJVISUAL_SCALE_FIELDS
|
||||
#undef X
|
||||
#define X(name) \
|
||||
#define XVEC(type, name, dim) \
|
||||
fields.push_back({static_cast<const void*>(&v.rgba.name), #name});
|
||||
MJVISUAL_RGBA_FIELDS
|
||||
#undef X
|
||||
#undef XVEC
|
||||
|
||||
CheckAddressOrdering(fields, "MJVISUAL_FIELDS");
|
||||
|
||||
// check that MJVISUAL_FIELDS is a complete list of fields
|
||||
struct ExpectedMjVisual {
|
||||
struct {
|
||||
#define X(type, name) type name;
|
||||
#define X(type, name, dim) type name;
|
||||
MJVISUAL_GLOBAL_FIELDS;
|
||||
#undef X
|
||||
} global;
|
||||
struct {
|
||||
#define X(name) QualityMemberType name;
|
||||
#define X(type, name, dim) type name;
|
||||
MJVISUAL_QUALITY_FIELDS;
|
||||
#undef X
|
||||
} quality;
|
||||
@@ -271,19 +262,19 @@ TEST_F(HeaderTest, MjVisualFields) {
|
||||
#undef X
|
||||
} headlight;
|
||||
struct {
|
||||
#define X(name) MapMemberType name;
|
||||
#define X(type, name, dim) type name;
|
||||
MJVISUAL_MAP_FIELDS;
|
||||
#undef X
|
||||
} map;
|
||||
struct {
|
||||
#define X(name) ScaleMemberType name;
|
||||
#define X(type, name, dim) type name;
|
||||
MJVISUAL_SCALE_FIELDS;
|
||||
#undef X
|
||||
} scale;
|
||||
struct {
|
||||
#define X(name) RgbaMemberType name;
|
||||
#define XVEC(type, name, dim) type name[dim];
|
||||
MJVISUAL_RGBA_FIELDS;
|
||||
#undef X
|
||||
#undef XVEC
|
||||
} rgba;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user