From 5a0cfc1595cba3fa1da9026b35e2aa893495a9b7 Mon Sep 17 00:00:00 2001 From: Stephen Ierodiaconou Date: Thu, 2 Dec 2010 19:33:34 +0200 Subject: [PATCH] Make default number hanler file global only and Improvements and optimisations for CPDecimalNumber --- Foundation/CPDecimal.j | 21 ++++++ Foundation/CPDecimalNumber.j | 72 +++++++------------ Tests/Foundation/CPDecimalNumberHandlerTest.j | 2 +- Tests/Foundation/CPDecimalNumberTest.j | 2 +- 4 files changed, 49 insertions(+), 48 deletions(-) diff --git a/Foundation/CPDecimal.j b/Foundation/CPDecimal.j index 6ff74eb81..75a68047c 100644 --- a/Foundation/CPDecimal.j +++ b/Foundation/CPDecimal.j @@ -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. diff --git a/Foundation/CPDecimalNumber.j b/Foundation/CPDecimalNumber.j index 44345e668..f43eb4ff5 100644 --- a/Foundation/CPDecimalNumber.j +++ b/Foundation/CPDecimalNumber.j @@ -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 )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 )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 )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 )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 )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 )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 )behavior diff --git a/Tests/Foundation/CPDecimalNumberHandlerTest.j b/Tests/Foundation/CPDecimalNumberHandlerTest.j index 88a15a9e2..d018cdd35 100644 --- a/Tests/Foundation/CPDecimalNumberHandlerTest.j +++ b/Tests/Foundation/CPDecimalNumberHandlerTest.j @@ -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 diff --git a/Tests/Foundation/CPDecimalNumberTest.j b/Tests/Foundation/CPDecimalNumberTest.j index 5ceff6211..b57de77b1 100644 --- a/Tests/Foundation/CPDecimalNumberTest.j +++ b/Tests/Foundation/CPDecimalNumberTest.j @@ -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"];