mp-units icon indicating copy to clipboard operation
mp-units copied to clipboard

Effectively global unit names like 'm' are problematic

Open kwikius opened this issue 4 months ago • 35 comments

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;

kwikius avatar Feb 25 '24 13:02 kwikius