mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-10-21 15:55:02 +00:00
Make default number hanler file global only and Improvements and optimisations for CPDecimalNumber
This commit is contained in:
1 parent
32107ab650
commit
5a0cfc1595
4 files changed
+49
-48
No files matched your search
@@ -239,6 +239,27 @@ function CPDecimalMakeNaN()
|
||||
return d;
|
||||
}
|
||||
|
||||
// private methods
|
||||
function _CPDecimalMakeMaximum()
|
||||
{
|
||||
var s = @"",
|
||||
i = 0;
|
||||
for (; i < CPDecimalMaxDigits; i++)
|
||||
s += "9";
|
||||
s += "e" + CPDecimalMaxExponent;
|
||||
return CPDecimalMakeWithString(s);
|
||||
}
|
||||
|
||||
function _CPDecimalMakeMinimum()
|
||||
{
|
||||
var s = @"-",
|
||||
i = 0;
|
||||
for (; i < CPDecimalMaxDigits; i++)
|
||||
s += "9";
|
||||
s += "e" + CPDecimalMinExponent;
|
||||
return CPDecimalMakeWithString(s);
|
||||
}
|
||||
|
||||
/*!
|
||||
@ingroup foundation
|
||||
Checks to see if a CPDecimal is zero. Can handle uncompacted strings.
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
*/
|
||||
+ (id)defaultDecimalNumberHandler
|
||||
{
|
||||
return _cappdefaultDcmHandler;
|
||||
return CPDefaultDcmHandler;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -166,12 +166,12 @@
|
||||
@end
|
||||
|
||||
// CPCoding category
|
||||
var CPDecimalNumberHandlerRoundingModeKey = @"CPDecimalNumberHandlerRoundingModeKey",
|
||||
CPDecimalNumberHandlerScaleKey = @"CPDecimalNumberHandlerScaleKey",
|
||||
CPDecimalNumberHandlerRaiseOnExactKey = @"CPDecimalNumberHandlerRaiseOnExactKey",
|
||||
CPDecimalNumberHandlerRaiseOnOverflowKey = @"CPDecimalNumberHandlerRaiseOnOverflowKey",
|
||||
CPDecimalNumberHandlerRaiseOnUnderflowKey = @"CPDecimalNumberHandlerRaiseOnUnderflowKey",
|
||||
CPDecimalNumberHandlerDivideByZeroKey = @"CPDecimalNumberHandlerDivideByZeroKey";
|
||||
var CPDecimalNumberHandlerRoundingModeKey = @"CPDecimalNumberHandlerRoundingModeKey",
|
||||
CPDecimalNumberHandlerScaleKey = @"CPDecimalNumberHandlerScaleKey",
|
||||
CPDecimalNumberHandlerRaiseOnExactKey = @"CPDecimalNumberHandlerRaiseOnExactKey",
|
||||
CPDecimalNumberHandlerRaiseOnOverflowKey = @"CPDecimalNumberHandlerRaiseOnOverflowKey",
|
||||
CPDecimalNumberHandlerRaiseOnUnderflowKey = @"CPDecimalNumberHandlerRaiseOnUnderflowKey",
|
||||
CPDecimalNumberHandlerDivideByZeroKey = @"CPDecimalNumberHandlerDivideByZeroKey";
|
||||
|
||||
@implementation CPDecimalNumberHandler (CPCoding)
|
||||
|
||||
@@ -211,11 +211,7 @@ var CPDecimalNumberHandlerRoundingModeKey = @"CPDecimalNumberHandlerRoundingMode
|
||||
@end
|
||||
|
||||
// create the default global behavior class
|
||||
_cappdefaultDcmHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundingMode:CPRoundPlain scale:0 raiseOnExactness:NO raiseOnOverflow:YES raiseOnUnderflow:YES raiseOnDivideByZero:YES];
|
||||
|
||||
// After discussing with boucher about this it makes sense not to inherit, as
|
||||
// CPNumber is toll free bridged and anyway its methods will need to be
|
||||
// overrided here as CPDecimalNumber is not interchangable with CPNumbers.
|
||||
var CPDefaultDcmHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundingMode:CPRoundPlain scale:0 raiseOnExactness:NO raiseOnOverflow:YES raiseOnUnderflow:YES raiseOnDivideByZero:YES];
|
||||
|
||||
/*!
|
||||
@class CPDecimalNumber
|
||||
@@ -231,6 +227,7 @@ _cappdefaultDcmHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundin
|
||||
CPDecimal _data;
|
||||
}
|
||||
|
||||
// overriding alloc means CPDecimalNumbers are not toll free bridged
|
||||
+ (id)alloc
|
||||
{
|
||||
return class_createInstance(self);
|
||||
@@ -281,14 +278,7 @@ _cappdefaultDcmHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundin
|
||||
|
||||
- (id)initWithString:(CPString)numberValue
|
||||
{
|
||||
if (self = [self init])
|
||||
{
|
||||
_data = CPDecimalMakeWithString(numberValue, nil);
|
||||
if (_data === nil)
|
||||
[CPException raise:CPInvalidArgumentException reason:"A CPDecimalNumber has been passed an invalid string. '" + numberValue + "'"];
|
||||
}
|
||||
|
||||
return self;
|
||||
return [self initWithString:numberValue locale:nil];
|
||||
}
|
||||
|
||||
- (id)initWithString:(CPString)numberValue locale:(CPDictionary)locale
|
||||
@@ -326,27 +316,17 @@ _cappdefaultDcmHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundin
|
||||
|
||||
+ (id)defaultBehavior
|
||||
{
|
||||
return _cappdefaultDcmHandler;
|
||||
return CPDefaultDcmHandler;
|
||||
}
|
||||
|
||||
+ (CPDecimalNumber)maximumDecimalNumber
|
||||
{
|
||||
var s = @"",
|
||||
i = 0;
|
||||
for (;i < CPDecimalMaxDigits; i++)
|
||||
s += "9";
|
||||
s += "e" + CPDecimalMaxExponent;
|
||||
return [[self alloc] initWithString:s];
|
||||
return [[self alloc] initWithDecimal:_CPDecimalMakeMaximum()];
|
||||
}
|
||||
|
||||
+ (CPDecimalNumber)minimumDecimalNumber
|
||||
{
|
||||
var s = @"-",
|
||||
i = 0;
|
||||
for (;i < CPDecimalMaxDigits; i++)
|
||||
s += "9";
|
||||
s += "e" + CPDecimalMinExponent;
|
||||
return [[self alloc] initWithString:s];
|
||||
return [[self alloc] initWithDecimal:_CPDecimalMakeMinimum()];
|
||||
}
|
||||
|
||||
+ (CPDecimalNumber)notANumber
|
||||
@@ -354,25 +334,25 @@ _cappdefaultDcmHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundin
|
||||
return [[self alloc] initWithDecimal:CPDecimalMakeNaN()];
|
||||
}
|
||||
|
||||
+ (CPDecimalNumber)zero
|
||||
{
|
||||
return [[self alloc] initWithDecimal:CPDecimalMakeZero()];
|
||||
}
|
||||
|
||||
+ (CPDecimalNumber)one
|
||||
{
|
||||
return [[self alloc] initWithString:"1"];
|
||||
return [[self alloc] initWithDecimal:CPDecimalMakeOne()];
|
||||
}
|
||||
|
||||
+ (void)setDefaultBehavior:(id <CPDecimalNumberBehaviors>)behavior
|
||||
{
|
||||
_cappdefaultDcmHandler = behavior;
|
||||
}
|
||||
|
||||
+ (CPDecimalNumber)zero
|
||||
{
|
||||
return [[self alloc] initWithString:"0"];
|
||||
CPDefaultDcmHandler = behavior;
|
||||
}
|
||||
|
||||
// instance methods
|
||||
- (CPDecimalNumber)decimalNumberByAdding:(CPDecimalNumber)decimalNumber
|
||||
{
|
||||
return [self decimalNumberByAdding:decimalNumber withBehavior:_cappdefaultDcmHandler];
|
||||
return [self decimalNumberByAdding:decimalNumber withBehavior:CPDefaultDcmHandler];
|
||||
}
|
||||
|
||||
- (CPDecimalNumber)decimalNumberByAdding:(CPDecimalNumber)decimalNumber withBehavior:(id <CPDecimalNumberBehaviors>)behavior
|
||||
@@ -394,7 +374,7 @@ _cappdefaultDcmHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundin
|
||||
|
||||
- (CPDecimalNumber)decimalNumberBySubtracting:(CPDecimalNumber)decimalNumber
|
||||
{
|
||||
return [self decimalNumberBySubtracting:decimalNumber withBehavior:_cappdefaultDcmHandler];
|
||||
return [self decimalNumberBySubtracting:decimalNumber withBehavior:CPDefaultDcmHandler];
|
||||
}
|
||||
|
||||
- (CPDecimalNumber)decimalNumberBySubtracting:(CPDecimalNumber)decimalNumber withBehavior:(id <CPDecimalNumberBehaviors>)behavior
|
||||
@@ -414,7 +394,7 @@ _cappdefaultDcmHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundin
|
||||
|
||||
- (CPDecimalNumber)decimalNumberByDividingBy:(CPDecimalNumber)decimalNumber
|
||||
{
|
||||
return [self decimalNumberByDividingBy:decimalNumber withBehavior:_cappdefaultDcmHandler];
|
||||
return [self decimalNumberByDividingBy:decimalNumber withBehavior:CPDefaultDcmHandler];
|
||||
}
|
||||
|
||||
- (CPDecimalNumber)decimalNumberByDividingBy:(CPDecimalNumber)decimalNumber withBehavior:(id <CPDecimalNumberBehaviors>)behavior
|
||||
@@ -434,7 +414,7 @@ _cappdefaultDcmHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundin
|
||||
|
||||
- (CPDecimalNumber)decimalNumberByMultiplyingBy:(CPDecimalNumber)decimalNumber
|
||||
{
|
||||
return [self decimalNumberByMultiplyingBy:decimalNumber withBehavior:_cappdefaultDcmHandler];
|
||||
return [self decimalNumberByMultiplyingBy:decimalNumber withBehavior:CPDefaultDcmHandler];
|
||||
}
|
||||
|
||||
- (CPDecimalNumber)decimalNumberByMultiplyingBy:(CPDecimalNumber)decimalNumber withBehavior:(id <CPDecimalNumberBehaviors>)behavior
|
||||
@@ -454,7 +434,7 @@ _cappdefaultDcmHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundin
|
||||
|
||||
- (CPDecimalNumber)decimalNumberByMultiplyingByPowerOf10:(short)power
|
||||
{
|
||||
return [self decimalNumberByMultiplyingByPowerOf10:power withBehavior:_cappdefaultDcmHandler];
|
||||
return [self decimalNumberByMultiplyingByPowerOf10:power withBehavior:CPDefaultDcmHandler];
|
||||
}
|
||||
|
||||
- (CPDecimalNumber)decimalNumberByMultiplyingByPowerOf10:(short)power withBehavior:(id <CPDecimalNumberBehaviors>)behavior
|
||||
@@ -474,7 +454,7 @@ _cappdefaultDcmHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundin
|
||||
|
||||
- (CPDecimalNumber)decimalNumberByRaisingToPower:(unsigned)power
|
||||
{
|
||||
return [self decimalNumberByRaisingToPower:power withBehavior:_cappdefaultDcmHandler];
|
||||
return [self decimalNumberByRaisingToPower:power withBehavior:CPDefaultDcmHandler];
|
||||
}
|
||||
|
||||
- (CPDecimalNumber)decimalNumberByRaisingToPower:(unsigned)power withBehavior:(id <CPDecimalNumberBehaviors>)behavior
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
- (void)testdefaultDecimalNumberHandler
|
||||
{
|
||||
[self assert:_cappdefaultDcmHandler equals:[CPDecimalNumberHandler defaultDecimalNumberHandler] message:"T1 defaultDecimalNumberHandler returned different handler than the current default"];
|
||||
[self assertTrue:[CPDecimalNumberHandler defaultDecimalNumberHandler] message:"T1 defaultDecimalNumberHandler returned nothing"];
|
||||
}
|
||||
|
||||
- (void)testroundingMode
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
[self assert:NO equals:dcm._isNegative message:"decimalNumberWithMantissa:exponent:isNegative: - sign"];
|
||||
|
||||
// Def behavior
|
||||
[self assert:[CPDecimalNumber defaultBehavior] equals:_cappdefaultDcmHandler message:"defaultBehavior: - returned different object"];
|
||||
[self assertTrue:[CPDecimalNumber defaultBehavior] message:"defaultBehavior: - returned nothing"];
|
||||
|
||||
[CPDecimalNumber setDefaultBehavior:_dcmnhWithExactness];
|
||||
[self assertTrue:[CPDecimalNumber defaultBehavior]._raiseOnExactness message:"setDefaultBehavior: - new behavior not set"];
|
||||
|
||||
Reference in new issue
Block a user