Strong dimensions support added

This commit is contained in:
Mateusz Pusz committed 2018-11-14 22:14:44 +01:00
1 parent 297b71efcf
commit 7205dc2cb9
7 files changed
+50 -17

No files matched your search

+26 -7
View File
@@ -78,10 +78,18 @@ namespace units {
template<Exponent E>
using exp_invert_t = typename exp_invert<E>::type;
// dimension_traits
template<typename T>
struct dimension_traits : std::type_identity<T> {};
template<typename T>
using dimension_traits_t = typename dimension_traits<T>::type;
// dimension
template<Exponent... Es>
struct dimension;
struct dimension : std::type_identity<dimension<Es...>> {};
// is_dimension
namespace detail {
@@ -93,7 +101,20 @@ namespace units {
} // namespace detail
template<typename T>
concept bool Dimension = detail::is_dimension<T>;
concept bool Dimension = detail::is_dimension<typename T::type>;
// dim_invert
template<Dimension E>
struct dim_invert;
template<Exponent... Es>
struct dim_invert<dimension<Es...>> : std::type_identity<dimension_traits_t<dimension<exp_invert_t<Es>...>>> {};
template<Dimension D>
using dim_invert_t = typename dim_invert<typename D::type>::type;
// make_dimension
@@ -144,12 +165,10 @@ namespace units {
struct dimension_multiply;
template<Exponent... E1, Exponent... E2>
struct dimension_multiply<dimension<E1...>, dimension<E2...>> {
using type = make_dimension_t<E1..., E2...>;
};
struct dimension_multiply<dimension<E1...>, dimension<E2...>> : std::type_identity<dimension_traits_t<make_dimension_t<E1..., E2...>>> {};
template<Dimension D1, Dimension D2>
using dimension_multiply_t = typename dimension_multiply<D1, D2>::type;
using dimension_multiply_t = typename dimension_multiply<typename D1::type, typename D2::type>::type;
// dimension_divide
@@ -162,6 +181,6 @@ namespace units {
};
template<Dimension D1, Dimension D2>
using dimension_divide_t = typename dimension_divide<D1, D2>::type;
using dimension_divide_t = typename dimension_divide<typename D1::type, typename D2::type>::type;
} // namespace units