113#define DETAIL_MR_UNIT_ENUMS(X) X(NoUnit) X(LengthUnit) X(AngleUnit) X(PixelSizeUnit) X(RatioUnit) X(TimeUnit) X(MovementSpeedUnit) X(AreaUnit) X(VolumeUnit) X(InvLengthUnit)
117#define DETAIL_MR_UNIT_VALUE_TYPES(X, ...) \
118 X(float ,__VA_ARGS__) X(double ,__VA_ARGS__) X(long double ,__VA_ARGS__) \
119 X(signed char ,__VA_ARGS__) X(unsigned char ,__VA_ARGS__) \
120 X(short ,__VA_ARGS__) X(unsigned short ,__VA_ARGS__) \
121 X(int ,__VA_ARGS__) X(unsigned int ,__VA_ARGS__) \
122 X(long ,__VA_ARGS__) X(unsigned long ,__VA_ARGS__) \
123 X(long long ,__VA_ARGS__) X(unsigned long long ,__VA_ARGS__)
128 #define MR_X(E) || std::same_as<T, E>
153#define MR_X(E) template <> [[nodiscard]] MRMESH_API MR_BIND_IGNORE const UnitInfo& getUnitInfo( E unit );
170namespace detail::Units
172 template <
typename T>
173 concept Scalar = std::is_arithmetic_v<T> && !std::is_same_v<T, bool>;
175 template <
typename T>
182template <UnitEnum E,
typename T>
189 if constexpr ( std::is_same_v<T, ReturnType> )
191 if ( !needConversion )
197 for (
int i = 0; i < VectorTraits<T>::size; i++ )
202 bool needElemConversion = needConversion;
203 if constexpr ( std::is_floating_point_v<typename VectorTraits<T>::BaseType> )
205 if ( needElemConversion &&
208 target >= std::numeric_limits<typename VectorTraits<T>::BaseType>::max()
211 needElemConversion =
false;
214 if ( needElemConversion )
222template <UnitEnum E,
typename T>
Whether E is one of the unit enums: NoUnit, LengthUnit, AngleUnit, ...
Definition MRUnitInfo.h:127
Definition MRUnitInfo.h:173
PixelSizeUnit
Measurement units of screen sizes.
Definition MRUnitInfo.h:43
#define MR_X(E)
ignore for bindings to prevent GCC14 error: undefined symbol: ZN2MR11getUnitInfoITkNS_8UnitEnumENS_8T...
Definition MRUnitInfo.h:153
std::string_view unitSuffix
Definition MRUnitInfo.h:145
#define DETAIL_MR_UNIT_ENUMS(X)
A list of all unit enums, for internal use.
Definition MRUnitInfo.h:113
std::string_view prettyName
Definition MRUnitInfo.h:141
const UnitInfo & getUnitInfo(E unit)=delete
Returns information about a single measurement unit.
NoUnit
A stub measurement unit representing no unit.
Definition MRUnitInfo.h:17
bool unitsAreEquivalent(E a, E b)
Returns true if converting a value between units a and b doesn't change its value.
Definition MRUnitInfo.h:159
LengthUnit
Measurement units of length.
Definition MRUnitInfo.h:23
float conversionFactor
Definition MRUnitInfo.h:139
static constexpr auto && getElem(int i, U &&value)
Definition MRMesh/MRVectorTraits.h:32
RatioUnit
Measurement units for factors / ratios.
Definition MRUnitInfo.h:50
MovementSpeedUnit
Measurement units for movement speed.
Definition MRUnitInfo.h:66
detail::Units::MakeFloatingPoint< T > convertUnits(E from, E to, const T &value)
Definition MRUnitInfo.h:183
VolumeUnit
Measurement units for body volume.
Definition MRUnitInfo.h:90
T BaseType
The base template handles scalars (or just non-vectors).
Definition MRMesh/MRVectorTraits.h:21
AreaUnit
Measurement units for surface area.
Definition MRUnitInfo.h:78
std::conditional_t< std::is_integral_v< typename VectorTraits< T >::BaseType >, typename VectorTraits< T >::template ChangeBaseType< float >, T > MakeFloatingPoint
Definition MRUnitInfo.h:176
TimeUnit
Measurement units for time.
Definition MRUnitInfo.h:58
InvLengthUnit
Measurement units for 1/length.
Definition MRUnitInfo.h:102
AngleUnit
Measurement units of angle.
Definition MRUnitInfo.h:35
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Information about a single measurement unit.
Definition MRUnitInfo.h:136
Common traits for (mathematical) vectors.
Definition MRMesh/MRVectorTraits.h:18