HID: Added static asserts to check register position in shared memory.

This commit is contained in:
bunnei 2015-03-08 21:21:25 -04:00
parent f213000cc4
commit e9b9f1842b

View File

@ -89,7 +89,7 @@ struct TouchDataEntry {
* Structure of data stored in HID shared memory * Structure of data stored in HID shared memory
*/ */
struct SharedMem { struct SharedMem {
// Offset 0x0 : "PAD" data, this is used for buttons and the circle pad // "Pad data, this is used for buttons and the circle pad
struct { struct {
s64 index_reset_ticks; s64 index_reset_ticks;
s64 index_reset_ticks_previous; s64 index_reset_ticks_previous;
@ -105,7 +105,7 @@ struct SharedMem {
std::array<PadDataEntry, 8> entries; // Pad state history std::array<PadDataEntry, 8> entries; // Pad state history
} pad; } pad;
// Offset 0xA8 : Touchpad data, this is used for touchpad input // Touchpad data, this is used for touchpad input
struct { struct {
s64 index_reset_ticks; s64 index_reset_ticks;
s64 index_reset_ticks_previous; s64 index_reset_ticks_previous;
@ -117,6 +117,20 @@ struct SharedMem {
} touch; } touch;
}; };
// TODO: MSVC does not support using offsetof() on non-static data members even though this
// is technically allowed since C++11. This macro should be enabled once MSVC adds
// support for that.
#ifndef _MSC_VER
#define ASSERT_REG_POSITION(field_name, position) \
static_assert(offsetof(SharedMem, field_name) == position * 4, \
"Field "#field_name" has invalid position")
ASSERT_REG_POSITION(pad.index_reset_ticks, 0x0);
ASSERT_REG_POSITION(touch.index_reset_ticks, 0x2A);
#undef ASSERT_REG_POSITION
#endif // !defined(_MSC_VER)
// Pre-defined PadStates for single button presses // Pre-defined PadStates for single button presses
const PadState PAD_NONE = {{0}}; const PadState PAD_NONE = {{0}};
const PadState PAD_A = {{1u << 0}}; const PadState PAD_A = {{1u << 0}};