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)
69RT_OFFLOAD_API_GROUP_BEGIN
72RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal(
char *,
size_t,
73 DecimalConversionFlags,
int digits,
enum FortranRounding rounding,
76extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<8>(
77 char *,
size_t,
enum DecimalConversionFlags,
int,
enum FortranRounding,
79extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<11>(
80 char *,
size_t,
enum DecimalConversionFlags,
int,
enum FortranRounding,
82extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<24>(
83 char *,
size_t,
enum DecimalConversionFlags,
int,
enum FortranRounding,
85extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<53>(
86 char *,
size_t,
enum DecimalConversionFlags,
int,
enum FortranRounding,
88extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<64>(
89 char *,
size_t,
enum DecimalConversionFlags,
int,
enum FortranRounding,
91extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<113>(
92 char *,
size_t,
enum DecimalConversionFlags,
int,
enum FortranRounding,
95template <
int PREC>
struct ConversionToBinaryResult {
97 enum ConversionResultFlags flags { Exact };
101RT_API_ATTRS ConversionToBinaryResult<PREC> ConvertToBinary(
const char *&,
102 enum FortranRounding = RoundNearest,
const char *end =
nullptr);
104extern template RT_API_ATTRS ConversionToBinaryResult<8> ConvertToBinary<8>(
105 const char *&,
enum FortranRounding,
const char *end);
106extern template RT_API_ATTRS ConversionToBinaryResult<11> ConvertToBinary<11>(
107 const char *&,
enum FortranRounding,
const char *end);
108extern template RT_API_ATTRS ConversionToBinaryResult<24> ConvertToBinary<24>(
109 const char *&,
enum FortranRounding,
const char *end);
110extern template RT_API_ATTRS ConversionToBinaryResult<53> ConvertToBinary<53>(
111 const char *&,
enum FortranRounding,
const char *end);
112extern template RT_API_ATTRS ConversionToBinaryResult<64> ConvertToBinary<64>(
113 const char *&,
enum FortranRounding,
const char *end);
114extern template RT_API_ATTRS ConversionToBinaryResult<113> ConvertToBinary<113>(
115 const char *&,
enum FortranRounding,
const char *end);
117RT_OFFLOAD_API_GROUP_END
121#define NS(x) Fortran::decimal::x
127 ConvertFloatToDecimal(
char *,
size_t,
enum NS(DecimalConversionFlags),
128 int digits,
enum NS(FortranRounding),
float);
130 ConvertDoubleToDecimal(
char *,
size_t,
enum NS(DecimalConversionFlags),
131 int digits,
enum NS(FortranRounding),
double);
133 ConvertLongDoubleToDecimal(
char *,
size_t,
enum NS(DecimalConversionFlags),
134 int digits,
enum NS(FortranRounding),
long double);
136RT_API_ATTRS
enum NS(ConversionResultFlags)
137 ConvertDecimalToFloat(
const char **,
float *,
enum NS(FortranRounding));
138RT_API_ATTRS
enum NS(ConversionResultFlags)
139 ConvertDecimalToDouble(
const char **,
double *,
enum NS(FortranRounding));
140RT_API_ATTRS
enum NS(ConversionResultFlags) ConvertDecimalToLongDouble(
141 const char **,
long double *,
enum NS(FortranRounding));
Definition binary-floating-point.h:34