Canonicalize mjVisual macros to include type and dimension.

PiperOrigin-RevId: 928506110
Change-Id: If5d031f9d87892f13486ae9ccde23c16131212de
This commit is contained in:
Yuval Tassa
2026-06-08 05:30:15 -07:00
committed by Copybara-Service
parent da5500c202
commit 6c33e16bf1
5 changed files with 132 additions and 137 deletions
+28 -37
View File
@@ -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;
};