mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-27 02:01:42 +00:00
[wpimath] Move unit formatters into units library (#5358)
This commit is contained in:
@@ -76,7 +76,7 @@
|
||||
#include <locale>
|
||||
#include <string>
|
||||
#endif
|
||||
#if !defined(UNIT_LIB_DISABLE_FMT)
|
||||
#if __has_include(<fmt/format.h>) && !defined(UNIT_LIB_DISABLE_FMT)
|
||||
#include <locale>
|
||||
#include <string>
|
||||
#include <fmt/format.h>
|
||||
@@ -176,7 +176,7 @@ namespace units
|
||||
* @param abbrev - abbreviated unit name, e.g. 'm'
|
||||
* @note When UNIT_LIB_ENABLE_IOSTREAM isn't defined, the macro does not generate any code
|
||||
*/
|
||||
#if !defined(UNIT_LIB_DISABLE_FMT)
|
||||
#if __has_include(<fmt/format.h>) && !defined(UNIT_LIB_DISABLE_FMT)
|
||||
#define UNIT_ADD_IO(namespaceName, nameSingular, abbrev)\
|
||||
}\
|
||||
template <>\
|
||||
@@ -2875,7 +2875,7 @@ namespace units
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#if !defined(UNIT_LIB_DISABLE_FMT)
|
||||
#if __has_include(<fmt/format.h>) && !defined(UNIT_LIB_DISABLE_FMT)
|
||||
template <>
|
||||
struct fmt::formatter<units::dimensionless::dB_t> : fmt::formatter<double>
|
||||
{
|
||||
@@ -3440,6 +3440,6 @@ namespace units::literals {}
|
||||
using namespace units::literals;
|
||||
#endif // UNIT_HAS_LITERAL_SUPPORT
|
||||
|
||||
#if !defined(UNIT_LIB_DISABLE_FMT)
|
||||
#include "frc/fmt/Units.h"
|
||||
#if __has_include(<fmt/format.h>) && !defined(UNIT_LIB_DISABLE_FMT)
|
||||
#include "units/formatter.h"
|
||||
#endif
|
||||
|
||||
218
wpimath/src/main/native/include/units/formatter.h
Normal file
218
wpimath/src/main/native/include/units/formatter.h
Normal file
@@ -0,0 +1,218 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fmt/format.h>
|
||||
|
||||
#include "units/base.h"
|
||||
|
||||
/**
|
||||
* Formatter for unit types.
|
||||
*
|
||||
* @tparam Units Unit tag for which type of units the `unit_t` represents (e.g.
|
||||
* meters).
|
||||
* @tparam T Underlying type of the storage. Defaults to double.
|
||||
* @tparam NonLinearScale Optional scale class for the units. Defaults to linear
|
||||
* (i.e. does not scale the unit value). Examples of
|
||||
* non-linear scales could be logarithmic, decibel, or
|
||||
* richter scales. Non-linear scales must adhere to the
|
||||
* non-linear-scale concept.
|
||||
*/
|
||||
template <class Units, typename T, template <typename> class NonLinearScale>
|
||||
struct fmt::formatter<units::unit_t<Units, T, NonLinearScale>>
|
||||
: fmt::formatter<double> {
|
||||
/**
|
||||
* Writes out a formatted unit.
|
||||
*
|
||||
* @tparam FormatContext Format string context type.
|
||||
* @param obj Unit instance.
|
||||
* @param ctx Format string context.
|
||||
*/
|
||||
template <typename FormatContext>
|
||||
auto format(const units::unit_t<Units, T, NonLinearScale>& obj,
|
||||
FormatContext& ctx) {
|
||||
using BaseUnits =
|
||||
units::unit<std::ratio<1>,
|
||||
typename units::traits::unit_traits<Units>::base_unit_type>;
|
||||
|
||||
auto out = ctx.out();
|
||||
|
||||
out = fmt::formatter<double>::format(
|
||||
units::convert<Units, BaseUnits>(obj()), ctx);
|
||||
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::meter_ratio::num != 0) {
|
||||
out = fmt::format_to(out, " m");
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::meter_ratio::num != 0 &&
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::meter_ratio::num != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "^{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::meter_ratio::num);
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::meter_ratio::den != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "/{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::meter_ratio::den);
|
||||
}
|
||||
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::kilogram_ratio::num != 0) {
|
||||
out = fmt::format_to(out, " kg");
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::kilogram_ratio::num != 0 &&
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::kilogram_ratio::num != 1) {
|
||||
out = fmt::format_to(out, "^{}",
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::kilogram_ratio::num);
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::kilogram_ratio::den != 1) {
|
||||
out = fmt::format_to(out, "/{}",
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::kilogram_ratio::den);
|
||||
}
|
||||
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::second_ratio::num != 0) {
|
||||
out = fmt::format_to(out, " s");
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::second_ratio::num != 0 &&
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::second_ratio::num != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "^{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::second_ratio::num);
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::second_ratio::den != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "/{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::second_ratio::den);
|
||||
}
|
||||
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::ampere_ratio::num != 0) {
|
||||
out = fmt::format_to(out, " A");
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::ampere_ratio::num != 0 &&
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::ampere_ratio::num != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "^{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::ampere_ratio::num);
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::ampere_ratio::den != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "/{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::ampere_ratio::den);
|
||||
}
|
||||
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::kelvin_ratio::num != 0) {
|
||||
out = fmt::format_to(out, " K");
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::kelvin_ratio::num != 0 &&
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::kelvin_ratio::num != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "^{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::kelvin_ratio::num);
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::kelvin_ratio::den != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "/{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::kelvin_ratio::den);
|
||||
}
|
||||
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::mole_ratio::num != 0) {
|
||||
out = fmt::format_to(out, " mol");
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::mole_ratio::num != 0 &&
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::mole_ratio::num != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "^{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::mole_ratio::num);
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::mole_ratio::den != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "/{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::mole_ratio::den);
|
||||
}
|
||||
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::candela_ratio::num != 0) {
|
||||
out = fmt::format_to(out, " cd");
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::candela_ratio::num != 0 &&
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::candela_ratio::num != 1) {
|
||||
out = fmt::format_to(out, "^{}",
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::candela_ratio::num);
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::candela_ratio::den != 1) {
|
||||
out = fmt::format_to(out, "/{}",
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::candela_ratio::den);
|
||||
}
|
||||
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::radian_ratio::num != 0) {
|
||||
out = fmt::format_to(out, " rad");
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::radian_ratio::num != 0 &&
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::radian_ratio::num != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "^{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::radian_ratio::num);
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::radian_ratio::den != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "/{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::radian_ratio::den);
|
||||
}
|
||||
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::byte_ratio::num != 0) {
|
||||
out = fmt::format_to(out, " b");
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::byte_ratio::num != 0 &&
|
||||
units::traits::unit_traits<
|
||||
Units>::base_unit_type::byte_ratio::num != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "^{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::byte_ratio::num);
|
||||
}
|
||||
if constexpr (units::traits::unit_traits<
|
||||
Units>::base_unit_type::byte_ratio::den != 1) {
|
||||
out = fmt::format_to(
|
||||
out, "/{}",
|
||||
units::traits::unit_traits<Units>::base_unit_type::byte_ratio::den);
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user