STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Macros | Functions
decimal.h File Reference

Go to the source code of this file.

Macros

#define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, _T2)
 
#define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, _T2)
 
#define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(_Op1, _Op2, _T1)
 
#define _DEFINE_DECIMAL_UNARY_OP(_Op, _Tp)
 
#define _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(_Op, _T1, _T2, _T3)
 
#define _DEFINE_DECIMAL_BINARY_OP_BOTH(_Op, _T1, _T2, _T3)
 
#define _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, _T2)
 
#define _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, _T2)
 
#define _DEFINE_DECIMAL_BINARY_OP_WITH_INT(_Op, _T1)
 
#define _DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _T1, _T2)
 
#define _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _T1, _T2)
 
#define _DEFINE_DECIMAL_COMPARISON_RHS(_Op, _T1, _T2)
 
#define _DEFINE_DECIMAL_COMPARISONS(_Op, _Tp)
 

Functions

namespace std _GLIBCXX_VISIBILITY (default)
 

Detailed Description

This is an internal header file, included by other library headers. Do not attempt to use it directly. {decimal}

Macro Definition Documentation

#define _DEFINE_DECIMAL_BINARY_OP_BOTH (   _Op,
  _T1,
  _T2,
  _T3 
)
Value:
inline _T1 operator _Op(_T2 __lhs, _T3 __rhs) \
{ \
_T1 __retval; \
__retval.__setval(__lhs.__getval() _Op __rhs.__getval()); \
return __retval; \
}
return(unsigned int) __res
#define _DEFINE_DECIMAL_BINARY_OP_LHS (   _Op,
  _T1,
  _T2 
)
Value:
inline _T1 operator _Op(_T1 __lhs, _T2 __rhs) \
{ \
_T1 __retval; \
__retval.__setval(__lhs.__getval() _Op __rhs); \
return __retval; \
}
return(unsigned int) __res
#define _DEFINE_DECIMAL_BINARY_OP_RHS (   _Op,
  _T1,
  _T2 
)
Value:
inline _T1 operator _Op(_T2 __lhs, _T1 __rhs) \
{ \
_T1 __retval; \
__retval.__setval(__lhs _Op __rhs.__getval()); \
return __retval; \
}
return(unsigned int) __res
#define _DEFINE_DECIMAL_BINARY_OP_WITH_DEC (   _Op,
  _T1,
  _T2,
  _T3 
)
Value:
inline _T1 operator _Op(_T2 __lhs, _T3 __rhs) \
{ \
_T1 __retval; \
__retval.__setval(__lhs.__getval() _Op __rhs.__getval()); \
return __retval; \
}
return(unsigned int) __res
#define _DEFINE_DECIMAL_BINARY_OP_WITH_INT (   _Op,
  _T1 
)
Value:
_DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, unsigned int); \
_DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, unsigned long); \
_DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, long long); \
_DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, unsigned long long); \
_DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, unsigned int); \
_DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, unsigned long); \
_DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, long long); \
_DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, unsigned long long); \
#define _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, _T2)
#define _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, _T2)
#define _DEFINE_DECIMAL_COMPARISON_BOTH (   _Op,
  _T1,
  _T2 
)
Value:
inline bool operator _Op(_T1 __lhs, _T2 __rhs) \
{ return __lhs.__getval() _Op __rhs.__getval(); }
#define _DEFINE_DECIMAL_COMPARISON_LHS (   _Op,
  _T1,
  _T2 
)
Value:
inline bool operator _Op(_T1 __lhs, _T2 __rhs) \
{ return __lhs.__getval() _Op __rhs; }
#define _DEFINE_DECIMAL_COMPARISON_RHS (   _Op,
  _T1,
  _T2 
)
Value:
inline bool operator _Op(_T1 __lhs, _T2 __rhs) \
{ return __lhs _Op __rhs.__getval(); }
#define _DEFINE_DECIMAL_COMPARISONS (   _Op,
  _Tp 
)
Value:
_DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _Tp, decimal32) \
_DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _Tp, decimal64) \
_DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _Tp, decimal128) \
_DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, unsigned int) \
_DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, unsigned long) \
_DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, long long) \
_DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, unsigned long long) \
_DEFINE_DECIMAL_COMPARISON_RHS(_Op, unsigned int, _Tp) \
_DEFINE_DECIMAL_COMPARISON_RHS(_Op, unsigned long, _Tp) \
_DEFINE_DECIMAL_COMPARISON_RHS(_Op, long long, _Tp) \
_DEFINE_DECIMAL_COMPARISON_RHS(_Op, unsigned long long, _Tp)
#define _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _T1, _T2)
#define _DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _T1, _T2)
#define _DEFINE_DECIMAL_COMPARISON_RHS(_Op, _T1, _T2)
#define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC (   _Op1,
  _Op2,
  _T1,
  _T2 
)
Value:
inline _T1& _T1::operator _Op1(_T2 __rhs) \
{ \
__setval(__getval() _Op2 __rhs.__getval()); \
return *this; \
}
return(unsigned int) __res
#define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT (   _Op1,
  _Op2,
  _T1,
  _T2 
)
Value:
inline _T1& _T1::operator _Op1(_T2 __rhs) \
{ \
__setval(__getval() _Op2 __rhs); \
return *this; \
}
return(unsigned int) __res
#define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS (   _Op1,
  _Op2,
  _T1 
)
Value:
_DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, decimal32) \
_DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, decimal64) \
_DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, decimal128) \
_DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, unsigned int) \
_DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, unsigned long)\
_DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, long long) \
_DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, unsigned long long)
#define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, _T2)
#define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, _T2)
#define _DEFINE_DECIMAL_UNARY_OP (   _Op,
  _Tp 
)
Value:
inline _Tp operator _Op(_Tp __rhs) \
{ \
_Tp __tmp; \
__tmp.__setval(_Op __rhs.__getval()); \
return __tmp; \
}
return(unsigned int) __res

Function Documentation

namespace std _GLIBCXX_VISIBILITY ( default  )
39 {
40 namespace decimal
41 {
42  _GLIBCXX_BEGIN_NAMESPACE_VERSION
43 
44  // ISO/IEC TR 24733 3.2.[234].1 Construct/copy/destroy.
45 
46  inline decimal32::decimal32(decimal64 __r) : __val(__r.__getval()) {}
47  inline decimal32::decimal32(decimal128 __r) : __val(__r.__getval()) {}
48  inline decimal64::decimal64(decimal32 __r) : __val(__r.__getval()) {}
49  inline decimal64::decimal64(decimal128 __r) : __val(__r.__getval()) {}
50  inline decimal128::decimal128(decimal32 __r) : __val(__r.__getval()) {}
51  inline decimal128::decimal128(decimal64 __r) : __val(__r.__getval()) {}
52 
53  // ISO/IEC TR 24733 3.2.[234].6 Compound assignment.
54 
55 #define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, _T2) \
56  inline _T1& _T1::operator _Op1(_T2 __rhs) \
57  { \
58  __setval(__getval() _Op2 __rhs.__getval()); \
59  return *this; \
60  }
61 
62 #define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, _T2) \
63  inline _T1& _T1::operator _Op1(_T2 __rhs) \
64  { \
65  __setval(__getval() _Op2 __rhs); \
66  return *this; \
67  }
68 
69 #define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(_Op1, _Op2, _T1) \
70  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, decimal32) \
71  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, decimal64) \
72  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, decimal128) \
73  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, int) \
74  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, unsigned int) \
75  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, long) \
76  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, unsigned long)\
77  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, long long) \
78  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, unsigned long long)
79 
80  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(+=, +, decimal32)
81  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(-=, -, decimal32)
82  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(*=, *, decimal32)
83  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(/=, /, decimal32)
84 
85  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(+=, +, decimal64)
86  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(-=, -, decimal64)
87  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(*=, *, decimal64)
88  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(/=, /, decimal64)
89 
90  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(+=, +, decimal128)
91  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(-=, -, decimal128)
92  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(*=, *, decimal128)
93  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(/=, /, decimal128)
94 
95 #undef _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC
96 #undef _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT
97 #undef _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS
98 
99  // Extension: Conversion to integral type.
100 
101  inline long long decimal32_to_long_long(decimal32 __d)
102  { return (long long)__d.__getval(); }
103 
104  inline long long decimal64_to_long_long(decimal64 __d)
105  { return (long long)__d.__getval(); }
106 
107  inline long long decimal128_to_long_long(decimal128 __d)
108  { return (long long)__d.__getval(); }
109 
110  inline long long decimal_to_long_long(decimal32 __d)
111  { return (long long)__d.__getval(); }
112 
113  inline long long decimal_to_long_long(decimal64 __d)
114  { return (long long)__d.__getval(); }
115 
116  inline long long decimal_to_long_long(decimal128 __d)
117  { return (long long)__d.__getval(); }
118 
119  // ISO/IEC TR 24733 3.2.5 Initialization from coefficient and exponent.
120 
121  static decimal32 make_decimal32(long long __coeff, int __exponent)
122  {
123  decimal32 __decexp = 1, __multiplier;
124 
125  if (__exponent < 0)
126  {
127  __multiplier = 1.E-1DF;
128  __exponent = -__exponent;
129  }
130  else
131  __multiplier = 1.E1DF;
132 
133  for (int __i = 0; __i < __exponent; ++__i)
134  __decexp *= __multiplier;
135 
136  return __coeff * __decexp;
137  }
138 
139  static decimal32 make_decimal32(unsigned long long __coeff, int __exponent)
140  {
141  decimal32 __decexp = 1, __multiplier;
142 
143  if (__exponent < 0)
144  {
145  __multiplier = 1.E-1DF;
146  __exponent = -__exponent;
147  }
148  else
149  __multiplier = 1.E1DF;
150 
151  for (int __i = 0; __i < __exponent; ++__i)
152  __decexp *= __multiplier;
153 
154  return __coeff * __decexp;
155  }
156 
157  static decimal64 make_decimal64(long long __coeff, int __exponent)
158  {
159  decimal64 __decexp = 1, __multiplier;
160 
161  if (__exponent < 0)
162  {
163  __multiplier = 1.E-1DD;
164  __exponent = -__exponent;
165  }
166  else
167  __multiplier = 1.E1DD;
168 
169  for (int __i = 0; __i < __exponent; ++__i)
170  __decexp *= __multiplier;
171 
172  return __coeff * __decexp;
173  }
174 
175  static decimal64 make_decimal64(unsigned long long __coeff, int __exponent)
176  {
177  decimal64 __decexp = 1, __multiplier;
178 
179  if (__exponent < 0)
180  {
181  __multiplier = 1.E-1DD;
182  __exponent = -__exponent;
183  }
184  else
185  __multiplier = 1.E1DD;
186 
187  for (int __i = 0; __i < __exponent; ++__i)
188  __decexp *= __multiplier;
189 
190  return __coeff * __decexp;
191  }
192 
193  static decimal128 make_decimal128(long long __coeff, int __exponent)
194  {
195  decimal128 __decexp = 1, __multiplier;
196 
197  if (__exponent < 0)
198  {
199  __multiplier = 1.E-1DL;
200  __exponent = -__exponent;
201  }
202  else
203  __multiplier = 1.E1DL;
204 
205  for (int __i = 0; __i < __exponent; ++__i)
206  __decexp *= __multiplier;
207 
208  return __coeff * __decexp;
209  }
210 
211  static decimal128 make_decimal128(unsigned long long __coeff, int __exponent)
212  {
213  decimal128 __decexp = 1, __multiplier;
214 
215  if (__exponent < 0)
216  {
217  __multiplier = 1.E-1DL;
218  __exponent = -__exponent;
219  }
220  else
221  __multiplier = 1.E1DL;
222 
223  for (int __i = 0; __i < __exponent; ++__i)
224  __decexp *= __multiplier;
225 
226  return __coeff * __decexp;
227  }
228 
229  // ISO/IEC TR 24733 3.2.6 Conversion to generic floating-point type.
230 
231  inline float decimal32_to_float(decimal32 __d)
232  { return (float)__d.__getval(); }
233 
234  inline float decimal64_to_float(decimal64 __d)
235  { return (float)__d.__getval(); }
236 
237  inline float decimal128_to_float(decimal128 __d)
238  { return (float)__d.__getval(); }
239 
240  inline float decimal_to_float(decimal32 __d)
241  { return (float)__d.__getval(); }
242 
243  inline float decimal_to_float(decimal64 __d)
244  { return (float)__d.__getval(); }
245 
246  inline float decimal_to_float(decimal128 __d)
247  { return (float)__d.__getval(); }
248 
249  inline double decimal32_to_double(decimal32 __d)
250  { return (double)__d.__getval(); }
251 
252  inline double decimal64_to_double(decimal64 __d)
253  { return (double)__d.__getval(); }
254 
255  inline double decimal128_to_double(decimal128 __d)
256  { return (double)__d.__getval(); }
257 
258  inline double decimal_to_double(decimal32 __d)
259  { return (double)__d.__getval(); }
260 
261  inline double decimal_to_double(decimal64 __d)
262  { return (double)__d.__getval(); }
263 
264  inline double decimal_to_double(decimal128 __d)
265  { return (double)__d.__getval(); }
266 
267  inline long double decimal32_to_long_double(decimal32 __d)
268  { return (long double)__d.__getval(); }
269 
270  inline long double decimal64_to_long_double(decimal64 __d)
271  { return (long double)__d.__getval(); }
272 
273  inline long double decimal128_to_long_double(decimal128 __d)
274  { return (long double)__d.__getval(); }
275 
276  inline long double decimal_to_long_double(decimal32 __d)
277  { return (long double)__d.__getval(); }
278 
279  inline long double decimal_to_long_double(decimal64 __d)
280  { return (long double)__d.__getval(); }
281 
282  inline long double decimal_to_long_double(decimal128 __d)
283  { return (long double)__d.__getval(); }
284 
285  // ISO/IEC TR 24733 3.2.7 Unary arithmetic operators.
286 
287 #define _DEFINE_DECIMAL_UNARY_OP(_Op, _Tp) \
288  inline _Tp operator _Op(_Tp __rhs) \
289  { \
290  _Tp __tmp; \
291  __tmp.__setval(_Op __rhs.__getval()); \
292  return __tmp; \
293  }
294 
295  _DEFINE_DECIMAL_UNARY_OP(+, decimal32)
296  _DEFINE_DECIMAL_UNARY_OP(+, decimal64)
297  _DEFINE_DECIMAL_UNARY_OP(+, decimal128)
298  _DEFINE_DECIMAL_UNARY_OP(-, decimal32)
299  _DEFINE_DECIMAL_UNARY_OP(-, decimal64)
300  _DEFINE_DECIMAL_UNARY_OP(-, decimal128)
301 
302 #undef _DEFINE_DECIMAL_UNARY_OP
303 
304  // ISO/IEC TR 24733 3.2.8 Binary arithmetic operators.
305 
306 #define _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(_Op, _T1, _T2, _T3) \
307  inline _T1 operator _Op(_T2 __lhs, _T3 __rhs) \
308  { \
309  _T1 __retval; \
310  __retval.__setval(__lhs.__getval() _Op __rhs.__getval()); \
311  return __retval; \
312  }
313 
314 #define _DEFINE_DECIMAL_BINARY_OP_BOTH(_Op, _T1, _T2, _T3) \
315  inline _T1 operator _Op(_T2 __lhs, _T3 __rhs) \
316  { \
317  _T1 __retval; \
318  __retval.__setval(__lhs.__getval() _Op __rhs.__getval()); \
319  return __retval; \
320  }
321 
322 #define _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, _T2) \
323  inline _T1 operator _Op(_T1 __lhs, _T2 __rhs) \
324  { \
325  _T1 __retval; \
326  __retval.__setval(__lhs.__getval() _Op __rhs); \
327  return __retval; \
328  }
329 
330 #define _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, _T2) \
331  inline _T1 operator _Op(_T2 __lhs, _T1 __rhs) \
332  { \
333  _T1 __retval; \
334  __retval.__setval(__lhs _Op __rhs.__getval()); \
335  return __retval; \
336  }
337 
338 #define _DEFINE_DECIMAL_BINARY_OP_WITH_INT(_Op, _T1) \
339  _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, int); \
340  _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, unsigned int); \
341  _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, long); \
342  _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, unsigned long); \
343  _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, long long); \
344  _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, unsigned long long); \
345  _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, int); \
346  _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, unsigned int); \
347  _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, long); \
348  _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, unsigned long); \
349  _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, long long); \
350  _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, unsigned long long); \
351 
352  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal32, decimal32, decimal32)
354  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal32, decimal64)
355  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal64, decimal32)
356  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal64, decimal64)
357  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(+, decimal64)
358  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal32, decimal128)
359  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal64, decimal128)
360  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128, decimal32)
361  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128, decimal64)
362  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128, decimal128)
363  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(+, decimal128)
364 
365  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal32, decimal32, decimal32)
366  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(-, decimal32)
367  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal32, decimal64)
368  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal64, decimal32)
369  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal64, decimal64)
370  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(-, decimal64)
371  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal32, decimal128)
372  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal64, decimal128)
373  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128, decimal32)
374  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128, decimal64)
375  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128, decimal128)
376  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(-, decimal128)
377 
378  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal32, decimal32, decimal32)
379  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(*, decimal32)
380  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal32, decimal64)
381  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal64, decimal32)
382  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal64, decimal64)
383  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(*, decimal64)
384  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal32, decimal128)
385  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal64, decimal128)
386  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128, decimal32)
387  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128, decimal64)
388  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128, decimal128)
389  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(*, decimal128)
390 
391  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal32, decimal32, decimal32)
392  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(/, decimal32)
393  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal32, decimal64)
394  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal64, decimal32)
395  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal64, decimal64)
396  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(/, decimal64)
397  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal32, decimal128)
398  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal64, decimal128)
399  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128, decimal32)
400  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128, decimal64)
401  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128, decimal128)
402  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(/, decimal128)
403 
404 #undef _DEFINE_DECIMAL_BINARY_OP_WITH_DEC
405 #undef _DEFINE_DECIMAL_BINARY_OP_BOTH
406 #undef _DEFINE_DECIMAL_BINARY_OP_LHS
407 #undef _DEFINE_DECIMAL_BINARY_OP_RHS
408 #undef _DEFINE_DECIMAL_BINARY_OP_WITH_INT
409 
410  // ISO/IEC TR 24733 3.2.9 Comparison operators.
411 
412 #define _DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _T1, _T2) \
413  inline bool operator _Op(_T1 __lhs, _T2 __rhs) \
414  { return __lhs.__getval() _Op __rhs.__getval(); }
415 
416 #define _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _T1, _T2) \
417  inline bool operator _Op(_T1 __lhs, _T2 __rhs) \
418  { return __lhs.__getval() _Op __rhs; }
419 
420 #define _DEFINE_DECIMAL_COMPARISON_RHS(_Op, _T1, _T2) \
421  inline bool operator _Op(_T1 __lhs, _T2 __rhs) \
422  { return __lhs _Op __rhs.__getval(); }
423 
424 #define _DEFINE_DECIMAL_COMPARISONS(_Op, _Tp) \
425  _DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _Tp, decimal32) \
426  _DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _Tp, decimal64) \
427  _DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _Tp, decimal128) \
428  _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, int) \
429  _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, unsigned int) \
430  _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, long) \
431  _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, unsigned long) \
432  _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, long long) \
433  _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, unsigned long long) \
434  _DEFINE_DECIMAL_COMPARISON_RHS(_Op, int, _Tp) \
435  _DEFINE_DECIMAL_COMPARISON_RHS(_Op, unsigned int, _Tp) \
436  _DEFINE_DECIMAL_COMPARISON_RHS(_Op, long, _Tp) \
437  _DEFINE_DECIMAL_COMPARISON_RHS(_Op, unsigned long, _Tp) \
438  _DEFINE_DECIMAL_COMPARISON_RHS(_Op, long long, _Tp) \
439  _DEFINE_DECIMAL_COMPARISON_RHS(_Op, unsigned long long, _Tp)
440 
441  _DEFINE_DECIMAL_COMPARISONS(==, decimal32)
442  _DEFINE_DECIMAL_COMPARISONS(==, decimal64)
443  _DEFINE_DECIMAL_COMPARISONS(==, decimal128)
444  _DEFINE_DECIMAL_COMPARISONS(!=, decimal32)
445  _DEFINE_DECIMAL_COMPARISONS(!=, decimal64)
446  _DEFINE_DECIMAL_COMPARISONS(!=, decimal128)
447  _DEFINE_DECIMAL_COMPARISONS(<, decimal32)
448  _DEFINE_DECIMAL_COMPARISONS(<, decimal64)
449  _DEFINE_DECIMAL_COMPARISONS(<, decimal128)
450  _DEFINE_DECIMAL_COMPARISONS(<=, decimal32)
451  _DEFINE_DECIMAL_COMPARISONS(<=, decimal64)
452  _DEFINE_DECIMAL_COMPARISONS(<=, decimal128)
453  _DEFINE_DECIMAL_COMPARISONS(>, decimal32)
454  _DEFINE_DECIMAL_COMPARISONS(>, decimal64)
455  _DEFINE_DECIMAL_COMPARISONS(>, decimal128)
456  _DEFINE_DECIMAL_COMPARISONS(>=, decimal32)
457  _DEFINE_DECIMAL_COMPARISONS(>=, decimal64)
458  _DEFINE_DECIMAL_COMPARISONS(>=, decimal128)
459 
460 #undef _DEFINE_DECIMAL_COMPARISON_BOTH
461 #undef _DEFINE_DECIMAL_COMPARISON_LHS
462 #undef _DEFINE_DECIMAL_COMPARISON_RHS
463 #undef _DEFINE_DECIMAL_COMPARISONS
464  _GLIBCXX_END_NAMESPACE_VERSION
465 } // namespace decimal
466 } // namespace std
#define _DEFINE_DECIMAL_UNARY_OP(_Op, _Tp)
#define _DEFINE_DECIMAL_BINARY_OP_WITH_INT(_Op, _T1)
#define _DEFINE_DECIMAL_COMPARISONS(_Op, _Tp)
#define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(_Op1, _Op2, _T1)
#define _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(_Op, _T1, _T2, _T3)