Sequoia
Loading...
Searching...
No Matches
Classes | Typedefs | Functions | Variables
PhysicalValues.hpp File Reference
#include "sequoia/Physics/PhysicalValuesDetails.hpp"
#include <numbers>

Go to the source code of this file.

Classes

struct  sequoia::physics::reciprocal_validator< T >
 
struct  sequoia::physics::unit_defined_right_handed_basis< M, U >
 
struct  sequoia::physics::no_unit_t
 
struct  sequoia::maths::dual< T >
 Specialization for units, such as degrees Celsius, for which the corresponding quantity cannot be inverted. More...
 
struct  sequoia::maths::dual_of< physics::unit_defined_right_handed_basis< M, U > >
 
struct  sequoia::maths::dual_of< physics::unit_defined_right_handed_basis< dual< M >, dual< U > > >
 
struct  sequoia::maths::dual_of< physics::no_unit_t >
 
struct  sequoia::physics::reduced_validator< T >
 
struct  sequoia::physics::reduced_validator< T, Us... >
 
struct  sequoia::physics::composite_unit< Ts >
 
struct  sequoia::physics::composite_space< Ts... >
 
struct  sequoia::physics::reduction< direct_product< Us... > >
 
struct  sequoia::physics::reduction< direct_product< composite_unit< Ts... >, U > >
 
struct  sequoia::physics::reduction< direct_product< T, composite_unit< Us... > > >
 
struct  sequoia::physics::reduction< direct_product< composite_unit< Ts... >, composite_unit< Us... > > >
 
struct  sequoia::physics::reduction< direct_product< Ts... > >
 
struct  sequoia::physics::reduction< direct_product< composite_space< Ts... >, U > >
 
struct  sequoia::physics::reduction< direct_product< T, composite_space< Us... > > >
 
struct  sequoia::physics::reduction< direct_product< composite_space< Ts... >, composite_space< Us... > > >
 
struct  sequoia::physics::reduced_validator< T, std::identity >
 
struct  sequoia::physics::reduced_validator< std::identity, T >
 
struct  sequoia::physics::reduced_validator< half_line_validator, half_line_validator >
 
struct  sequoia::physics::unit_defined_origin< Unit >
 
struct  sequoia::physics::implicit_affine_origin< T >
 
struct  sequoia::physics::distinguished_origin< T >
 
struct  sequoia::physics::to_origin_type< ValueSpace, Unit >
 
struct  sequoia::physics::to_base_space< T >
 
struct  sequoia::physics::to_base_space< T >
 
struct  sequoia::physics::to_base_space< dual< T > >
 
struct  sequoia::physics::to_base_space< composite_space< Ts... > >
 
struct  sequoia::physics::to_displacement_space< T, T >
 
struct  sequoia::physics::to_displacement_space< T, U >
 
struct  sequoia::physics::consistent_bases< Basis1, Basis2 >
 
struct  sequoia::physics::consistent_bases< unit_defined_right_handed_basis< M1, U1 >, unit_defined_right_handed_basis< M2, U2 > >
 
struct  sequoia::physics::physical_value_product< physical_value< LHSValueSpace, LHSUnit, LHSBasis, distinguished_origin< LHSValueSpace >, LHSValidator >, physical_value< RHSValueSpace, RHSUnit, RHSBasis, distinguished_origin< RHSValueSpace >, RHSValidator > >
 
struct  sequoia::physics::conversion_space< C, FromUnit, ToUnit >
 
struct  sequoia::physics::impl::is_valid_physical_value_pack< Rep,... >
 
struct  sequoia::physics::impl::is_valid_physical_value_pack< Rep, std::tuple< Args... >, std::index_sequence< Is... > >
 
struct  sequoia::physics::is_valid_physical_value_pack< Rep, Args >
 
class  sequoia::physics::physical_value< ValueSpace, Unit, Basis, Origin, Validator >
 
struct  sequoia::physics::default_space< Unit, Rep >
 
struct  sequoia::physics::default_space< dual< Unit >, Rep >
 
struct  sequoia::physics::default_space< composite_unit< Ts... >, Rep >
 
struct  sequoia::physics::sets::classical::masses< Arena >
 
struct  sequoia::physics::sets::classical::temperatures< Arena >
 
struct  sequoia::physics::sets::classical::electrical_currents< Arena >
 
struct  sequoia::physics::sets::classical::times< Arena >
 
struct  sequoia::physics::sets::classical::time_intervals< Arena >
 
struct  sequoia::physics::sets::classical::positions< D, Arena >
 
struct  sequoia::physics::sets::classical::lengths< Arena >
 
struct  sequoia::physics::sets::classical::angles< Arena >
 
struct  sequoia::physics::sets::classical::differences< PhysicalValueSet >
 
struct  sequoia::physics::associated_displacement_space< Space >
 
struct  sequoia::physics::associated_displacement_space< Space >
 
struct  sequoia::physics::physical_value_convex_space< PhysicalValueSet, Rep, D, Derived >
 
struct  sequoia::physics::physical_value_affine_space< PhysicalValueSet, Rep, D, Derived >
 
struct  sequoia::physics::physical_value_vector_space< PhysicalValueSet, Rep, D, Derived >
 
struct  sequoia::physics::mass_space< Rep, Arena >
 
struct  sequoia::physics::absolute_temperature_space< Rep, Arena >
 
struct  sequoia::physics::relaxed_space< C >
 
struct  sequoia::physics::electrical_current_space< Rep, Arena >
 
struct  sequoia::physics::angular_space< Rep, Arena >
 
struct  sequoia::physics::length_space< Rep, Arena >
 
struct  sequoia::physics::width_space< Rep, Arena >
 
struct  sequoia::physics::width_space< Rep, Arena >::free_module_type
 
struct  sequoia::physics::height_space< Rep, Arena >
 
struct  sequoia::physics::height_space< Rep, Arena >::free_module_type
 
struct  sequoia::physics::time_interval_space< Rep, Arena >
 
struct  sequoia::physics::time_space< Rep, Arena >
 
struct  sequoia::physics::position_space< Rep, D, Arena >
 
struct  sequoia::physics::implicit_common_arena
 
struct  sequoia::physics::scale_invariant_validator< Validator >
 
struct  sequoia::physics::scale_invariant_validator< T >
 
struct  sequoia::physics::translation_invariant_validator< Validator >
 
struct  sequoia::physics::translation_invariant_validator< std::identity >
 
struct  sequoia::physics::product< T, U, Vs... >
 
struct  sequoia::physics::inverse< dilatation< ratio< Num, Den > > >
 
struct  sequoia::physics::inverse< dilatation< std::ratio< Num, Den > > >
 
struct  sequoia::physics::translation< Displacement >
 
struct  sequoia::physics::inverse< translation< Displacement > >
 
struct  sequoia::physics::synthesised_validator< coordinate_transform< U, dilatation< Ratio >, translation< Displacement > > >
 
struct  sequoia::physics::coordinate_transform< U, dilatation< Ratio >, translation< Displacement > >
 
struct  sequoia::physics::inverse< coordinate_transform< U, dilatation< Ratio >, translation< Displacement > > >
 
struct  sequoia::physics::product< coordinate_transform< LHSUnit, dilatation< LHSRatio >, translation< LHSDisplacement > >, coordinate_transform< RHSUnit, dilatation< RHSRatio >, translation< RHSDisplacement > > >
 
struct  sequoia::physics::is_coordinate_transform< T >
 
struct  sequoia::physics::is_coordinate_transform< coordinate_transform< U, dilatation< Ratio >, translation< Displacement > > >
 
struct  sequoia::physics::root_transform< U >
 
struct  sequoia::physics::root_transform< U >
 
struct  sequoia::physics::root_transform< composite_unit< Us... > >
 
struct  sequoia::physics::has_identity_dilatation< T >
 
struct  sequoia::physics::has_identity_dilatation< coordinate_transform< U, dilatation< Ratio >, translation< Displacement > > >
 
struct  sequoia::physics::has_identity_translation< T >
 
struct  sequoia::physics::has_identity_translation< coordinate_transform< U, dilatation< Ratio >, translation< Displacement > > >
 
struct  sequoia::physics::conversion_space< C, FromUnit, ToUnit >
 
struct  sequoia::physics::conversion_space< relaxed_space< C >, FromUnit, ToUnit >
 
struct  sequoia::physics::micro< Unit >
 
struct  sequoia::physics::milli< Unit >
 
struct  sequoia::physics::kilo< Unit >
 
struct  sequoia::physics::mega< Unit >
 
struct  sequoia::physics::si::units::ampere_t
 
struct  sequoia::physics::si::units::kilogram_t
 
struct  sequoia::physics::si::units::metre_t
 
struct  sequoia::physics::si::units::second_t
 
struct  sequoia::physics::si::units::kelvin_t
 
struct  sequoia::physics::si::units::coulomb_t
 
struct  sequoia::physics::si::units::radian_t
 
struct  sequoia::physics::si::units::celsius_t
 
struct  sequoia::physics::non_si::units::degree_t
 
struct  sequoia::physics::non_si::units::gradian_t
 
struct  sequoia::physics::non_si::units::farenheight_t
 
struct  sequoia::physics::non_si::units::foot_t
 
struct  sequoia::physics::conversion_space< associated_displacement_space< C >, FromUnit, ToUnit >
 
struct  sequoia::physics::default_space< coordinate_transform< Unit, dilatation< Ratio >, translation< Trans > >, Rep >
 
struct  sequoia::physics::default_space< Unit, Rep >
 
struct  sequoia::physics::default_space< si::units::metre_t, T >
 
struct  sequoia::physics::default_space< si::units::second_t, T >
 
struct  sequoia::physics::default_space< si::units::kilogram_t, T >
 
struct  sequoia::physics::default_space< si::units::radian_t, T >
 
struct  sequoia::physics::default_space< si::units::kelvin_t, T >
 
struct  sequoia::physics::default_space< si::units::ampere_t, T >
 
struct  sequoia::maths::coordinate_transformation< physical_value< ValueSpaceFrom, UnitFrom, BasisFrom, OriginFrom, ValidatorFrom >, physical_value< ValueSpaceTo, UnitTo, BasisTo, OriginTo, ValidatorTo > >
 
struct  std::formatter< sequoia::physics::physical_value< ValueSpace, Unit, Basis, Origin, Validator > >
 

Typedefs

template<class T >
using sequoia::physics::reciprocal_validator_t = reciprocal_validator< T >::type
 
template<class... Ts>
using sequoia::physics::reduced_validator_t = reduced_validator< Ts... >::type
 
template<class T >
using sequoia::physics::reduction_t = reduction< T >::type
 
template<convex_space ValueSpace, physical_unit Unit>
using sequoia::physics::to_origin_type_t = to_origin_type< ValueSpace, Unit >::type
 
template<convex_space ValueSpace, physical_unit Unit, basis_for< free_module_type_of_t< ValueSpace > > Basis, class Validator >
using sequoia::physics::to_coordinates_base_type = coordinates_base< ValueSpace, Basis, Validator, physical_value< free_module_type_of_t< ValueSpace >, Unit, Basis, distinguished_origin< free_module_type_of_t< ValueSpace > >, std::identity > >
 
template<convex_space T>
using sequoia::physics::to_base_space_t = to_base_space< T >::type
 
template<convex_space T, convex_space U>
using sequoia::physics::to_displacement_space_t = to_displacement_space< T, U >::type
 
template<class T , class U >
using sequoia::physics::physical_value_product_t = physical_value_product< T, U >::type
 
template<convex_space C, physical_unit FromUnit, physical_unit ToUnit>
using sequoia::physics::conversion_space_t = conversion_space< C, FromUnit, ToUnit >::type
 
template<convex_space ValueSpace, physical_unit Unit>
using sequoia::physics::default_validator_t = std::conditional_t< affine_space< ValueSpace >, std::identity, typename Unit::validator_type >
 
template<physical_unit Unit, class Rep >
using sequoia::physics::default_space_t = default_space< Unit, Rep >::type
 
template<std::floating_point Rep, class Arena >
using sequoia::physics::temperature_space = relaxed_space< absolute_temperature_space< Rep, Arena > >
 
template<class Validator >
using sequoia::physics::scale_invariant_validator_t = scale_invariant_validator< Validator >::type
 
template<class Validator >
using sequoia::physics::translation_invariant_validator_t = translation_invariant_validator< Validator >::type
 
template<class... Ts>
using sequoia::physics::product_t = product< Ts... >::type
 
template<class T >
using sequoia::physics::inverse_t = inverse< T >::type
 
template<class T >
using sequoia::physics::synthesised_validator_t = synthesised_validator< T >::type
 
template<class T >
using sequoia::physics::is_coordinate_transform_t = is_coordinate_transform< T >::type
 
template<physical_unit U>
using sequoia::physics::root_transform_t = root_transform< U >::transform_type
 
template<physical_unit U>
using sequoia::physics::root_transform_unit_t = root_transform< U >::units_type
 
template<class T >
using sequoia::physics::has_identity_dilatation_t = has_identity_dilatation< T >::type
 
template<class T >
using sequoia::physics::has_identity_translation_t = has_identity_translation< T >::type
 
using sequoia::physics::si::milligram_t = micro< si::units::kilogram_t >
 
using sequoia::physics::si::gram_t = milli< si::units::kilogram_t >
 
using sequoia::physics::si::tonne_t = kilo< si::units::kilogram_t >
 
using sequoia::physics::si::kilotonne_t = mega< si::units::kilogram_t >
 
template<std::floating_point T, class Arena = implicit_common_arena>
using sequoia::physics::mass = physical_value< mass_space< T, Arena >, units::kilogram_t >
 
template<std::floating_point T, class Arena = implicit_common_arena>
using sequoia::physics::length = physical_value< length_space< T, Arena >, units::metre_t >
 
template<std::floating_point T, class Arena = implicit_common_arena>
using sequoia::physics::time_interval = physical_value< time_interval_space< T, Arena >, units::second_t >
 
template<std::floating_point T, class Arena = implicit_common_arena>
using sequoia::physics::temperature = physical_value< absolute_temperature_space< T, Arena >, units::kelvin_t >
 
template<std::floating_point T, class Arena = implicit_common_arena>
using sequoia::physics::temperature_celsius = physical_value< temperature_space< T, Arena >, units::celsius_t >
 
template<std::floating_point T, class Arena = implicit_common_arena>
using sequoia::physics::electrical_current = physical_value< electrical_current_space< T, Arena >, units::ampere_t >
 
template<std::floating_point T, class Arena = implicit_common_arena>
using sequoia::physics::angle = physical_value< angular_space< T, Arena >, units::radian_t >
 
template<std::floating_point T, class Arena = implicit_common_arena>
using sequoia::physics::width = physical_value< width_space< T, Arena >, units::metre_t >
 
template<std::floating_point T, class Arena = implicit_common_arena>
using sequoia::physics::height = physical_value< height_space< T, Arena >, units::metre_t >
 
template<std::floating_point T, class Arena = implicit_common_arena, class Origin = implicit_affine_origin<time_space<T, Arena>>>
using sequoia::physics::time = physical_value< time_space< T, Arena >, units::second_t, unit_defined_right_handed_basis< free_module_type_of_t< time_space< T, Arena > >, units::second_t >, Origin, std::identity >
 
template<std::floating_point T, std::size_t D, class Arena = implicit_common_arena, basis_for< free_module_type_of_t< position_space< T, D, Arena > > > Basis = unit_defined_right_handed_basis<free_module_type_of_t<position_space<T, D, Arena>>, units::metre_t>, class Origin = implicit_affine_origin<position_space<T, D, Arena>>>
using sequoia::physics::position = physical_value< position_space< T, D, Arena >, units::metre_t, Basis, Origin, std::identity >
 
template<std::floating_point T, class Arena = implicit_common_arena>
using sequoia::physics::temperature_farenheight = physical_value< temperature_space< T, Arena >, units::farenheight_t >
 
template<physical_unit Unit, class Rep , class Validator = typename Unit::validator_type>
using sequoia::physics::quantity = physical_value< default_space_t< Unit, Rep >, Unit, unit_defined_right_handed_basis< free_module_type_of_t< default_space_t< Unit, Rep > >, Unit >, to_origin_type_t< default_space_t< Unit, Rep >, Unit >, Validator >
 
template<convex_space ValueSpace, physical_unit Unit, validator_for< ValueSpace > Validator = typename Unit::validator_type>
using sequoia::physics::dimensionless_quantity = physical_value< ValueSpace, Unit, unit_defined_right_handed_basis< free_module_type_of_t< ValueSpace >, Unit >, to_origin_type_t< ValueSpace, Unit >, Validator >
 
template<std::floating_point Rep, class Arena = implicit_common_arena>
using sequoia::physics::euclidean_1d_vector_quantity = dimensionless_quantity< euclidean_vector_space< Rep, 1, Arena >, no_unit_t, std::identity >
 
template<std::floating_point Rep, class Arena = implicit_common_arena>
using sequoia::physics::euclidean_half_line_quantity = dimensionless_quantity< euclidean_half_space< Rep, Arena >, no_unit_t >
 

Functions

template<physical_unit LHS, physical_unit RHS>
constexpr auto sequoia::physics::operator* (LHS, RHS) noexcept
 
template<physical_unit LHS>
constexpr auto sequoia::physics::operator* (LHS lhs, no_unit_t) noexcept
 
template<physical_unit RHS>
requires (!std::same_as<RHS, no_unit_t>)
constexpr auto sequoia::physics::operator* (no_unit_t, RHS rhs) noexcept
 
template<physical_unit LHS, physical_unit RHS>
constexpr auto sequoia::physics::operator/ (LHS, RHS) noexcept
 
template<physical_unit LHS>
constexpr auto sequoia::physics::operator/ (LHS lhs, no_unit_t) noexcept
 
template<physical_unit RHS>
requires (!std::same_as<RHS, no_unit_t>)
constexpr auto sequoia::physics::operator/ (no_unit_t, RHS) noexcept
 
template<class T , physical_unit U>
requires has_default_space_v<U, T>
 sequoia::physics::physical_value (T, U) -> physical_value< default_space_t< U, T >, U >
 
template<vector_space ValueSpace, physical_unit Unit, class Basis , class Origin , validator_for< ValueSpace > Validator>
requires (dimension_of<ValueSpace> == 1)
constexpr physical_value< ValueSpace, Unit, Basis, Origin, Validator > sequoia::physics::abs (physical_value< ValueSpace, Unit, Basis, Origin, Validator > q)
 
template<std::floating_point T, class Arena = implicit_common_arena>
constexpr T sequoia::physics::sin (physical_value< angular_space< T, Arena >, si::units::radian_t > theta)
 
template<std::floating_point T, class Arena = implicit_common_arena>
constexpr T sequoia::physics::cos (physical_value< angular_space< T, Arena >, si::units::radian_t > theta)
 
template<std::floating_point T, class Arena = implicit_common_arena>
constexpr T sequoia::physics::tan (physical_value< angular_space< T, Arena >, si::units::radian_t > theta)
 
template<class Arena = implicit_common_arena, std::floating_point T>
constexpr physical_value< angular_space< T, Arena >, si::units::radian_t > sequoia::physics::asin (T x)
 
template<class Arena = implicit_common_arena, std::floating_point T>
constexpr physical_value< angular_space< T, Arena >, si::units::radian_t > sequoia::physics::acos (T x)
 
template<class Arena = implicit_common_arena, std::floating_point T>
constexpr physical_value< angular_space< T, Arena >, si::units::radian_t > sequoia::physics::atan (T x)
 

Variables

template<class T >
constexpr bool sequoia::physics::has_reciprocal_validator_v
 
constexpr no_unit_t sequoia::physics::no_unit {}
 
template<convex_space ValueSpace, validator_for< ValueSpace > Validator>
constexpr bool sequoia::physics::has_consistent_validator
 
template<convex_space ValueSpace>
constexpr bool sequoia::physics::has_consistent_space
 
template<class T >
constexpr bool sequoia::physics::has_base_space_v
 
template<convex_space T, convex_space U>
constexpr bool sequoia::physics::have_compatible_base_spaces_v
 
template<basis Basis1, basis Basis2>
constexpr bool sequoia::physics::consistent_bases_v {consistent_bases<Basis1, Basis2>::value}
 
template<class From , class To >
constexpr bool sequoia::physics::has_quantity_conversion_v
 
template<class Rep , class... Args>
constexpr bool sequoia::physics::is_valid_physical_value_pack_v {is_valid_physical_value_pack<Rep, Args...>::value}
 
template<physical_unit Unit, class Rep >
constexpr bool sequoia::physics::has_default_space_v
 
template<physical_unit U>
constexpr bool sequoia::physics::has_symbol_v
 
template<class Validator >
constexpr bool sequoia::physics::scale_invariant_validator_v {scale_invariant_validator<Validator>::value}
 
template<class Validator >
constexpr bool sequoia::physics::translation_invariant_validator_v {translation_invariant_validator<Validator>::value}
 
template<class T >
constexpr bool sequoia::physics::is_coordinate_transform_v {is_coordinate_transform<T>::value}
 
template<physical_unit U>
constexpr bool sequoia::physics::has_coordinate_transform_v
 
template<physical_unit U>
constexpr bool sequoia::physics::derives_from_another_unit_v
 
template<class T >
constexpr bool sequoia::physics::has_identity_dilatation_v {has_identity_dilatation<T>::value}
 
template<class T >
constexpr bool sequoia::physics::has_identity_translation_v {has_identity_translation<T>::value}
 
constexpr ampere_t sequoia::physics::si::ampere {}
 
constexpr kilogram_t sequoia::physics::si::kilogram {}
 
constexpr metre_t sequoia::physics::si::metre {}
 
constexpr second_t sequoia::physics::si::second {}
 
constexpr kelvin_t sequoia::physics::si::kelvin {}
 
constexpr coulomb_t sequoia::physics::si::coulomb {}
 
constexpr radian_t sequoia::physics::si::radian {}
 
constexpr celsius_t sequoia::physics::si::celsius {}
 
constexpr milligram_t sequoia::physics::si::milligram {}
 
constexpr gram_t sequoia::physics::si::gram {}
 
constexpr tonne_t sequoia::physics::si::tonne {}
 
constexpr kilotonne_t sequoia::physics::si::kilotonne {}
 
constexpr degree_t sequoia::physics::non_si::degree {}
 
constexpr gradian_t sequoia::physics::non_si::gradian {}
 
constexpr farenheight_t sequoia::physics::non_si::farenheight {}
 
constexpr foot_t sequoia::physics::non_si::foot {}
 

Variable Documentation

◆ derives_from_another_unit_v

template<physical_unit U>
constexpr bool sequoia::physics::derives_from_another_unit_v
inlineconstexpr
Initial value:
{
requires {
typename U::with_respect_to_type;
}
}
Definition: PhysicalValuesDetails.hpp:44

◆ has_base_space_v

template<class T >
constexpr bool sequoia::physics::has_base_space_v
inlineconstexpr
Initial value:
{
requires { typename T::base_space; }
}

◆ has_consistent_space

template<convex_space ValueSpace>
constexpr bool sequoia::physics::has_consistent_space
inlineconstexpr
Initial value:
{
(!is_dual_v<ValueSpace>) || vector_space<ValueSpace> || (!affine_space<ValueSpace>)
}

◆ has_consistent_validator

template<convex_space ValueSpace, validator_for< ValueSpace > Validator>
constexpr bool sequoia::physics::has_consistent_validator
inlineconstexpr
Initial value:
{
!affine_space<ValueSpace> || defines_identity_validator_v<Validator>
}

◆ has_coordinate_transform_v

template<physical_unit U>
constexpr bool sequoia::physics::has_coordinate_transform_v
inlineconstexpr
Initial value:
{
requires {
typename U::transform_type;
requires is_coordinate_transform_v<typename U::transform_type>;
}
}

◆ has_default_space_v

template<physical_unit Unit, class Rep >
constexpr bool sequoia::physics::has_default_space_v
inlineconstexpr
Initial value:
{
requires {
typename default_space_t<Unit, Rep>;
}
}

◆ has_quantity_conversion_v

template<class From , class To >
constexpr bool sequoia::physics::has_quantity_conversion_v
inlineconstexpr
Initial value:
{
has_coordinate_transformation_v<From, To> && std::constructible_from<coordinate_transformation<From, To>>
}

◆ has_reciprocal_validator_v

template<class T >
constexpr bool sequoia::physics::has_reciprocal_validator_v
inlineconstexpr
Initial value:
{
requires { typename reciprocal_validator_t<T>; }
}

◆ has_symbol_v

template<physical_unit U>
constexpr bool sequoia::physics::has_symbol_v
inlineconstexpr
Initial value:
{
requires {
{ U::symbol } -> std::convertible_to<std::string_view>; }
}

◆ have_compatible_base_spaces_v

template<convex_space T, convex_space U>
constexpr bool sequoia::physics::have_compatible_base_spaces_v
inlineconstexpr
Initial value:
{
has_base_space_v<T> && has_base_space_v<U> && (free_module_type_of_t<T>::dimension == free_module_type_of_t<U>::dimension) && requires {
typename std::common_type<typename T::base_space, typename U::base_space>::type;
}
}