dfp/include/DecimalNative.h (129 lines of code) (raw):
#ifndef DECIMALNATIVE_H
#define DECIMALNATIVE_H
#ifdef __cplusplus
#include <cstdint>
#else
#include <stdint.h>
#endif
#ifdef __cplusplus
#define DECIMALNATIVE_MANGLING "C"
#else
#define DECIMALNATIVE_MANGLING
#endif
#ifdef DECIMALNATIVE_EXPORTS
#if defined(_WIN64)
#define DECIMALNATIVE_API(x) extern DECIMALNATIVE_MANGLING __declspec(dllexport) x __fastcall
#elif defined(_WIN32)
#define DECIMALNATIVE_API(x) extern DECIMALNATIVE_MANGLING __declspec(dllexport) x __stdcall
#else
#define DECIMALNATIVE_API(x) extern DECIMALNATIVE_MANGLING x __attribute__ ((visibility("default")))
#endif
#else
#if defined(_WIN64)
#define DECIMALNATIVE_API(x) extern DECIMALNATIVE_MANGLING __declspec(dllimport) x __fastcall
#elif defined(_WIN32)
#define DECIMALNATIVE_API(x) extern DECIMALNATIVE_MANGLING __declspec(dllimport) x __stdcall
#else
#define DECIMALNATIVE_API(x) extern DECIMALNATIVE_MANGLING x __attribute__ ((visibility("default")))
#endif
#endif
typedef struct {
uint64_t val;
} decimal_native_t;
inline static uint64_t decimal_native_toUnderlying(decimal_native_t _value) {
return _value.val;
}
inline static decimal_native_t decimal_native_fromUnderlying(uint64_t value) {
decimal_native_t dn;
dn.val = value;
return dn;
}
static const uint64_t DECIMAL_NATIVE_UNDERLYING_POSITIVE_INFINITY = 0x7800000000000000ULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_NEGATIVE_INFINITY = 0xF800000000000000ULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_NAN = 0x7C00000000000000ULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_NULL = 0xFFFFFFFFFFFFFF80ULL; // = -0x80
static const uint64_t DECIMAL_NATIVE_UNDERLYING_MIN_VALUE = 0xF7FB86F26FC0FFFFULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_MAX_VALUE = 0x77FB86F26FC0FFFFULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_MIN_POSITIVE_VALUE = 0x0000000000000001ULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_MAX_NEGATIVE_VALUE = 0x8000000000000001ULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_ZERO = 0x31C0000000000000ULL; // e=0, m=0, sign=0
static const uint64_t DECIMAL_NATIVE_UNDERLYING_ONE = 0x31C0000000000001ULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_TWO = 0x31C0000000000002ULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_TEN = 0x31C000000000000AULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_HUNDRED = 0x31C0000000000064ULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_THOUSAND = 0x31C00000000003E8ULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_MILLION = 0x31C00000000F4240ULL;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_ONETENTH = 0x31A0000000000000ULL + 1;
static const uint64_t DECIMAL_NATIVE_UNDERLYING_ONEHUNDREDTH = 0x3180000000000000ULL + 1;
DECIMALNATIVE_API(int32_t) decimal_native_version();
DECIMALNATIVE_API(decimal_native_t) decimal_native_fromFixedPoint64(int64_t value, int32_t numberOfDigits);
DECIMALNATIVE_API(decimal_native_t) decimal_native_fromFixedPoint32(int32_t value, int32_t numberOfDigits);
DECIMALNATIVE_API(decimal_native_t) decimal_native_fromFixedPointU32(uint32_t value, int32_t numberOfDigits);
DECIMALNATIVE_API(int64_t) decimal_native_toFixedPoint(decimal_native_t value, int32_t numberOfDigits);
DECIMALNATIVE_API(decimal_native_t) decimal_native_fromInt64(int64_t value);
DECIMALNATIVE_API(int64_t) decimal_native_toInt64(decimal_native_t value);
DECIMALNATIVE_API(decimal_native_t) decimal_native_fromUInt64(uint64_t value);
DECIMALNATIVE_API(uint64_t) decimal_native_toUInt64(decimal_native_t value);
DECIMALNATIVE_API(decimal_native_t) decimal_native_fromInt32(int32_t value);
DECIMALNATIVE_API(int32_t) decimal_native_toInt32(decimal_native_t value);
DECIMALNATIVE_API(decimal_native_t) decimal_native_fromUInt32(uint32_t value);
DECIMALNATIVE_API(uint32_t) decimal_native_toUInt32(decimal_native_t value);
DECIMALNATIVE_API(decimal_native_t) decimal_native_fromInt16(int16_t value);
DECIMALNATIVE_API(int16_t) decimal_native_toInt16(decimal_native_t value);
DECIMALNATIVE_API(decimal_native_t) decimal_native_fromInt8(int8_t value);
DECIMALNATIVE_API(int8_t) decimal_native_toInt8(decimal_native_t value);
DECIMALNATIVE_API(uint8_t) decimal_native_toUInt8(decimal_native_t value);
DECIMALNATIVE_API(decimal_native_t) decimal_native_fromFloat64(double value);
DECIMALNATIVE_API(double) decimal_native_toFloat64(decimal_native_t value);
DECIMALNATIVE_API(decimal_native_t) decimal_native_roundTowardsPositiveInfinity(decimal_native_t a);
DECIMALNATIVE_API(decimal_native_t) decimal_native_roundTowardsNegativeInfinity(decimal_native_t a);
DECIMALNATIVE_API(decimal_native_t) decimal_native_roundTowardsZero(decimal_native_t a);
DECIMALNATIVE_API(decimal_native_t) decimal_native_roundToNearestTiesAwayFromZero(decimal_native_t a);
DECIMALNATIVE_API(uint8_t) decimal_native_isNaN(decimal_native_t a);
DECIMALNATIVE_API(uint8_t) decimal_native_isInfinity(decimal_native_t a);
DECIMALNATIVE_API(uint8_t) decimal_native_isPositiveInfinity(decimal_native_t a);
DECIMALNATIVE_API(uint8_t) decimal_native_isNegativeInfinity(decimal_native_t a);
DECIMALNATIVE_API(uint8_t) decimal_native_isFinite(decimal_native_t a);
DECIMALNATIVE_API(uint8_t) decimal_native_isNormal(decimal_native_t a);
DECIMALNATIVE_API(uint8_t) decimal_native_signBit(decimal_native_t a);
DECIMALNATIVE_API(int32_t) decimal_native_compare(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(uint8_t) decimal_native_isEqual(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(uint8_t) decimal_native_isNotEqual(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(uint8_t) decimal_native_isLess(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(uint8_t) decimal_native_isLessOrEqual(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(uint8_t) decimal_native_isGreater(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(uint8_t) decimal_native_isGreaterOrEqual(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(uint8_t) decimal_native_isZero(decimal_native_t a);
DECIMALNATIVE_API(uint8_t) decimal_native_isNonZero(decimal_native_t a);
DECIMALNATIVE_API(uint8_t) decimal_native_isPositive(decimal_native_t a);
DECIMALNATIVE_API(uint8_t) decimal_native_isNegative(decimal_native_t a);
DECIMALNATIVE_API(uint8_t) decimal_native_isNonPositive(decimal_native_t a);
DECIMALNATIVE_API(uint8_t) decimal_native_isNonNegative(decimal_native_t a);
DECIMALNATIVE_API(decimal_native_t) decimal_native_max2(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(decimal_native_t) decimal_native_max3(decimal_native_t a, decimal_native_t b, decimal_native_t c);
DECIMALNATIVE_API(decimal_native_t) decimal_native_max4(decimal_native_t a, decimal_native_t b, decimal_native_t c, decimal_native_t d);
DECIMALNATIVE_API(decimal_native_t) decimal_native_min2(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(decimal_native_t) decimal_native_min3(decimal_native_t a, decimal_native_t b, decimal_native_t c);
DECIMALNATIVE_API(decimal_native_t) decimal_native_min4(decimal_native_t a, decimal_native_t b, decimal_native_t c, decimal_native_t d);
DECIMALNATIVE_API(decimal_native_t) decimal_native_negate(decimal_native_t a);
DECIMALNATIVE_API(decimal_native_t) decimal_native_abs(decimal_native_t x);
DECIMALNATIVE_API(decimal_native_t) decimal_native_add2(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(decimal_native_t) decimal_native_add3(decimal_native_t a, decimal_native_t b, decimal_native_t c);
DECIMALNATIVE_API(decimal_native_t) decimal_native_add4(decimal_native_t a, decimal_native_t b, decimal_native_t c, decimal_native_t d);
DECIMALNATIVE_API(decimal_native_t) decimal_native_subtract(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(decimal_native_t) decimal_native_multiply2(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(decimal_native_t) decimal_native_multiply3(decimal_native_t a, decimal_native_t b, decimal_native_t c);
DECIMALNATIVE_API(decimal_native_t) decimal_native_multiply4(decimal_native_t a, decimal_native_t b, decimal_native_t c, decimal_native_t d);
DECIMALNATIVE_API(decimal_native_t) decimal_native_multiplyByInt32(decimal_native_t a, int32_t b);
DECIMALNATIVE_API(decimal_native_t) decimal_native_multiplyByInt64(decimal_native_t a, int64_t b);
DECIMALNATIVE_API(decimal_native_t) decimal_native_divide(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(decimal_native_t) decimal_native_divideByInt32(decimal_native_t a, int32_t b);
DECIMALNATIVE_API(decimal_native_t) decimal_native_divideByInt64(decimal_native_t a, int64_t b);
DECIMALNATIVE_API(decimal_native_t) decimal_native_multiplyAndAdd(decimal_native_t a, decimal_native_t b, decimal_native_t c);
DECIMALNATIVE_API(decimal_native_t) decimal_native_scaleByPowerOfTen(decimal_native_t a, int32_t n);
DECIMALNATIVE_API(decimal_native_t) decimal_native_mean2(decimal_native_t a, decimal_native_t b);
DECIMALNATIVE_API(decimal_native_t) decimal_native_nextUp(decimal_native_t a);
DECIMALNATIVE_API(decimal_native_t) decimal_native_nextDown(decimal_native_t a);
DECIMALNATIVE_API(void) decimal_native_toString(decimal_native_t a, char* str);
DECIMALNATIVE_API(decimal_native_t) decimal_native_fromString(const char* str);
#endif