Quantify
An extensible C++ units library
Loading...
Searching...
No Matches
reduce_rules.cppm
Go to the documentation of this file.
1// Copyright (c) 2024-2025, Víctor Castillo Agüero.
2// SPDX-License-Identifier: Apache-2.0
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16module;
17
18#define TO(...) \
19{ \
20 using type = __VA_ARGS__; \
21}
22
23#define REDUCE_PATTERN(...) struct reduce_impl<__VA_ARGS__>
24
25export module quantify.core:reduce_rules;
26import std;
27import :preface;
28
29export namespace quantify {
30 template <typename N>
32
33 template <>
35
36 template <typename N>
38
39
40 template<typename N, typename D>
41 requires (!is_frac_v<N>)
43
44 template<typename N, typename D1, typename D2>
45 requires (!is_frac_v<N>)
47
48 template<typename N, typename D>
50
51 template<typename N, typename D>
52 requires (!is_frac_v<N>)
54
55 template<typename N, typename D1, typename D2>
56 requires (!is_frac_v<N>)
58
59 template<typename N1, typename N2, typename D1, typename D2>
60 requires (!std::is_same_v<N1, D1> || !std::is_same_v<N2, D2>)
61 REDUCE_PATTERN(frac<frac<N1, N2>, frac<D1, D2>>) TO(reduce<frac<reduce<mul<reduce<N1>, reduce<D2>>>, reduce<mul<reduce<D1>,reduce<N2>>>>>);
62
63
64 template <typename N, typename ...Ds>
65 requires (packtl::Contains<N, Ds...>)
66 REDUCE_PATTERN(frac<N, mul<Ds...>>) TO(reduce<frac<no_unit, reduce<cancel_out<reduce<mul<Ds...>>, N>>>>);
67
68 // template <typename N, typename ...Ds>
69 // requires (!packtl::Contains<N, Ds...> && !is_mul_v<N> && !is_frac_v<N>)
70 // REDUCE_PATTERN(frac<N, mul<Ds...>>) TO(reduce<frac<reduce<N>, reduce<mul<Ds...>>>>);
71 //
72 template <typename D, typename ...Ns>
73 requires (packtl::Contains<D, Ns...>)
74 REDUCE_PATTERN(frac<mul<Ns...>, D>) TO(reduce<cancel_out<reduce<mul<Ns...>>, D>>);
75
76 // template <typename D, typename ...Ns>
77 // requires (!packtl::Contains<D, Ns...> && !is_mul_v<D> && !is_frac_v<D>)
78 // REDUCE_PATTERN(frac<mul<Ns...>, D>) TO(reduce<frac<reduce<mul<Ns...>>, reduce<D>>>);
79 //
80 template <typename M1, typename M2>
81 requires (is_mul_v<M1> && is_mul_v<M2> && !packtl::share_items<M1, M2>::value)
83
84 template <typename M1, typename M2>
85 requires (is_mul_v<M1> && is_mul_v<M2> && packtl::share_items<M1, M2>::value)
86 REDUCE_PATTERN(frac<M1, M2>) TO(reduce<frac<reduce<typename cancel_out_many<M1, M2>::type>, reduce<typename cancel_out_many<M2,M1>::type>>>);
87
88
89 template <>
91
92 template <typename P>
94
95 template <typename ...Ps>
96 requires (!packtl::Contains<no_unit, Ps...> && ((!is_mul_v<Ps> && !is_frac_v<Ps>) && ...))
97 REDUCE_PATTERN(mul<Ps...>) TO(mul<Ps...>);
98
99 template <typename ...Ps>
100 requires (!packtl::Contains<no_unit, Ps...> && ((is_mul_v<Ps> || is_frac_v<Ps>) || ...))
101 REDUCE_PATTERN(mul<Ps...>) TO(reduce<normalize_t<mul<Ps...>>>);
102
103 template <typename ...Ps>
104 requires packtl::Contains<no_unit, Ps...>
105 REDUCE_PATTERN(mul<Ps...>) TO(reduce<cancel_out<mul<Ps...>, no_unit>>);
106
107}
Core components of the Quantify library.
REDUCE_PATTERN(frac< N, N >) TO(no_unit)
constexpr bool is_mul_v
Definition preface.cppm:80
constexpr bool is_frac_v
Definition preface.cppm:89
typename reduce_impl< Expr >::type reduce
Definition preface.cppm:49
#define TO(...)
#define REDUCE_PATTERN(...)