diff --git a/Headers/gnustep/base/NSDecimal.h b/Headers/gnustep/base/NSDecimal.h index 1573faad9..214ec6263 100644 --- a/Headers/gnustep/base/NSDecimal.h +++ b/Headers/gnustep/base/NSDecimal.h @@ -26,6 +26,12 @@ #ifndef STRICT_OPENSTEP +#ifdef HAVE_GMP +#include +#endif + +#include + typedef enum { NSRoundDown, NSRoundUp, @@ -45,16 +51,22 @@ typedef enum { * Give a precision of at least 38 decimal digits * requires 128 bits. */ -#define NSDecimalMaxSize (16/sizeof(int)) +#define NSDecimalMaxSize (16/sizeof(mp_limb_t)) -#define NSDecimalNoScale -1 +#define NSDecimalMaxDigit 38 +#define NSDecimalNoScale 128 typedef struct { char exponent; /* Signed exponent - -128 to 127 */ - char length; /* digits in mantissa. */ BOOL isNegative; /* Is this negative? */ BOOL validNumber; /* Is this a valid number? */ - unsigned int mantissa[NSDecimalMaxSize]; +#ifdef HAVE_GMP + mp_size_t size; + mp_limb_t lMantissa[NSDecimalMaxSize]; +#else + char length; /* digits in mantissa. */ + char cMantissa[NSDecimalMaxDigit]; +#endif } NSDecimal; static inline BOOL @@ -99,6 +111,32 @@ NSDecimalMultiplyByPowerOf10(NSDecimal *result, const NSDecimal *n, short power, GS_EXPORT NSString* NSDecimalString(const NSDecimal *decimal, NSDictionary *locale); + +// GNUstep extensions to make the implementation of NSDecimalNumber totaly +// independent for NSDecimals internal representation + +// Give back the biggest NSDecimal +GS_EXPORT void +NSDecimalMax(NSDecimal *result); + +// Give back the smallest NSDecimal +GS_EXPORT void +NSDecimalMin(NSDecimal *result); + +// Give back the value of a NSDecimal as a double +GS_EXPORT double +NSDecimalDouble(NSDecimal *number); + +// Create a NSDecimal with a mantissa, exponent and a negative flag +GS_EXPORT void +NSDecimalFromComponents(NSDecimal *result, unsigned long long mantissa, + short exponent, BOOL negative); + +// Create a NSDecimal from a string using the local +GS_EXPORT void +NSDecimalFromString(NSDecimal *result, NSString *numberValue, + NSDictionary *locale); + #endif #endif diff --git a/Headers/gnustep/base/NSDecimalNumber.h b/Headers/gnustep/base/NSDecimalNumber.h index 570f42d83..7567a092e 100644 --- a/Headers/gnustep/base/NSDecimalNumber.h +++ b/Headers/gnustep/base/NSDecimalNumber.h @@ -29,6 +29,7 @@ #ifndef STRICT_OPENSTEP #include +#include @class NSDecimalNumber; @@ -41,12 +42,91 @@ - (short) scale; @end - -@interface NSDecimalNumber : NSObject +@interface NSDecimalNumberHandler : NSObject { + NSRoundingMode _roundingMode; + short _scale; + BOOL _raiseOnExactness; + BOOL _raiseOnOverflow; + BOOL _raiseOnUnderflow; + BOOL _raiseOnDivideByZero; } + ++ (id)defaultDecimalNumberHandler; ++ (id)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode + scale:(short)scale + raiseOnExactness:(BOOL)raiseOnExactness + raiseOnOverflow:(BOOL)raiseOnOverflow + raiseOnUnderflow:(BOOL)raiseOnUnderflow + raiseOnDivideByZero:(BOOL)raiseOnDivideByZero; + +- (id)initWithRoundingMode:(NSRoundingMode)roundingMode + scale:(short)scale + raiseOnExactness:(BOOL)raiseOnExactness + raiseOnOverflow:(BOOL)raiseOnOverflow + raiseOnUnderflow:(BOOL)raiseOnUnderflow + raiseOnDivideByZero:(BOOL)raiseOnDivideByZero; +@end + +@interface NSDecimalNumber : NSNumber +{ + NSDecimal data; +} + ++ (id )defaultBehavior; ++ (void)setDefaultBehavior:(id )behavior; + ++ (NSDecimalNumber *)maximumDecimalNumber; ++ (NSDecimalNumber *)minimumDecimalNumber; ++ (NSDecimalNumber *)notANumber; ++ (NSDecimalNumber *)one; ++ (NSDecimalNumber *)zero; + ++ (NSDecimalNumber *)decimalNumberWithDecimal:(NSDecimal)decimal; ++ (NSDecimalNumber *)decimalNumberWithMantissa:(unsigned long long)mantissa + exponent:(short)exponent + isNegative:(BOOL)isNegative; ++ (NSDecimalNumber *)decimalNumberWithString:(NSString *)numericString; ++ (NSDecimalNumber *)decimalNumberWithString:(NSString *)numericString + locale:(NSDictionary *)locale; + +- (id)initWithDecimal:(NSDecimal)decimal; +- (id)initWithMantissa:(unsigned long long)mantissa + exponent:(short)exponent + isNegative:(BOOL)flag; +- (id)initWithString:(NSString *)numberValue; +- (id)initWithString:(NSString *)numberValue + locale:(NSDictionary *)locale; + +- (const char *)objCType; + +- (NSDecimal)decimalValue; +- (NSString *)descriptionWithLocale:(NSDictionary *)locale; +- (double)doubleValue; + +- (NSComparisonResult)compare:(NSNumber *)decimalNumber; + +- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber; +- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber + withBehavior:(id)behavior; +- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber; +- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber + withBehavior:(id )behavior; +- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber; +- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber + withBehavior:(id )behavior; +- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power; +- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power + withBehavior:(id )behavior; +- (NSDecimalNumber *)decimalNumberByRaisingToPower:(unsigned)power; +- (NSDecimalNumber *)decimalNumberByRaisingToPower:(unsigned)power + withBehavior:(id )behavior; +- (NSDecimalNumber *)decimalNumberByRoundingAccordingToBehavior:(id )behavior; +- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber; +- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber + withBehavior:(id )behavior; + @end #endif #endif -