mp-units
mp-units copied to clipboard
Effectively global unit names like 'm' are problematic
The use of names such as 'm' effectively in the global namespace doesn't scale well. I have been looking into trying to use mp-units in a real library and selected ArduPilot, since I know it well. I did a search for ' m ' in the codebase in .cpp and .h files and came up with around 350 hits. m
is of course only one of many very short names which are brought in by the using namespace mp_units::si::unit_symbols
declaration.
EDIT: for example :
#include <mp-units/systems/si/si.h>
#include <iostream>
#include <mp-units/format.h>
#include <mp-units/ostream.h>
using namespace mp_units::si::unit_symbols;
int main()
{
auto q1 = 1 * m;
std::cout << q1 <<'\n';
int m = 1;
auto q2 = 2 * m;
std::cout << q2 <<'\n';
}
The rough solution I came up with was a namespace alias, but is there another official alternative way to initialise quantities than these very unit names, because I can see them being very problematic if you are trying to update an existing codebase and this is the only way to initialise a quantity.
#include <mp-units/systems/si/si.h>
#include <iostream>
#include <mp-units/format.h>
#include <mp-units/ostream.h>
namespace si_unit = mp_units::si::unit_symbols;
int main()
{
static_assert(10.0 * si_unit::m / 2 == 5 * si_unit::m );
auto q1 = 10.0f * si_unit::m;
std::cout << q1 <<'\n';
auto q2 = q1/q1;
std::cout << q2 <<'\n';
}
Below is a small selection of the results of the search
~/ardupilot/libraries/SITL/SIM_Aircraft.cpp:436: Matrix3f m = dcm;
~/ardupilot/libraries/SITL/SIM_Aircraft.cpp:437: m = m * sitl->ahrs_rotation_inv;
~/ardupilot/libraries/SITL/SIM_XPlane.cpp:500: uint32_t m = uint32_t(data[7]) & j->mask;
~/ardupilot/libraries/AP_Declination/tests/test_magfield.cpp:119: const Vector3f m = AP_Declination::get_earth_field_ga(loc);
~/ardupilot/libraries/AP_HAL_SITL/DSP.cpp:174: uint16_t m = fft_log2(fftlen);
~/ardupilot/libraries/AP_Filesystem/AP_Filesystem_Mission.cpp:420: mavlink_mission_item_int_t m {};
~/ardupilot/libraries/AP_Filesystem/AP_Filesystem_Mission.cpp:476: mavlink_mission_item_int_t m {};
~/ardupilot/libraries/AP_Filesystem/AP_Filesystem_Mission.cpp:513: mavlink_mission_item_int_t m {};
~/ardupilot/libraries/AP_Common/time.cpp:25: m = 0;
~/ardupilot/libraries/AP_Common/time.cpp:34: m = 0;
~/ardupilot/libraries/AP_RCTelemetry/AP_Spektrum_Telem.cpp:567: m = 0;
~/ardupilot/libraries/AP_Math/tests/test_rotations.cpp:136: vec2 = m * vec2;
~/ardupilot/libraries/AP_Math/examples/rotations/rotations.cpp:322: vec2 = m * vec2;
~/ardupilot/libraries/AP_Math/examples/eulers/eulers.cpp:227: v2 = m * v;
~/ardupilot/libraries/AP_Math/examples/eulers/eulers.cpp:233: v2 = m * v;
~/ardupilot/libraries/AP_Math/examples/eulers/eulers.cpp:239: v2 = m * v;
~/ardupilot/libraries/AP_Math/quaternion.cpp:416: v = m * v;
~/ardupilot/libraries/AC_Avoidance/AP_OABendyRuler.cpp:697: const float m = Vector3f::closest_distance_between_line_and_point(start_NEU, end_NEU, point_cm) * 0.01f - item.radius;