Skip to content

Commit

Permalink
DDMathEvaluator.angleMeasurementMode. Fixes issue #29.
Browse files Browse the repository at this point in the history
DDMathEvaluator has a new property to specify that the arguments to the trigonometric functions should be interpreted as being in degrees versus radians (the default).
  • Loading branch information
davedelong committed Aug 31, 2012
1 parent 3351b50 commit 29073d7
Show file tree
Hide file tree
Showing 8 changed files with 141 additions and 37 deletions.
2 changes: 2 additions & 0 deletions Command line demo/main.m
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ int main (int argc, const char * argv[]) {

} while (1);

DD_RELEASE(evaluator);

printf("Goodbye!\n");

#if DD_HAS_ARC
Expand Down
1 change: 1 addition & 0 deletions DDMathParser/DDMathEvaluator+Private.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
@interface DDMathEvaluator ()

- (DDMathFunction) functionWithName:(NSString *)functionName;
- (id) variableWithName:(NSString *)variableName;

- (BOOL) functionExpressionFailedToResolve:(_DDFunctionExpression *)functionExpression error:(NSError **)error;

Expand Down
5 changes: 5 additions & 0 deletions DDMathParser/DDMathEvaluator.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,20 @@
@class DDExpression;

typedef DDMathFunction (^DDFunctionResolver)(NSString *);
typedef NSNumber* (^DDVariableResolver)(NSString *);

@interface DDMathEvaluator : NSObject {
NSMutableArray *functions;
NSMutableDictionary * functionMap;
NSMutableArray *rewriteRules;
DDFunctionResolver functionResolver;
DDVariableResolver variableResolver;
DDAngleMeasurementMode angleMeasurementMode;
}

@property (nonatomic) DDAngleMeasurementMode angleMeasurementMode; // default is Radians
@property (nonatomic, copy) DDFunctionResolver functionResolver;
@property (nonatomic, copy) DDVariableResolver variableResolver;

+ (id) sharedMathEvaluator;

Expand Down
12 changes: 12 additions & 0 deletions DDMathParser/DDMathEvaluator.m
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@ - (_DDFunctionContainer *)functionContainerWithName:(NSString *)functionName;

@implementation DDMathEvaluator

@synthesize angleMeasurementMode=angleMeasurementMode;
@synthesize functionResolver=functionResolver;
@synthesize variableResolver=variableResolver;

static DDMathEvaluator * _sharedEvaluator = nil;

Expand All @@ -47,6 +49,7 @@ - (id) init {
if (self) {
functions = [[NSMutableArray alloc] init];
functionMap = [[NSMutableDictionary alloc] init];
angleMeasurementMode = DDAngleMeasurementModeRadians;

[self _registerStandardFunctions];
}
Expand All @@ -62,6 +65,7 @@ - (void) dealloc {
[functionMap release];
[rewriteRules release];
[functionResolver release];
[variableResolver release];
[super dealloc];
#endif
}
Expand Down Expand Up @@ -126,6 +130,14 @@ - (BOOL) functionExpressionFailedToResolve:(_DDFunctionExpression *)functionExpr
return NO;
}

- (id) variableWithName:(NSString *)variableName {
id value = nil;
if (variableResolver != nil) {
value = variableResolver(variableName);
}
return value;
}

- (BOOL) addAlias:(NSString *)alias forFunctionName:(NSString *)functionName {
//we can't add an alias for a function that already exists
DDMathFunction function = [self functionWithName:alias];
Expand Down
2 changes: 1 addition & 1 deletion DDMathParser/DDMathStringToken.m
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ - (NSString *)debugDescription {
[d appendFormat:@"arity:%@, ", arityNames[arity]];

NSInteger precedence = [self operatorPrecedence];
[d appendFormat:@"precedence:%d, ", precedence];
[d appendFormat:@"precedence:%ld, ", precedence];

DDOperatorAssociativity assoc = [self operatorAssociativity];
NSString *assocNames[2] = { @"LEFT", @"RIGHT" };
Expand Down
7 changes: 6 additions & 1 deletion DDMathParser/DDTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,9 @@ typedef enum {
DDErrorCodeInvalidNumberOfArguments, //@"random() may only have up to 2 arguments"
DDErrorCodeInvalidArgument, //@"upper bound (%ld) of random() must be larger than lower bound (%ld)"

} DDErrorCode;
} DDErrorCode;

typedef enum {
DDAngleMeasurementModeRadians,
DDAngleMeasurementModeDegrees
} DDAngleMeasurementMode;
Loading

0 comments on commit 29073d7

Please sign in to comment.