12#ifndef FORTRAN_DECIMAL_DECIMAL_H_
13#define FORTRAN_DECIMAL_DECIMAL_H_
15#include "flang/Common/api-attrs.h"
29#include "binary-floating-point.h"
30namespace Fortran::decimal {
33enum ConversionResultFlags {
45 enum ConversionResultFlags flags;
53enum DecimalConversionFlags {
65#define EXTRA_DECIMAL_CONVERSION_SPACE (1 + 1 + 2 * 16 - 1)
70 DecimalConversionFlags,
int digits,
enum FortranRounding rounding,
71 BinaryFloatingPointNumber<PREC> x);
74 char *,
size_t,
enum DecimalConversionFlags,
int,
enum FortranRounding,
75 BinaryFloatingPointNumber<8>);
77 char *,
size_t,
enum DecimalConversionFlags,
int,
enum FortranRounding,
78 BinaryFloatingPointNumber<11>);
80 char *,
size_t,
enum DecimalConversionFlags,
int,
enum FortranRounding,
81 BinaryFloatingPointNumber<24>);
83 char *,
size_t,
enum DecimalConversionFlags,
int,
enum FortranRounding,
84 BinaryFloatingPointNumber<53>);
86 char *,
size_t,
enum DecimalConversionFlags,
int,
enum FortranRounding,
87 BinaryFloatingPointNumber<64>);
89 char *,
size_t,
enum DecimalConversionFlags,
int,
enum FortranRounding,
90 BinaryFloatingPointNumber<113>);
92template <
int PREC>
struct ConversionToBinaryResult {
93 BinaryFloatingPointNumber<PREC> binary;
94 enum ConversionResultFlags flags { Exact };
98RT_API_ATTRS ConversionToBinaryResult<PREC> ConvertToBinary(
const char *&,
99 enum FortranRounding = RoundNearest,
const char *end =
nullptr);
101extern template RT_API_ATTRS ConversionToBinaryResult<8> ConvertToBinary<8>(
102 const char *&,
enum FortranRounding,
const char *end);
103extern template RT_API_ATTRS ConversionToBinaryResult<11> ConvertToBinary<11>(
104 const char *&,
enum FortranRounding,
const char *end);
105extern template RT_API_ATTRS ConversionToBinaryResult<24> ConvertToBinary<24>(
106 const char *&,
enum FortranRounding,
const char *end);
107extern template RT_API_ATTRS ConversionToBinaryResult<53> ConvertToBinary<53>(
108 const char *&,
enum FortranRounding,
const char *end);
109extern template RT_API_ATTRS ConversionToBinaryResult<64> ConvertToBinary<64>(
110 const char *&,
enum FortranRounding,
const char *end);
111extern template RT_API_ATTRS ConversionToBinaryResult<113> ConvertToBinary<113>(
112 const char *&,
enum FortranRounding,
const char *end);
115#define NS(x) Fortran::decimal::x
121 ConvertFloatToDecimal(
char *,
size_t,
enum NS(DecimalConversionFlags),
122 int digits,
enum NS(FortranRounding),
float);
124 ConvertDoubleToDecimal(
char *,
size_t,
enum NS(DecimalConversionFlags),
125 int digits,
enum NS(FortranRounding),
double);
127 ConvertLongDoubleToDecimal(
char *,
size_t,
enum NS(DecimalConversionFlags),
128 int digits,
enum NS(FortranRounding),
long double);
130RT_API_ATTRS
enum NS(ConversionResultFlags)
131 ConvertDecimalToFloat(
const char **,
float *,
enum NS(FortranRounding));
132RT_API_ATTRS
enum NS(ConversionResultFlags)
133 ConvertDecimalToDouble(
const char **,
double *,
enum NS(FortranRounding));
134RT_API_ATTRS
enum NS(ConversionResultFlags) ConvertDecimalToLongDouble(
135 const char **,
long double *,
enum NS(FortranRounding));