1*e4b17023SJohn Marino// <decimal> -*- C++ -*-
2*e4b17023SJohn Marino
3*e4b17023SJohn Marino// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
4*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library.  This library is free
5*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the
6*e4b17023SJohn Marino// terms of the GNU General Public License as published by the
7*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option)
8*e4b17023SJohn Marino// any later version.
9*e4b17023SJohn Marino
10*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful,
11*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of
12*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*e4b17023SJohn Marino// GNU General Public License for more details.
14*e4b17023SJohn Marino
15*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional
16*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version
17*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation.
18*e4b17023SJohn Marino
19*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and
20*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program;
21*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
22*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>.
23*e4b17023SJohn Marino
24*e4b17023SJohn Marino/** @file decimal/decimal
25*e4b17023SJohn Marino *  This is a Standard C++ Library header.
26*e4b17023SJohn Marino */
27*e4b17023SJohn Marino
28*e4b17023SJohn Marino// ISO/IEC TR 24733
29*e4b17023SJohn Marino// Written by Janis Johnson <janis187@us.ibm.com>
30*e4b17023SJohn Marino
31*e4b17023SJohn Marino#ifndef _GLIBCXX_DECIMAL
32*e4b17023SJohn Marino#define _GLIBCXX_DECIMAL 1
33*e4b17023SJohn Marino
34*e4b17023SJohn Marino#pragma GCC system_header
35*e4b17023SJohn Marino
36*e4b17023SJohn Marino#include <bits/c++config.h>
37*e4b17023SJohn Marino
38*e4b17023SJohn Marino#ifndef _GLIBCXX_USE_DECIMAL_FLOAT
39*e4b17023SJohn Marino#error This file requires compiler and library support for ISO/IEC TR 24733 \
40*e4b17023SJohn Marinothat is currently not available.
41*e4b17023SJohn Marino#endif
42*e4b17023SJohn Marino
43*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default)
44*e4b17023SJohn Marino{
45*e4b17023SJohn Marino  /**
46*e4b17023SJohn Marino    * @defgroup decimal Decimal Floating-Point Arithmetic
47*e4b17023SJohn Marino    * @ingroup numerics
48*e4b17023SJohn Marino    *
49*e4b17023SJohn Marino    * Classes and functions for decimal floating-point arithmetic.
50*e4b17023SJohn Marino    * @{
51*e4b17023SJohn Marino    */
52*e4b17023SJohn Marino
53*e4b17023SJohn Marino  /** @namespace std::decimal
54*e4b17023SJohn Marino    * @brief ISO/IEC TR 24733 Decimal floating-point arithmetic.
55*e4b17023SJohn Marino    */
56*e4b17023SJohn Marinonamespace decimal
57*e4b17023SJohn Marino{
58*e4b17023SJohn Marino  _GLIBCXX_BEGIN_NAMESPACE_VERSION
59*e4b17023SJohn Marino
60*e4b17023SJohn Marino  class decimal32;
61*e4b17023SJohn Marino  class decimal64;
62*e4b17023SJohn Marino  class decimal128;
63*e4b17023SJohn Marino
64*e4b17023SJohn Marino  // 3.2.5  Initialization from coefficient and exponent.
65*e4b17023SJohn Marino  static decimal32 make_decimal32(long long __coeff, int __exp);
66*e4b17023SJohn Marino  static decimal32 make_decimal32(unsigned long long __coeff, int __exp);
67*e4b17023SJohn Marino  static decimal64 make_decimal64(long long __coeff, int __exp);
68*e4b17023SJohn Marino  static decimal64 make_decimal64(unsigned long long __coeff, int __exp);
69*e4b17023SJohn Marino  static decimal128 make_decimal128(long long __coeff, int __exp);
70*e4b17023SJohn Marino  static decimal128 make_decimal128(unsigned long long __coeff, int __exp);
71*e4b17023SJohn Marino
72*e4b17023SJohn Marino  /// Non-conforming extension: Conversion to integral type.
73*e4b17023SJohn Marino  long long decimal32_to_long_long(decimal32 __d);
74*e4b17023SJohn Marino  long long decimal64_to_long_long(decimal64 __d);
75*e4b17023SJohn Marino  long long decimal128_to_long_long(decimal128 __d);
76*e4b17023SJohn Marino  long long decimal_to_long_long(decimal32 __d);
77*e4b17023SJohn Marino  long long decimal_to_long_long(decimal64 __d);
78*e4b17023SJohn Marino  long long decimal_to_long_long(decimal128 __d);
79*e4b17023SJohn Marino
80*e4b17023SJohn Marino  // 3.2.6  Conversion to generic floating-point type.
81*e4b17023SJohn Marino  float decimal32_to_float(decimal32 __d);
82*e4b17023SJohn Marino  float decimal64_to_float(decimal64 __d);
83*e4b17023SJohn Marino  float decimal128_to_float(decimal128 __d);
84*e4b17023SJohn Marino  float decimal_to_float(decimal32 __d);
85*e4b17023SJohn Marino  float decimal_to_float(decimal64 __d);
86*e4b17023SJohn Marino  float decimal_to_float(decimal128 __d);
87*e4b17023SJohn Marino
88*e4b17023SJohn Marino  double decimal32_to_double(decimal32 __d);
89*e4b17023SJohn Marino  double decimal64_to_double(decimal64 __d);
90*e4b17023SJohn Marino  double decimal128_to_double(decimal128 __d);
91*e4b17023SJohn Marino  double decimal_to_double(decimal32 __d);
92*e4b17023SJohn Marino  double decimal_to_double(decimal64 __d);
93*e4b17023SJohn Marino  double decimal_to_double(decimal128 __d);
94*e4b17023SJohn Marino
95*e4b17023SJohn Marino  long double decimal32_to_long_double(decimal32 __d);
96*e4b17023SJohn Marino  long double decimal64_to_long_double(decimal64 __d);
97*e4b17023SJohn Marino  long double decimal128_to_long_double(decimal128 __d);
98*e4b17023SJohn Marino  long double decimal_to_long_double(decimal32 __d);
99*e4b17023SJohn Marino  long double decimal_to_long_double(decimal64 __d);
100*e4b17023SJohn Marino  long double decimal_to_long_double(decimal128 __d);
101*e4b17023SJohn Marino
102*e4b17023SJohn Marino  // 3.2.7  Unary arithmetic operators.
103*e4b17023SJohn Marino  decimal32  operator+(decimal32 __rhs);
104*e4b17023SJohn Marino  decimal64  operator+(decimal64 __rhs);
105*e4b17023SJohn Marino  decimal128 operator+(decimal128 __rhs);
106*e4b17023SJohn Marino  decimal32  operator-(decimal32 __rhs);
107*e4b17023SJohn Marino  decimal64  operator-(decimal64 __rhs);
108*e4b17023SJohn Marino  decimal128 operator-(decimal128 __rhs);
109*e4b17023SJohn Marino
110*e4b17023SJohn Marino  // 3.2.8  Binary arithmetic operators.
111*e4b17023SJohn Marino#define _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(_Op, _T1, _T2, _T3)	\
112*e4b17023SJohn Marino  _T1 operator _Op(_T2 __lhs, _T3 __rhs);
113*e4b17023SJohn Marino#define _DECLARE_DECIMAL_BINARY_OP_WITH_INT(_Op, _Tp)		\
114*e4b17023SJohn Marino  _Tp operator _Op(_Tp __lhs, int __rhs);			\
115*e4b17023SJohn Marino  _Tp operator _Op(_Tp __lhs, unsigned int __rhs);		\
116*e4b17023SJohn Marino  _Tp operator _Op(_Tp __lhs, long __rhs);			\
117*e4b17023SJohn Marino  _Tp operator _Op(_Tp __lhs, unsigned long __rhs);		\
118*e4b17023SJohn Marino  _Tp operator _Op(_Tp __lhs, long long __rhs);			\
119*e4b17023SJohn Marino  _Tp operator _Op(_Tp __lhs, unsigned long long __rhs);	\
120*e4b17023SJohn Marino  _Tp operator _Op(int __lhs, _Tp __rhs);			\
121*e4b17023SJohn Marino  _Tp operator _Op(unsigned int __lhs, _Tp __rhs);		\
122*e4b17023SJohn Marino  _Tp operator _Op(long __lhs, _Tp __rhs);			\
123*e4b17023SJohn Marino  _Tp operator _Op(unsigned long __lhs, _Tp __rhs);		\
124*e4b17023SJohn Marino  _Tp operator _Op(long long __lhs, _Tp __rhs);			\
125*e4b17023SJohn Marino  _Tp operator _Op(unsigned long long __lhs, _Tp __rhs);
126*e4b17023SJohn Marino
127*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal32, decimal32, decimal32)
128*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(+, decimal32)
129*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal32, decimal64)
130*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal64, decimal32)
131*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal64, decimal64)
132*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(+, decimal64)
133*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal32, decimal128)
134*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal64, decimal128)
135*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128, decimal32)
136*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128, decimal64)
137*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128, decimal128)
138*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(+, decimal128)
139*e4b17023SJohn Marino
140*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal32, decimal32, decimal32)
141*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(-, decimal32)
142*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal32, decimal64)
143*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal64, decimal32)
144*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal64, decimal64)
145*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(-, decimal64)
146*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal32, decimal128)
147*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal64, decimal128)
148*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128, decimal32)
149*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128, decimal64)
150*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128, decimal128)
151*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(-, decimal128)
152*e4b17023SJohn Marino
153*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal32, decimal32, decimal32)
154*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(*, decimal32)
155*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal32, decimal64)
156*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal64, decimal32)
157*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal64, decimal64)
158*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(*, decimal64)
159*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal32, decimal128)
160*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal64, decimal128)
161*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128, decimal32)
162*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128, decimal64)
163*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128, decimal128)
164*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(*, decimal128)
165*e4b17023SJohn Marino
166*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal32, decimal32, decimal32)
167*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(/, decimal32)
168*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal32, decimal64)
169*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal64, decimal32)
170*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal64, decimal64)
171*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(/, decimal64)
172*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal32, decimal128)
173*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal64, decimal128)
174*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128, decimal32)
175*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128, decimal64)
176*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128, decimal128)
177*e4b17023SJohn Marino  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(/, decimal128)
178*e4b17023SJohn Marino
179*e4b17023SJohn Marino#undef _DECLARE_DECIMAL_BINARY_OP_WITH_DEC
180*e4b17023SJohn Marino#undef _DECLARE_DECIMAL_BINARY_OP_WITH_INT
181*e4b17023SJohn Marino
182*e4b17023SJohn Marino  // 3.2.9  Comparison operators.
183*e4b17023SJohn Marino#define _DECLARE_DECIMAL_COMPARISON(_Op, _Tp)				\
184*e4b17023SJohn Marino  bool operator _Op(_Tp __lhs, decimal32 __rhs);			\
185*e4b17023SJohn Marino  bool operator _Op(_Tp __lhs, decimal64 __rhs);			\
186*e4b17023SJohn Marino  bool operator _Op(_Tp __lhs, decimal128 __rhs);			\
187*e4b17023SJohn Marino  bool operator _Op(_Tp __lhs, int __rhs);				\
188*e4b17023SJohn Marino  bool operator _Op(_Tp __lhs, unsigned int __rhs);			\
189*e4b17023SJohn Marino  bool operator _Op(_Tp __lhs, long __rhs);				\
190*e4b17023SJohn Marino  bool operator _Op(_Tp __lhs, unsigned long __rhs);			\
191*e4b17023SJohn Marino  bool operator _Op(_Tp __lhs, long long __rhs);			\
192*e4b17023SJohn Marino  bool operator _Op(_Tp __lhs, unsigned long long __rhs);		\
193*e4b17023SJohn Marino  bool operator _Op(int __lhs, _Tp __rhs);				\
194*e4b17023SJohn Marino  bool operator _Op(unsigned int __lhs, _Tp __rhs);			\
195*e4b17023SJohn Marino  bool operator _Op(long __lhs, _Tp __rhs);				\
196*e4b17023SJohn Marino  bool operator _Op(unsigned long __lhs, _Tp __rhs);			\
197*e4b17023SJohn Marino  bool operator _Op(long long __lhs, _Tp __rhs);			\
198*e4b17023SJohn Marino  bool operator _Op(unsigned long long __lhs, _Tp __rhs);
199*e4b17023SJohn Marino
200*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(==, decimal32)
201*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(==, decimal64)
202*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(==, decimal128)
203*e4b17023SJohn Marino
204*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(!=, decimal32)
205*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(!=, decimal64)
206*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(!=, decimal128)
207*e4b17023SJohn Marino
208*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(<, decimal32)
209*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(<, decimal64)
210*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(<, decimal128)
211*e4b17023SJohn Marino
212*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(>=, decimal32)
213*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(>=, decimal64)
214*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(>=, decimal128)
215*e4b17023SJohn Marino
216*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(>, decimal32)
217*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(>, decimal64)
218*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(>, decimal128)
219*e4b17023SJohn Marino
220*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(>=, decimal32)
221*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(>=, decimal64)
222*e4b17023SJohn Marino  _DECLARE_DECIMAL_COMPARISON(>=, decimal128)
223*e4b17023SJohn Marino
224*e4b17023SJohn Marino#undef _DECLARE_DECIMAL_COMPARISON
225*e4b17023SJohn Marino
226*e4b17023SJohn Marino  /// 3.2.2  Class decimal32.
227*e4b17023SJohn Marino  class decimal32
228*e4b17023SJohn Marino  {
229*e4b17023SJohn Marino  public:
230*e4b17023SJohn Marino    typedef float __decfloat32 __attribute__((mode(SD)));
231*e4b17023SJohn Marino
232*e4b17023SJohn Marino    // 3.2.2.2  Construct/copy/destroy.
233*e4b17023SJohn Marino    decimal32()					: __val(0.e-101DF) {}
234*e4b17023SJohn Marino
235*e4b17023SJohn Marino    // 3.2.2.3  Conversion from floating-point type.
236*e4b17023SJohn Marino    explicit decimal32(decimal64 __d64);
237*e4b17023SJohn Marino    explicit decimal32(decimal128 __d128);
238*e4b17023SJohn Marino    explicit decimal32(float __r)		: __val(__r) {}
239*e4b17023SJohn Marino    explicit decimal32(double __r)		: __val(__r) {}
240*e4b17023SJohn Marino    explicit decimal32(long double __r)		: __val(__r) {}
241*e4b17023SJohn Marino
242*e4b17023SJohn Marino    // 3.2.2.4  Conversion from integral type.
243*e4b17023SJohn Marino    decimal32(int __z)				: __val(__z) {}
244*e4b17023SJohn Marino    decimal32(unsigned int __z)			: __val(__z) {}
245*e4b17023SJohn Marino    decimal32(long __z)				: __val(__z) {}
246*e4b17023SJohn Marino    decimal32(unsigned long __z)		: __val(__z) {}
247*e4b17023SJohn Marino    decimal32(long long __z)			: __val(__z) {}
248*e4b17023SJohn Marino    decimal32(unsigned long long __z)		: __val(__z) {}
249*e4b17023SJohn Marino
250*e4b17023SJohn Marino    /// Conforming extension: Conversion from scalar decimal type.
251*e4b17023SJohn Marino    decimal32(__decfloat32 __z)			: __val(__z) {}
252*e4b17023SJohn Marino
253*e4b17023SJohn Marino    // 3.2.2.5  Conversion to integral type. (DISABLED)
254*e4b17023SJohn Marino    //operator long long() const { return (long long)__val; }
255*e4b17023SJohn Marino
256*e4b17023SJohn Marino    // 3.2.2.6  Increment and decrement operators.
257*e4b17023SJohn Marino    decimal32& operator++()
258*e4b17023SJohn Marino    {
259*e4b17023SJohn Marino      __val += 1;
260*e4b17023SJohn Marino      return *this;
261*e4b17023SJohn Marino    }
262*e4b17023SJohn Marino
263*e4b17023SJohn Marino    decimal32 operator++(int)
264*e4b17023SJohn Marino    {
265*e4b17023SJohn Marino      decimal32 __tmp = *this;
266*e4b17023SJohn Marino      __val += 1;
267*e4b17023SJohn Marino      return __tmp;
268*e4b17023SJohn Marino    }
269*e4b17023SJohn Marino
270*e4b17023SJohn Marino    decimal32& operator--()
271*e4b17023SJohn Marino    {
272*e4b17023SJohn Marino      __val -= 1;
273*e4b17023SJohn Marino      return *this;
274*e4b17023SJohn Marino    }
275*e4b17023SJohn Marino
276*e4b17023SJohn Marino    decimal32   operator--(int)
277*e4b17023SJohn Marino    {
278*e4b17023SJohn Marino      decimal32 __tmp = *this;
279*e4b17023SJohn Marino      __val -= 1;
280*e4b17023SJohn Marino      return __tmp;
281*e4b17023SJohn Marino    }
282*e4b17023SJohn Marino
283*e4b17023SJohn Marino    // 3.2.2.7  Compound assignment.
284*e4b17023SJohn Marino#define _DECLARE_DECIMAL32_COMPOUND_ASSIGNMENT(_Op)	\
285*e4b17023SJohn Marino    decimal32& operator _Op(decimal32 __rhs);		\
286*e4b17023SJohn Marino    decimal32& operator _Op(decimal64 __rhs);		\
287*e4b17023SJohn Marino    decimal32& operator _Op(decimal128 __rhs);		\
288*e4b17023SJohn Marino    decimal32& operator _Op(int __rhs);			\
289*e4b17023SJohn Marino    decimal32& operator _Op(unsigned int __rhs);	\
290*e4b17023SJohn Marino    decimal32& operator _Op(long __rhs);		\
291*e4b17023SJohn Marino    decimal32& operator _Op(unsigned long __rhs);	\
292*e4b17023SJohn Marino    decimal32& operator _Op(long long __rhs);		\
293*e4b17023SJohn Marino    decimal32& operator _Op(unsigned long long __rhs);
294*e4b17023SJohn Marino
295*e4b17023SJohn Marino    _DECLARE_DECIMAL32_COMPOUND_ASSIGNMENT(+=)
296*e4b17023SJohn Marino    _DECLARE_DECIMAL32_COMPOUND_ASSIGNMENT(-=)
297*e4b17023SJohn Marino    _DECLARE_DECIMAL32_COMPOUND_ASSIGNMENT(*=)
298*e4b17023SJohn Marino    _DECLARE_DECIMAL32_COMPOUND_ASSIGNMENT(/=)
299*e4b17023SJohn Marino#undef _DECLARE_DECIMAL32_COMPOUND_ASSIGNMENT
300*e4b17023SJohn Marino
301*e4b17023SJohn Marino  private:
302*e4b17023SJohn Marino    __decfloat32 __val;
303*e4b17023SJohn Marino
304*e4b17023SJohn Marino  public:
305*e4b17023SJohn Marino    __decfloat32 __getval(void) { return __val; }
306*e4b17023SJohn Marino    void __setval(__decfloat32 __x) { __val = __x; }
307*e4b17023SJohn Marino  };
308*e4b17023SJohn Marino
309*e4b17023SJohn Marino  /// 3.2.3  Class decimal64.
310*e4b17023SJohn Marino  class decimal64
311*e4b17023SJohn Marino  {
312*e4b17023SJohn Marino  public:
313*e4b17023SJohn Marino    typedef float __decfloat64 __attribute__((mode(DD)));
314*e4b17023SJohn Marino
315*e4b17023SJohn Marino    // 3.2.3.2  Construct/copy/destroy.
316*e4b17023SJohn Marino    decimal64()					: __val(0.e-398dd) {}
317*e4b17023SJohn Marino
318*e4b17023SJohn Marino    // 3.2.3.3  Conversion from floating-point type.
319*e4b17023SJohn Marino	     decimal64(decimal32 d32);
320*e4b17023SJohn Marino    explicit decimal64(decimal128 d128);
321*e4b17023SJohn Marino    explicit decimal64(float __r)		: __val(__r) {}
322*e4b17023SJohn Marino    explicit decimal64(double __r)		: __val(__r) {}
323*e4b17023SJohn Marino    explicit decimal64(long double __r)		: __val(__r) {}
324*e4b17023SJohn Marino
325*e4b17023SJohn Marino    // 3.2.3.4  Conversion from integral type.
326*e4b17023SJohn Marino    decimal64(int __z)				: __val(__z) {}
327*e4b17023SJohn Marino    decimal64(unsigned int __z)			: __val(__z) {}
328*e4b17023SJohn Marino    decimal64(long __z)				: __val(__z) {}
329*e4b17023SJohn Marino    decimal64(unsigned long __z)		: __val(__z) {}
330*e4b17023SJohn Marino    decimal64(long long __z)			: __val(__z) {}
331*e4b17023SJohn Marino    decimal64(unsigned long long __z)		: __val(__z) {}
332*e4b17023SJohn Marino
333*e4b17023SJohn Marino    /// Conforming extension: Conversion from scalar decimal type.
334*e4b17023SJohn Marino    decimal64(__decfloat64 __z)			: __val(__z) {}
335*e4b17023SJohn Marino
336*e4b17023SJohn Marino    // 3.2.3.5  Conversion to integral type. (DISABLED)
337*e4b17023SJohn Marino    //operator long long() const { return (long long)__val; }
338*e4b17023SJohn Marino
339*e4b17023SJohn Marino    // 3.2.3.6  Increment and decrement operators.
340*e4b17023SJohn Marino    decimal64& operator++()
341*e4b17023SJohn Marino    {
342*e4b17023SJohn Marino      __val += 1;
343*e4b17023SJohn Marino      return *this;
344*e4b17023SJohn Marino    }
345*e4b17023SJohn Marino
346*e4b17023SJohn Marino    decimal64 operator++(int)
347*e4b17023SJohn Marino    {
348*e4b17023SJohn Marino      decimal64 __tmp = *this;
349*e4b17023SJohn Marino      __val += 1;
350*e4b17023SJohn Marino      return __tmp;
351*e4b17023SJohn Marino    }
352*e4b17023SJohn Marino
353*e4b17023SJohn Marino    decimal64& operator--()
354*e4b17023SJohn Marino    {
355*e4b17023SJohn Marino      __val -= 1;
356*e4b17023SJohn Marino      return *this;
357*e4b17023SJohn Marino    }
358*e4b17023SJohn Marino
359*e4b17023SJohn Marino    decimal64 operator--(int)
360*e4b17023SJohn Marino    {
361*e4b17023SJohn Marino      decimal64 __tmp = *this;
362*e4b17023SJohn Marino      __val -= 1;
363*e4b17023SJohn Marino      return __tmp;
364*e4b17023SJohn Marino    }
365*e4b17023SJohn Marino
366*e4b17023SJohn Marino    // 3.2.3.7  Compound assignment.
367*e4b17023SJohn Marino#define _DECLARE_DECIMAL64_COMPOUND_ASSIGNMENT(_Op)	\
368*e4b17023SJohn Marino    decimal64& operator _Op(decimal32 __rhs);		\
369*e4b17023SJohn Marino    decimal64& operator _Op(decimal64 __rhs);		\
370*e4b17023SJohn Marino    decimal64& operator _Op(decimal128 __rhs);		\
371*e4b17023SJohn Marino    decimal64& operator _Op(int __rhs);			\
372*e4b17023SJohn Marino    decimal64& operator _Op(unsigned int __rhs);	\
373*e4b17023SJohn Marino    decimal64& operator _Op(long __rhs);		\
374*e4b17023SJohn Marino    decimal64& operator _Op(unsigned long __rhs);	\
375*e4b17023SJohn Marino    decimal64& operator _Op(long long __rhs);		\
376*e4b17023SJohn Marino    decimal64& operator _Op(unsigned long long __rhs);
377*e4b17023SJohn Marino
378*e4b17023SJohn Marino    _DECLARE_DECIMAL64_COMPOUND_ASSIGNMENT(+=)
379*e4b17023SJohn Marino    _DECLARE_DECIMAL64_COMPOUND_ASSIGNMENT(-=)
380*e4b17023SJohn Marino    _DECLARE_DECIMAL64_COMPOUND_ASSIGNMENT(*=)
381*e4b17023SJohn Marino    _DECLARE_DECIMAL64_COMPOUND_ASSIGNMENT(/=)
382*e4b17023SJohn Marino#undef _DECLARE_DECIMAL64_COMPOUND_ASSIGNMENT
383*e4b17023SJohn Marino
384*e4b17023SJohn Marino  private:
385*e4b17023SJohn Marino    __decfloat64 __val;
386*e4b17023SJohn Marino
387*e4b17023SJohn Marino  public:
388*e4b17023SJohn Marino    __decfloat64 __getval(void) { return __val; }
389*e4b17023SJohn Marino    void __setval(__decfloat64 __x) { __val = __x; }
390*e4b17023SJohn Marino  };
391*e4b17023SJohn Marino
392*e4b17023SJohn Marino  /// 3.2.4  Class decimal128.
393*e4b17023SJohn Marino  class decimal128
394*e4b17023SJohn Marino  {
395*e4b17023SJohn Marino  public:
396*e4b17023SJohn Marino    typedef float __decfloat128 __attribute__((mode(TD)));
397*e4b17023SJohn Marino
398*e4b17023SJohn Marino    // 3.2.4.2  Construct/copy/destroy.
399*e4b17023SJohn Marino    decimal128()				: __val(0.e-6176DL) {}
400*e4b17023SJohn Marino
401*e4b17023SJohn Marino    // 3.2.4.3  Conversion from floating-point type.
402*e4b17023SJohn Marino	     decimal128(decimal32 d32);
403*e4b17023SJohn Marino	     decimal128(decimal64 d64);
404*e4b17023SJohn Marino    explicit decimal128(float __r)		: __val(__r) {}
405*e4b17023SJohn Marino    explicit decimal128(double __r)		: __val(__r) {}
406*e4b17023SJohn Marino    explicit decimal128(long double __r)	: __val(__r) {}
407*e4b17023SJohn Marino
408*e4b17023SJohn Marino
409*e4b17023SJohn Marino    // 3.2.4.4  Conversion from integral type.
410*e4b17023SJohn Marino    decimal128(int __z)				: __val(__z) {}
411*e4b17023SJohn Marino    decimal128(unsigned int __z)		: __val(__z) {}
412*e4b17023SJohn Marino    decimal128(long __z)			: __val(__z) {}
413*e4b17023SJohn Marino    decimal128(unsigned long __z)		: __val(__z) {}
414*e4b17023SJohn Marino    decimal128(long long __z)			: __val(__z) {}
415*e4b17023SJohn Marino    decimal128(unsigned long long __z)		: __val(__z) {}
416*e4b17023SJohn Marino
417*e4b17023SJohn Marino    /// Conforming extension: Conversion from scalar decimal type.
418*e4b17023SJohn Marino    decimal128(__decfloat128 __z)		: __val(__z) {}
419*e4b17023SJohn Marino
420*e4b17023SJohn Marino    // 3.2.4.5  Conversion to integral type. (DISABLED)
421*e4b17023SJohn Marino    //operator long long() const { return (long long)__val; }
422*e4b17023SJohn Marino
423*e4b17023SJohn Marino    // 3.2.4.6  Increment and decrement operators.
424*e4b17023SJohn Marino    decimal128& operator++()
425*e4b17023SJohn Marino    {
426*e4b17023SJohn Marino      __val += 1;
427*e4b17023SJohn Marino      return *this;
428*e4b17023SJohn Marino    }
429*e4b17023SJohn Marino
430*e4b17023SJohn Marino    decimal128 operator++(int)
431*e4b17023SJohn Marino    {
432*e4b17023SJohn Marino      decimal128 __tmp = *this;
433*e4b17023SJohn Marino      __val += 1;
434*e4b17023SJohn Marino      return __tmp;
435*e4b17023SJohn Marino    }
436*e4b17023SJohn Marino
437*e4b17023SJohn Marino    decimal128& operator--()
438*e4b17023SJohn Marino    {
439*e4b17023SJohn Marino      __val -= 1;
440*e4b17023SJohn Marino      return *this;
441*e4b17023SJohn Marino    }
442*e4b17023SJohn Marino
443*e4b17023SJohn Marino    decimal128   operator--(int)
444*e4b17023SJohn Marino    {
445*e4b17023SJohn Marino      decimal128 __tmp = *this;
446*e4b17023SJohn Marino      __val -= 1;
447*e4b17023SJohn Marino      return __tmp;
448*e4b17023SJohn Marino    }
449*e4b17023SJohn Marino
450*e4b17023SJohn Marino    // 3.2.4.7  Compound assignment.
451*e4b17023SJohn Marino#define _DECLARE_DECIMAL128_COMPOUND_ASSIGNMENT(_Op)	\
452*e4b17023SJohn Marino    decimal128& operator _Op(decimal32 __rhs);		\
453*e4b17023SJohn Marino    decimal128& operator _Op(decimal64 __rhs);		\
454*e4b17023SJohn Marino    decimal128& operator _Op(decimal128 __rhs);		\
455*e4b17023SJohn Marino    decimal128& operator _Op(int __rhs);		\
456*e4b17023SJohn Marino    decimal128& operator _Op(unsigned int __rhs);	\
457*e4b17023SJohn Marino    decimal128& operator _Op(long __rhs);		\
458*e4b17023SJohn Marino    decimal128& operator _Op(unsigned long __rhs);	\
459*e4b17023SJohn Marino    decimal128& operator _Op(long long __rhs);		\
460*e4b17023SJohn Marino    decimal128& operator _Op(unsigned long long __rhs);
461*e4b17023SJohn Marino
462*e4b17023SJohn Marino    _DECLARE_DECIMAL128_COMPOUND_ASSIGNMENT(+=)
463*e4b17023SJohn Marino    _DECLARE_DECIMAL128_COMPOUND_ASSIGNMENT(-=)
464*e4b17023SJohn Marino    _DECLARE_DECIMAL128_COMPOUND_ASSIGNMENT(*=)
465*e4b17023SJohn Marino    _DECLARE_DECIMAL128_COMPOUND_ASSIGNMENT(/=)
466*e4b17023SJohn Marino#undef _DECLARE_DECIMAL128_COMPOUND_ASSIGNMENT
467*e4b17023SJohn Marino
468*e4b17023SJohn Marino  private:
469*e4b17023SJohn Marino    __decfloat128 __val;
470*e4b17023SJohn Marino
471*e4b17023SJohn Marino  public:
472*e4b17023SJohn Marino    __decfloat128 __getval(void) { return __val; }
473*e4b17023SJohn Marino    void __setval(__decfloat128 __x) { __val = __x; }
474*e4b17023SJohn Marino  };
475*e4b17023SJohn Marino
476*e4b17023SJohn Marino#define _GLIBCXX_USE_DECIMAL_ 1
477*e4b17023SJohn Marino
478*e4b17023SJohn Marino  _GLIBCXX_END_NAMESPACE_VERSION
479*e4b17023SJohn Marino} // namespace decimal
480*e4b17023SJohn Marino  // @} group decimal
481*e4b17023SJohn Marino} // namespace std
482*e4b17023SJohn Marino
483*e4b17023SJohn Marino#include <decimal/decimal.h>
484*e4b17023SJohn Marino
485*e4b17023SJohn Marino#endif /* _GLIBCXX_DECIMAL */
486