36 export template <
typename U_FROM,
typename U_TO,
typename T>
39 export template <
typename S_FROM,
typename S_TO>
43 template <
typename Expr>
48 template <
typename Expr>
51 template <
typename Scale>
56 template <
typename Scale>
67 template <
typename...>
70 template <
typename N,
typename D>
73 template <
typename...>
76 template <
typename... Args>
82 template <
typename...>
85 template <
typename... Args>
99 concept has_scale =
requires {
typename S::scale; };
102 template <
typename S>
106 template <
typename Mul,
typename CancelProduct>
107 using cancel_out =
typename packtl::take_one_out<CancelProduct, Mul>::type;
109 template <
typename...>
110 struct cancel_out_many {};
112 template <
typename Mul,
typename CP>
113 struct cancel_out_many<Mul, CP> {
114 using type = cancel_out<Mul, CP>;
117 template <
typename Mul,
typename CP1,
typename... CancelProducts>
118 struct cancel_out_many<Mul, CP1, CancelProducts...> {
120 using cancelled =
typename packtl::take_one_out<CP1, Mul>::type;
121 using cancelled_many = std::conditional_t<
122 (
sizeof...(CancelProducts) > 1),
123 cancel_out_many<cancelled, CancelProducts...>,
124 packtl::take_one_out<
typename packtl::get_first<CancelProducts...>::type, cancelled>>;
127 conditional_t<
sizeof...(CancelProducts) == 0, cancelled,
typename cancelled_many::type>;
133 template <
typename Mul,
template <
typename...>
typename Pack,
typename... CancelProducts>
134 struct cancel_out_many<Mul, Pack<CancelProducts...>> {
135 using type =
typename cancel_out_many<Mul, CancelProducts...>::type;
138 template <
typename M>
143 template <
typename M>
144 using normalize_t =
typename normalize<M>::type;
147 template <
typename M,
typename...>
148 struct normalize_impl {
152 template <
typename M>
153 using normalize_impl_t =
typename normalize_impl<M>::type;
155 template <
typename Num,
typename Den,
typename... Ps>
156 struct normalize_impl<
mul<
frac<Num, Den>, Ps...>> {
157 using type = frac<normalize_t<mul<Ps..., Num>>, Den>;
160 template <
typename P1,
typename... Ps>
162 struct normalize_impl<
mul<P1, Ps...>> {
163 using type = normalize_impl_t<
mul<Ps..., P1>>;
167 template <
typename... Ps>
168 struct normalize<
mul<Ps...>> {
169 using type = normalize_impl_t<
typename packtl::flatten<mul<Ps...>>::type>;
Predicate that checks if a type defines a scale for itself.
Core components of the Quantify library.
typename reduce_impl< Expr >::type reduce
constexpr bool has_scale_v
See has_scale.
Static representation of a numerical ratio in the form of a fraction.