annotate libcxx/include/ratio @ 252:1f2b6ac9f198 llvm-original

LLVM16-1
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Aug 2023 09:04:13 +0900
parents c4bab56944e8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // -*- C++ -*-
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
2 //===----------------------------------------------------------------------===//
150
anatofuz
parents:
diff changeset
3 //
anatofuz
parents:
diff changeset
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
5 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
7 //
anatofuz
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
9
anatofuz
parents:
diff changeset
10 #ifndef _LIBCPP_RATIO
anatofuz
parents:
diff changeset
11 #define _LIBCPP_RATIO
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 /*
anatofuz
parents:
diff changeset
14 ratio synopsis
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 namespace std
anatofuz
parents:
diff changeset
17 {
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 template <intmax_t N, intmax_t D = 1>
anatofuz
parents:
diff changeset
20 class ratio
anatofuz
parents:
diff changeset
21 {
anatofuz
parents:
diff changeset
22 public:
anatofuz
parents:
diff changeset
23 static constexpr intmax_t num;
anatofuz
parents:
diff changeset
24 static constexpr intmax_t den;
anatofuz
parents:
diff changeset
25 typedef ratio<num, den> type;
anatofuz
parents:
diff changeset
26 };
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 // ratio arithmetic
anatofuz
parents:
diff changeset
29 template <class R1, class R2> using ratio_add = ...;
anatofuz
parents:
diff changeset
30 template <class R1, class R2> using ratio_subtract = ...;
anatofuz
parents:
diff changeset
31 template <class R1, class R2> using ratio_multiply = ...;
anatofuz
parents:
diff changeset
32 template <class R1, class R2> using ratio_divide = ...;
anatofuz
parents:
diff changeset
33
anatofuz
parents:
diff changeset
34 // ratio comparison
anatofuz
parents:
diff changeset
35 template <class R1, class R2> struct ratio_equal;
anatofuz
parents:
diff changeset
36 template <class R1, class R2> struct ratio_not_equal;
anatofuz
parents:
diff changeset
37 template <class R1, class R2> struct ratio_less;
anatofuz
parents:
diff changeset
38 template <class R1, class R2> struct ratio_less_equal;
anatofuz
parents:
diff changeset
39 template <class R1, class R2> struct ratio_greater;
anatofuz
parents:
diff changeset
40 template <class R1, class R2> struct ratio_greater_equal;
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 // convenience SI typedefs
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
43 using quecto = ratio <1, 1'000'000'000'000'000'000'000'000'000'000>; // Since C++26; not supported
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
44 using ronto = ratio <1, 1'000'000'000'000'000'000'000'000'000>; // Since C++26; not supported
150
anatofuz
parents:
diff changeset
45 typedef ratio<1, 1000000000000000000000000> yocto; // not supported
anatofuz
parents:
diff changeset
46 typedef ratio<1, 1000000000000000000000> zepto; // not supported
anatofuz
parents:
diff changeset
47 typedef ratio<1, 1000000000000000000> atto;
anatofuz
parents:
diff changeset
48 typedef ratio<1, 1000000000000000> femto;
anatofuz
parents:
diff changeset
49 typedef ratio<1, 1000000000000> pico;
anatofuz
parents:
diff changeset
50 typedef ratio<1, 1000000000> nano;
anatofuz
parents:
diff changeset
51 typedef ratio<1, 1000000> micro;
anatofuz
parents:
diff changeset
52 typedef ratio<1, 1000> milli;
anatofuz
parents:
diff changeset
53 typedef ratio<1, 100> centi;
anatofuz
parents:
diff changeset
54 typedef ratio<1, 10> deci;
anatofuz
parents:
diff changeset
55 typedef ratio< 10, 1> deca;
anatofuz
parents:
diff changeset
56 typedef ratio< 100, 1> hecto;
anatofuz
parents:
diff changeset
57 typedef ratio< 1000, 1> kilo;
anatofuz
parents:
diff changeset
58 typedef ratio< 1000000, 1> mega;
anatofuz
parents:
diff changeset
59 typedef ratio< 1000000000, 1> giga;
anatofuz
parents:
diff changeset
60 typedef ratio< 1000000000000, 1> tera;
anatofuz
parents:
diff changeset
61 typedef ratio< 1000000000000000, 1> peta;
anatofuz
parents:
diff changeset
62 typedef ratio< 1000000000000000000, 1> exa;
anatofuz
parents:
diff changeset
63 typedef ratio< 1000000000000000000000, 1> zetta; // not supported
anatofuz
parents:
diff changeset
64 typedef ratio<1000000000000000000000000, 1> yotta; // not supported
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
65 using ronna = ratio <1'000'000'000'000'000'000'000'000'000, 1>; // Since C++26; not supported
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
66 using quetta = ratio <1'000'000'000'000'000'000'000'000'000'000, 1>; // Since C++26; not supported
150
anatofuz
parents:
diff changeset
67
anatofuz
parents:
diff changeset
68 // 20.11.5, ratio comparison
anatofuz
parents:
diff changeset
69 template <class R1, class R2> inline constexpr bool ratio_equal_v
anatofuz
parents:
diff changeset
70 = ratio_equal<R1, R2>::value; // C++17
anatofuz
parents:
diff changeset
71 template <class R1, class R2> inline constexpr bool ratio_not_equal_v
anatofuz
parents:
diff changeset
72 = ratio_not_equal<R1, R2>::value; // C++17
anatofuz
parents:
diff changeset
73 template <class R1, class R2> inline constexpr bool ratio_less_v
anatofuz
parents:
diff changeset
74 = ratio_less<R1, R2>::value; // C++17
anatofuz
parents:
diff changeset
75 template <class R1, class R2> inline constexpr bool ratio_less_equal_v
anatofuz
parents:
diff changeset
76 = ratio_less_equal<R1, R2>::value; // C++17
anatofuz
parents:
diff changeset
77 template <class R1, class R2> inline constexpr bool ratio_greater_v
anatofuz
parents:
diff changeset
78 = ratio_greater<R1, R2>::value; // C++17
anatofuz
parents:
diff changeset
79 template <class R1, class R2> inline constexpr bool ratio_greater_equal_v
anatofuz
parents:
diff changeset
80 = ratio_greater_equal<R1, R2>::value; // C++17
anatofuz
parents:
diff changeset
81 }
anatofuz
parents:
diff changeset
82 */
anatofuz
parents:
diff changeset
83
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
84 #include <__assert> // all public C++ headers provide the assertion handler
150
anatofuz
parents:
diff changeset
85 #include <__config>
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
86 #include <__type_traits/integral_constant.h>
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
87 #include <climits>
150
anatofuz
parents:
diff changeset
88 #include <cstdint>
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
89 #include <version>
150
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
92 # pragma GCC system_header
150
anatofuz
parents:
diff changeset
93 #endif
anatofuz
parents:
diff changeset
94
anatofuz
parents:
diff changeset
95 _LIBCPP_PUSH_MACROS
anatofuz
parents:
diff changeset
96 #include <__undef_macros>
anatofuz
parents:
diff changeset
97
anatofuz
parents:
diff changeset
98
anatofuz
parents:
diff changeset
99 _LIBCPP_BEGIN_NAMESPACE_STD
anatofuz
parents:
diff changeset
100
anatofuz
parents:
diff changeset
101 // __static_gcd
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103 template <intmax_t _Xp, intmax_t _Yp>
anatofuz
parents:
diff changeset
104 struct __static_gcd
anatofuz
parents:
diff changeset
105 {
anatofuz
parents:
diff changeset
106 static const intmax_t value = __static_gcd<_Yp, _Xp % _Yp>::value;
anatofuz
parents:
diff changeset
107 };
anatofuz
parents:
diff changeset
108
anatofuz
parents:
diff changeset
109 template <intmax_t _Xp>
anatofuz
parents:
diff changeset
110 struct __static_gcd<_Xp, 0>
anatofuz
parents:
diff changeset
111 {
anatofuz
parents:
diff changeset
112 static const intmax_t value = _Xp;
anatofuz
parents:
diff changeset
113 };
anatofuz
parents:
diff changeset
114
anatofuz
parents:
diff changeset
115 template <>
anatofuz
parents:
diff changeset
116 struct __static_gcd<0, 0>
anatofuz
parents:
diff changeset
117 {
anatofuz
parents:
diff changeset
118 static const intmax_t value = 1;
anatofuz
parents:
diff changeset
119 };
anatofuz
parents:
diff changeset
120
anatofuz
parents:
diff changeset
121 // __static_lcm
anatofuz
parents:
diff changeset
122
anatofuz
parents:
diff changeset
123 template <intmax_t _Xp, intmax_t _Yp>
anatofuz
parents:
diff changeset
124 struct __static_lcm
anatofuz
parents:
diff changeset
125 {
anatofuz
parents:
diff changeset
126 static const intmax_t value = _Xp / __static_gcd<_Xp, _Yp>::value * _Yp;
anatofuz
parents:
diff changeset
127 };
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 template <intmax_t _Xp>
anatofuz
parents:
diff changeset
130 struct __static_abs
anatofuz
parents:
diff changeset
131 {
anatofuz
parents:
diff changeset
132 static const intmax_t value = _Xp < 0 ? -_Xp : _Xp;
anatofuz
parents:
diff changeset
133 };
anatofuz
parents:
diff changeset
134
anatofuz
parents:
diff changeset
135 template <intmax_t _Xp>
anatofuz
parents:
diff changeset
136 struct __static_sign
anatofuz
parents:
diff changeset
137 {
anatofuz
parents:
diff changeset
138 static const intmax_t value = _Xp == 0 ? 0 : (_Xp < 0 ? -1 : 1);
anatofuz
parents:
diff changeset
139 };
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 template <intmax_t _Xp, intmax_t _Yp, intmax_t = __static_sign<_Yp>::value>
anatofuz
parents:
diff changeset
142 class __ll_add;
anatofuz
parents:
diff changeset
143
anatofuz
parents:
diff changeset
144 template <intmax_t _Xp, intmax_t _Yp>
anatofuz
parents:
diff changeset
145 class __ll_add<_Xp, _Yp, 1>
anatofuz
parents:
diff changeset
146 {
anatofuz
parents:
diff changeset
147 static const intmax_t min = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1;
anatofuz
parents:
diff changeset
148 static const intmax_t max = -min;
anatofuz
parents:
diff changeset
149
anatofuz
parents:
diff changeset
150 static_assert(_Xp <= max - _Yp, "overflow in __ll_add");
anatofuz
parents:
diff changeset
151 public:
anatofuz
parents:
diff changeset
152 static const intmax_t value = _Xp + _Yp;
anatofuz
parents:
diff changeset
153 };
anatofuz
parents:
diff changeset
154
anatofuz
parents:
diff changeset
155 template <intmax_t _Xp, intmax_t _Yp>
anatofuz
parents:
diff changeset
156 class __ll_add<_Xp, _Yp, 0>
anatofuz
parents:
diff changeset
157 {
anatofuz
parents:
diff changeset
158 public:
anatofuz
parents:
diff changeset
159 static const intmax_t value = _Xp;
anatofuz
parents:
diff changeset
160 };
anatofuz
parents:
diff changeset
161
anatofuz
parents:
diff changeset
162 template <intmax_t _Xp, intmax_t _Yp>
anatofuz
parents:
diff changeset
163 class __ll_add<_Xp, _Yp, -1>
anatofuz
parents:
diff changeset
164 {
anatofuz
parents:
diff changeset
165 static const intmax_t min = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1;
anatofuz
parents:
diff changeset
166 static const intmax_t max = -min;
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168 static_assert(min - _Yp <= _Xp, "overflow in __ll_add");
anatofuz
parents:
diff changeset
169 public:
anatofuz
parents:
diff changeset
170 static const intmax_t value = _Xp + _Yp;
anatofuz
parents:
diff changeset
171 };
anatofuz
parents:
diff changeset
172
anatofuz
parents:
diff changeset
173 template <intmax_t _Xp, intmax_t _Yp, intmax_t = __static_sign<_Yp>::value>
anatofuz
parents:
diff changeset
174 class __ll_sub;
anatofuz
parents:
diff changeset
175
anatofuz
parents:
diff changeset
176 template <intmax_t _Xp, intmax_t _Yp>
anatofuz
parents:
diff changeset
177 class __ll_sub<_Xp, _Yp, 1>
anatofuz
parents:
diff changeset
178 {
anatofuz
parents:
diff changeset
179 static const intmax_t min = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1;
anatofuz
parents:
diff changeset
180 static const intmax_t max = -min;
anatofuz
parents:
diff changeset
181
anatofuz
parents:
diff changeset
182 static_assert(min + _Yp <= _Xp, "overflow in __ll_sub");
anatofuz
parents:
diff changeset
183 public:
anatofuz
parents:
diff changeset
184 static const intmax_t value = _Xp - _Yp;
anatofuz
parents:
diff changeset
185 };
anatofuz
parents:
diff changeset
186
anatofuz
parents:
diff changeset
187 template <intmax_t _Xp, intmax_t _Yp>
anatofuz
parents:
diff changeset
188 class __ll_sub<_Xp, _Yp, 0>
anatofuz
parents:
diff changeset
189 {
anatofuz
parents:
diff changeset
190 public:
anatofuz
parents:
diff changeset
191 static const intmax_t value = _Xp;
anatofuz
parents:
diff changeset
192 };
anatofuz
parents:
diff changeset
193
anatofuz
parents:
diff changeset
194 template <intmax_t _Xp, intmax_t _Yp>
anatofuz
parents:
diff changeset
195 class __ll_sub<_Xp, _Yp, -1>
anatofuz
parents:
diff changeset
196 {
anatofuz
parents:
diff changeset
197 static const intmax_t min = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1;
anatofuz
parents:
diff changeset
198 static const intmax_t max = -min;
anatofuz
parents:
diff changeset
199
anatofuz
parents:
diff changeset
200 static_assert(_Xp <= max + _Yp, "overflow in __ll_sub");
anatofuz
parents:
diff changeset
201 public:
anatofuz
parents:
diff changeset
202 static const intmax_t value = _Xp - _Yp;
anatofuz
parents:
diff changeset
203 };
anatofuz
parents:
diff changeset
204
anatofuz
parents:
diff changeset
205 template <intmax_t _Xp, intmax_t _Yp>
anatofuz
parents:
diff changeset
206 class __ll_mul
anatofuz
parents:
diff changeset
207 {
anatofuz
parents:
diff changeset
208 static const intmax_t nan = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1));
anatofuz
parents:
diff changeset
209 static const intmax_t min = nan + 1;
anatofuz
parents:
diff changeset
210 static const intmax_t max = -min;
anatofuz
parents:
diff changeset
211 static const intmax_t __a_x = __static_abs<_Xp>::value;
anatofuz
parents:
diff changeset
212 static const intmax_t __a_y = __static_abs<_Yp>::value;
anatofuz
parents:
diff changeset
213
anatofuz
parents:
diff changeset
214 static_assert(_Xp != nan && _Yp != nan && __a_x <= max / __a_y, "overflow in __ll_mul");
anatofuz
parents:
diff changeset
215 public:
anatofuz
parents:
diff changeset
216 static const intmax_t value = _Xp * _Yp;
anatofuz
parents:
diff changeset
217 };
anatofuz
parents:
diff changeset
218
anatofuz
parents:
diff changeset
219 template <intmax_t _Yp>
anatofuz
parents:
diff changeset
220 class __ll_mul<0, _Yp>
anatofuz
parents:
diff changeset
221 {
anatofuz
parents:
diff changeset
222 public:
anatofuz
parents:
diff changeset
223 static const intmax_t value = 0;
anatofuz
parents:
diff changeset
224 };
anatofuz
parents:
diff changeset
225
anatofuz
parents:
diff changeset
226 template <intmax_t _Xp>
anatofuz
parents:
diff changeset
227 class __ll_mul<_Xp, 0>
anatofuz
parents:
diff changeset
228 {
anatofuz
parents:
diff changeset
229 public:
anatofuz
parents:
diff changeset
230 static const intmax_t value = 0;
anatofuz
parents:
diff changeset
231 };
anatofuz
parents:
diff changeset
232
anatofuz
parents:
diff changeset
233 template <>
anatofuz
parents:
diff changeset
234 class __ll_mul<0, 0>
anatofuz
parents:
diff changeset
235 {
anatofuz
parents:
diff changeset
236 public:
anatofuz
parents:
diff changeset
237 static const intmax_t value = 0;
anatofuz
parents:
diff changeset
238 };
anatofuz
parents:
diff changeset
239
anatofuz
parents:
diff changeset
240 // Not actually used but left here in case needed in future maintenance
anatofuz
parents:
diff changeset
241 template <intmax_t _Xp, intmax_t _Yp>
anatofuz
parents:
diff changeset
242 class __ll_div
anatofuz
parents:
diff changeset
243 {
anatofuz
parents:
diff changeset
244 static const intmax_t nan = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1));
anatofuz
parents:
diff changeset
245 static const intmax_t min = nan + 1;
anatofuz
parents:
diff changeset
246 static const intmax_t max = -min;
anatofuz
parents:
diff changeset
247
anatofuz
parents:
diff changeset
248 static_assert(_Xp != nan && _Yp != nan && _Yp != 0, "overflow in __ll_div");
anatofuz
parents:
diff changeset
249 public:
anatofuz
parents:
diff changeset
250 static const intmax_t value = _Xp / _Yp;
anatofuz
parents:
diff changeset
251 };
anatofuz
parents:
diff changeset
252
anatofuz
parents:
diff changeset
253 template <intmax_t _Num, intmax_t _Den = 1>
anatofuz
parents:
diff changeset
254 class _LIBCPP_TEMPLATE_VIS ratio
anatofuz
parents:
diff changeset
255 {
anatofuz
parents:
diff changeset
256 static_assert(__static_abs<_Num>::value >= 0, "ratio numerator is out of range");
anatofuz
parents:
diff changeset
257 static_assert(_Den != 0, "ratio divide by 0");
anatofuz
parents:
diff changeset
258 static_assert(__static_abs<_Den>::value > 0, "ratio denominator is out of range");
anatofuz
parents:
diff changeset
259 static _LIBCPP_CONSTEXPR const intmax_t __na = __static_abs<_Num>::value;
anatofuz
parents:
diff changeset
260 static _LIBCPP_CONSTEXPR const intmax_t __da = __static_abs<_Den>::value;
anatofuz
parents:
diff changeset
261 static _LIBCPP_CONSTEXPR const intmax_t __s = __static_sign<_Num>::value * __static_sign<_Den>::value;
anatofuz
parents:
diff changeset
262 static _LIBCPP_CONSTEXPR const intmax_t __gcd = __static_gcd<__na, __da>::value;
anatofuz
parents:
diff changeset
263 public:
anatofuz
parents:
diff changeset
264 static _LIBCPP_CONSTEXPR const intmax_t num = __s * __na / __gcd;
anatofuz
parents:
diff changeset
265 static _LIBCPP_CONSTEXPR const intmax_t den = __da / __gcd;
anatofuz
parents:
diff changeset
266
anatofuz
parents:
diff changeset
267 typedef ratio<num, den> type;
anatofuz
parents:
diff changeset
268 };
anatofuz
parents:
diff changeset
269
anatofuz
parents:
diff changeset
270 template <intmax_t _Num, intmax_t _Den>
anatofuz
parents:
diff changeset
271 _LIBCPP_CONSTEXPR const intmax_t ratio<_Num, _Den>::num;
anatofuz
parents:
diff changeset
272
anatofuz
parents:
diff changeset
273 template <intmax_t _Num, intmax_t _Den>
anatofuz
parents:
diff changeset
274 _LIBCPP_CONSTEXPR const intmax_t ratio<_Num, _Den>::den;
anatofuz
parents:
diff changeset
275
anatofuz
parents:
diff changeset
276 template <class _Tp> struct __is_ratio : false_type {};
anatofuz
parents:
diff changeset
277 template <intmax_t _Num, intmax_t _Den> struct __is_ratio<ratio<_Num, _Den> > : true_type {};
anatofuz
parents:
diff changeset
278
anatofuz
parents:
diff changeset
279 typedef ratio<1LL, 1000000000000000000LL> atto;
anatofuz
parents:
diff changeset
280 typedef ratio<1LL, 1000000000000000LL> femto;
anatofuz
parents:
diff changeset
281 typedef ratio<1LL, 1000000000000LL> pico;
anatofuz
parents:
diff changeset
282 typedef ratio<1LL, 1000000000LL> nano;
anatofuz
parents:
diff changeset
283 typedef ratio<1LL, 1000000LL> micro;
anatofuz
parents:
diff changeset
284 typedef ratio<1LL, 1000LL> milli;
anatofuz
parents:
diff changeset
285 typedef ratio<1LL, 100LL> centi;
anatofuz
parents:
diff changeset
286 typedef ratio<1LL, 10LL> deci;
anatofuz
parents:
diff changeset
287 typedef ratio< 10LL, 1LL> deca;
anatofuz
parents:
diff changeset
288 typedef ratio< 100LL, 1LL> hecto;
anatofuz
parents:
diff changeset
289 typedef ratio< 1000LL, 1LL> kilo;
anatofuz
parents:
diff changeset
290 typedef ratio< 1000000LL, 1LL> mega;
anatofuz
parents:
diff changeset
291 typedef ratio< 1000000000LL, 1LL> giga;
anatofuz
parents:
diff changeset
292 typedef ratio< 1000000000000LL, 1LL> tera;
anatofuz
parents:
diff changeset
293 typedef ratio< 1000000000000000LL, 1LL> peta;
anatofuz
parents:
diff changeset
294 typedef ratio<1000000000000000000LL, 1LL> exa;
anatofuz
parents:
diff changeset
295
anatofuz
parents:
diff changeset
296 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
297 struct __ratio_multiply
anatofuz
parents:
diff changeset
298 {
anatofuz
parents:
diff changeset
299 private:
anatofuz
parents:
diff changeset
300 static const intmax_t __gcd_n1_d2 = __static_gcd<_R1::num, _R2::den>::value;
anatofuz
parents:
diff changeset
301 static const intmax_t __gcd_d1_n2 = __static_gcd<_R1::den, _R2::num>::value;
anatofuz
parents:
diff changeset
302 public:
anatofuz
parents:
diff changeset
303 typedef typename ratio
anatofuz
parents:
diff changeset
304 <
anatofuz
parents:
diff changeset
305 __ll_mul<_R1::num / __gcd_n1_d2, _R2::num / __gcd_d1_n2>::value,
anatofuz
parents:
diff changeset
306 __ll_mul<_R2::den / __gcd_n1_d2, _R1::den / __gcd_d1_n2>::value
anatofuz
parents:
diff changeset
307 >::type type;
anatofuz
parents:
diff changeset
308 };
anatofuz
parents:
diff changeset
309
anatofuz
parents:
diff changeset
310 #ifndef _LIBCPP_CXX03_LANG
anatofuz
parents:
diff changeset
311
anatofuz
parents:
diff changeset
312 template <class _R1, class _R2> using ratio_multiply
anatofuz
parents:
diff changeset
313 = typename __ratio_multiply<_R1, _R2>::type;
anatofuz
parents:
diff changeset
314
anatofuz
parents:
diff changeset
315 #else // _LIBCPP_CXX03_LANG
anatofuz
parents:
diff changeset
316
anatofuz
parents:
diff changeset
317 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
318 struct _LIBCPP_TEMPLATE_VIS ratio_multiply
anatofuz
parents:
diff changeset
319 : public __ratio_multiply<_R1, _R2>::type {};
anatofuz
parents:
diff changeset
320
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
321 #endif // _LIBCPP_CXX03_LANG
150
anatofuz
parents:
diff changeset
322
anatofuz
parents:
diff changeset
323 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
324 struct __ratio_divide
anatofuz
parents:
diff changeset
325 {
anatofuz
parents:
diff changeset
326 private:
anatofuz
parents:
diff changeset
327 static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value;
anatofuz
parents:
diff changeset
328 static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value;
anatofuz
parents:
diff changeset
329 public:
anatofuz
parents:
diff changeset
330 typedef typename ratio
anatofuz
parents:
diff changeset
331 <
anatofuz
parents:
diff changeset
332 __ll_mul<_R1::num / __gcd_n1_n2, _R2::den / __gcd_d1_d2>::value,
anatofuz
parents:
diff changeset
333 __ll_mul<_R2::num / __gcd_n1_n2, _R1::den / __gcd_d1_d2>::value
anatofuz
parents:
diff changeset
334 >::type type;
anatofuz
parents:
diff changeset
335 };
anatofuz
parents:
diff changeset
336
anatofuz
parents:
diff changeset
337 #ifndef _LIBCPP_CXX03_LANG
anatofuz
parents:
diff changeset
338
anatofuz
parents:
diff changeset
339 template <class _R1, class _R2> using ratio_divide
anatofuz
parents:
diff changeset
340 = typename __ratio_divide<_R1, _R2>::type;
anatofuz
parents:
diff changeset
341
anatofuz
parents:
diff changeset
342 #else // _LIBCPP_CXX03_LANG
anatofuz
parents:
diff changeset
343
anatofuz
parents:
diff changeset
344 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
345 struct _LIBCPP_TEMPLATE_VIS ratio_divide
anatofuz
parents:
diff changeset
346 : public __ratio_divide<_R1, _R2>::type {};
anatofuz
parents:
diff changeset
347
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
348 #endif // _LIBCPP_CXX03_LANG
150
anatofuz
parents:
diff changeset
349
anatofuz
parents:
diff changeset
350 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
351 struct __ratio_add
anatofuz
parents:
diff changeset
352 {
anatofuz
parents:
diff changeset
353 private:
anatofuz
parents:
diff changeset
354 static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value;
anatofuz
parents:
diff changeset
355 static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value;
anatofuz
parents:
diff changeset
356 public:
anatofuz
parents:
diff changeset
357 typedef typename ratio_multiply
anatofuz
parents:
diff changeset
358 <
anatofuz
parents:
diff changeset
359 ratio<__gcd_n1_n2, _R1::den / __gcd_d1_d2>,
anatofuz
parents:
diff changeset
360 ratio
anatofuz
parents:
diff changeset
361 <
anatofuz
parents:
diff changeset
362 __ll_add
anatofuz
parents:
diff changeset
363 <
anatofuz
parents:
diff changeset
364 __ll_mul<_R1::num / __gcd_n1_n2, _R2::den / __gcd_d1_d2>::value,
anatofuz
parents:
diff changeset
365 __ll_mul<_R2::num / __gcd_n1_n2, _R1::den / __gcd_d1_d2>::value
anatofuz
parents:
diff changeset
366 >::value,
anatofuz
parents:
diff changeset
367 _R2::den
anatofuz
parents:
diff changeset
368 >
anatofuz
parents:
diff changeset
369 >::type type;
anatofuz
parents:
diff changeset
370 };
anatofuz
parents:
diff changeset
371
anatofuz
parents:
diff changeset
372 #ifndef _LIBCPP_CXX03_LANG
anatofuz
parents:
diff changeset
373
anatofuz
parents:
diff changeset
374 template <class _R1, class _R2> using ratio_add
anatofuz
parents:
diff changeset
375 = typename __ratio_add<_R1, _R2>::type;
anatofuz
parents:
diff changeset
376
anatofuz
parents:
diff changeset
377 #else // _LIBCPP_CXX03_LANG
anatofuz
parents:
diff changeset
378
anatofuz
parents:
diff changeset
379 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
380 struct _LIBCPP_TEMPLATE_VIS ratio_add
anatofuz
parents:
diff changeset
381 : public __ratio_add<_R1, _R2>::type {};
anatofuz
parents:
diff changeset
382
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
383 #endif // _LIBCPP_CXX03_LANG
150
anatofuz
parents:
diff changeset
384
anatofuz
parents:
diff changeset
385 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
386 struct __ratio_subtract
anatofuz
parents:
diff changeset
387 {
anatofuz
parents:
diff changeset
388 private:
anatofuz
parents:
diff changeset
389 static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value;
anatofuz
parents:
diff changeset
390 static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value;
anatofuz
parents:
diff changeset
391 public:
anatofuz
parents:
diff changeset
392 typedef typename ratio_multiply
anatofuz
parents:
diff changeset
393 <
anatofuz
parents:
diff changeset
394 ratio<__gcd_n1_n2, _R1::den / __gcd_d1_d2>,
anatofuz
parents:
diff changeset
395 ratio
anatofuz
parents:
diff changeset
396 <
anatofuz
parents:
diff changeset
397 __ll_sub
anatofuz
parents:
diff changeset
398 <
anatofuz
parents:
diff changeset
399 __ll_mul<_R1::num / __gcd_n1_n2, _R2::den / __gcd_d1_d2>::value,
anatofuz
parents:
diff changeset
400 __ll_mul<_R2::num / __gcd_n1_n2, _R1::den / __gcd_d1_d2>::value
anatofuz
parents:
diff changeset
401 >::value,
anatofuz
parents:
diff changeset
402 _R2::den
anatofuz
parents:
diff changeset
403 >
anatofuz
parents:
diff changeset
404 >::type type;
anatofuz
parents:
diff changeset
405 };
anatofuz
parents:
diff changeset
406
anatofuz
parents:
diff changeset
407 #ifndef _LIBCPP_CXX03_LANG
anatofuz
parents:
diff changeset
408
anatofuz
parents:
diff changeset
409 template <class _R1, class _R2> using ratio_subtract
anatofuz
parents:
diff changeset
410 = typename __ratio_subtract<_R1, _R2>::type;
anatofuz
parents:
diff changeset
411
anatofuz
parents:
diff changeset
412 #else // _LIBCPP_CXX03_LANG
anatofuz
parents:
diff changeset
413
anatofuz
parents:
diff changeset
414 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
415 struct _LIBCPP_TEMPLATE_VIS ratio_subtract
anatofuz
parents:
diff changeset
416 : public __ratio_subtract<_R1, _R2>::type {};
anatofuz
parents:
diff changeset
417
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
418 #endif // _LIBCPP_CXX03_LANG
150
anatofuz
parents:
diff changeset
419
anatofuz
parents:
diff changeset
420 // ratio_equal
anatofuz
parents:
diff changeset
421
anatofuz
parents:
diff changeset
422 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
423 struct _LIBCPP_TEMPLATE_VIS ratio_equal
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
424 : _BoolConstant<(_R1::num == _R2::num && _R1::den == _R2::den)> {};
150
anatofuz
parents:
diff changeset
425
anatofuz
parents:
diff changeset
426 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
427 struct _LIBCPP_TEMPLATE_VIS ratio_not_equal
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
428 : _BoolConstant<!ratio_equal<_R1, _R2>::value> {};
150
anatofuz
parents:
diff changeset
429
anatofuz
parents:
diff changeset
430 // ratio_less
anatofuz
parents:
diff changeset
431
anatofuz
parents:
diff changeset
432 template <class _R1, class _R2, bool _Odd = false,
anatofuz
parents:
diff changeset
433 intmax_t _Q1 = _R1::num / _R1::den, intmax_t _M1 = _R1::num % _R1::den,
anatofuz
parents:
diff changeset
434 intmax_t _Q2 = _R2::num / _R2::den, intmax_t _M2 = _R2::num % _R2::den>
anatofuz
parents:
diff changeset
435 struct __ratio_less1
anatofuz
parents:
diff changeset
436 {
anatofuz
parents:
diff changeset
437 static const bool value = _Odd ? _Q2 < _Q1 : _Q1 < _Q2;
anatofuz
parents:
diff changeset
438 };
anatofuz
parents:
diff changeset
439
anatofuz
parents:
diff changeset
440 template <class _R1, class _R2, bool _Odd, intmax_t _Qp>
anatofuz
parents:
diff changeset
441 struct __ratio_less1<_R1, _R2, _Odd, _Qp, 0, _Qp, 0>
anatofuz
parents:
diff changeset
442 {
anatofuz
parents:
diff changeset
443 static const bool value = false;
anatofuz
parents:
diff changeset
444 };
anatofuz
parents:
diff changeset
445
anatofuz
parents:
diff changeset
446 template <class _R1, class _R2, bool _Odd, intmax_t _Qp, intmax_t _M2>
anatofuz
parents:
diff changeset
447 struct __ratio_less1<_R1, _R2, _Odd, _Qp, 0, _Qp, _M2>
anatofuz
parents:
diff changeset
448 {
anatofuz
parents:
diff changeset
449 static const bool value = !_Odd;
anatofuz
parents:
diff changeset
450 };
anatofuz
parents:
diff changeset
451
anatofuz
parents:
diff changeset
452 template <class _R1, class _R2, bool _Odd, intmax_t _Qp, intmax_t _M1>
anatofuz
parents:
diff changeset
453 struct __ratio_less1<_R1, _R2, _Odd, _Qp, _M1, _Qp, 0>
anatofuz
parents:
diff changeset
454 {
anatofuz
parents:
diff changeset
455 static const bool value = _Odd;
anatofuz
parents:
diff changeset
456 };
anatofuz
parents:
diff changeset
457
anatofuz
parents:
diff changeset
458 template <class _R1, class _R2, bool _Odd, intmax_t _Qp, intmax_t _M1,
anatofuz
parents:
diff changeset
459 intmax_t _M2>
anatofuz
parents:
diff changeset
460 struct __ratio_less1<_R1, _R2, _Odd, _Qp, _M1, _Qp, _M2>
anatofuz
parents:
diff changeset
461 {
anatofuz
parents:
diff changeset
462 static const bool value = __ratio_less1<ratio<_R1::den, _M1>,
anatofuz
parents:
diff changeset
463 ratio<_R2::den, _M2>, !_Odd>::value;
anatofuz
parents:
diff changeset
464 };
anatofuz
parents:
diff changeset
465
anatofuz
parents:
diff changeset
466 template <class _R1, class _R2, intmax_t _S1 = __static_sign<_R1::num>::value,
anatofuz
parents:
diff changeset
467 intmax_t _S2 = __static_sign<_R2::num>::value>
anatofuz
parents:
diff changeset
468 struct __ratio_less
anatofuz
parents:
diff changeset
469 {
anatofuz
parents:
diff changeset
470 static const bool value = _S1 < _S2;
anatofuz
parents:
diff changeset
471 };
anatofuz
parents:
diff changeset
472
anatofuz
parents:
diff changeset
473 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
474 struct __ratio_less<_R1, _R2, 1LL, 1LL>
anatofuz
parents:
diff changeset
475 {
anatofuz
parents:
diff changeset
476 static const bool value = __ratio_less1<_R1, _R2>::value;
anatofuz
parents:
diff changeset
477 };
anatofuz
parents:
diff changeset
478
anatofuz
parents:
diff changeset
479 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
480 struct __ratio_less<_R1, _R2, -1LL, -1LL>
anatofuz
parents:
diff changeset
481 {
anatofuz
parents:
diff changeset
482 static const bool value = __ratio_less1<ratio<-_R2::num, _R2::den>, ratio<-_R1::num, _R1::den> >::value;
anatofuz
parents:
diff changeset
483 };
anatofuz
parents:
diff changeset
484
anatofuz
parents:
diff changeset
485 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
486 struct _LIBCPP_TEMPLATE_VIS ratio_less
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
487 : _BoolConstant<__ratio_less<_R1, _R2>::value> {};
150
anatofuz
parents:
diff changeset
488
anatofuz
parents:
diff changeset
489 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
490 struct _LIBCPP_TEMPLATE_VIS ratio_less_equal
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
491 : _BoolConstant<!ratio_less<_R2, _R1>::value> {};
150
anatofuz
parents:
diff changeset
492
anatofuz
parents:
diff changeset
493 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
494 struct _LIBCPP_TEMPLATE_VIS ratio_greater
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
495 : _BoolConstant<ratio_less<_R2, _R1>::value> {};
150
anatofuz
parents:
diff changeset
496
anatofuz
parents:
diff changeset
497 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
498 struct _LIBCPP_TEMPLATE_VIS ratio_greater_equal
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
499 : _BoolConstant<!ratio_less<_R1, _R2>::value> {};
150
anatofuz
parents:
diff changeset
500
anatofuz
parents:
diff changeset
501 template <class _R1, class _R2>
anatofuz
parents:
diff changeset
502 struct __ratio_gcd
anatofuz
parents:
diff changeset
503 {
anatofuz
parents:
diff changeset
504 typedef ratio<__static_gcd<_R1::num, _R2::num>::value,
anatofuz
parents:
diff changeset
505 __static_lcm<_R1::den, _R2::den>::value> type;
anatofuz
parents:
diff changeset
506 };
anatofuz
parents:
diff changeset
507
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
508 #if _LIBCPP_STD_VER >= 17
150
anatofuz
parents:
diff changeset
509 template <class _R1, class _R2>
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
510 inline constexpr bool ratio_equal_v = ratio_equal<_R1, _R2>::value;
150
anatofuz
parents:
diff changeset
511
anatofuz
parents:
diff changeset
512 template <class _R1, class _R2>
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
513 inline constexpr bool ratio_not_equal_v = ratio_not_equal<_R1, _R2>::value;
150
anatofuz
parents:
diff changeset
514
anatofuz
parents:
diff changeset
515 template <class _R1, class _R2>
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
516 inline constexpr bool ratio_less_v = ratio_less<_R1, _R2>::value;
150
anatofuz
parents:
diff changeset
517
anatofuz
parents:
diff changeset
518 template <class _R1, class _R2>
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
519 inline constexpr bool ratio_less_equal_v = ratio_less_equal<_R1, _R2>::value;
150
anatofuz
parents:
diff changeset
520
anatofuz
parents:
diff changeset
521 template <class _R1, class _R2>
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
522 inline constexpr bool ratio_greater_v = ratio_greater<_R1, _R2>::value;
150
anatofuz
parents:
diff changeset
523
anatofuz
parents:
diff changeset
524 template <class _R1, class _R2>
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
525 inline constexpr bool ratio_greater_equal_v = ratio_greater_equal<_R1, _R2>::value;
150
anatofuz
parents:
diff changeset
526 #endif
anatofuz
parents:
diff changeset
527
anatofuz
parents:
diff changeset
528 _LIBCPP_END_NAMESPACE_STD
anatofuz
parents:
diff changeset
529
anatofuz
parents:
diff changeset
530 _LIBCPP_POP_MACROS
anatofuz
parents:
diff changeset
531
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
532 #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
533 # include <type_traits>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
534 #endif
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
535
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
536 #endif // _LIBCPP_RATIO