| // Copyright 2015 Google Inc. All rights reserved. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| #import "Equation.h" | |
| @implementation Equation { | |
| NSMutableArray *_children; | |
| } | |
| @synthesize operation = _operation; | |
| - (id)init { | |
| [self doesNotRecognizeSelector:_cmd]; | |
| return nil; | |
| } | |
| - (id)initWithOperation:(Operation)operation { | |
| self = [super init]; | |
| if (self) { | |
| _children = [NSMutableArray array]; | |
| _operation = operation; | |
| } | |
| return self; | |
| } | |
| - (NSArray *)children { | |
| return [_children copy]; | |
| } | |
| - (void)addExpressionAsChild:(Expression *)child { | |
| [_children addObject:child]; | |
| } | |
| - (double)calculate { | |
| if ([_children count] == 1) { | |
| return (_operation == kSubtract) | |
| ? -[_children[0] calculate] : [_children[0] calculate]; | |
| } else if ([_children count] == 0) { | |
| return (_operation == kSubtract || _operation == kAdd) ? 0 : 1; | |
| } | |
| double value = [_children[0] calculate]; | |
| for (Equation *child in [_children subarrayWithRange: | |
| NSMakeRange(1, [_children count] - 1)]) { | |
| double childValue = [child calculate]; | |
| switch (_operation) { | |
| case kAdd: | |
| value += childValue; | |
| break; | |
| case kSubtract: | |
| value -= childValue; | |
| break; | |
| case kMultiply: | |
| value *= childValue; | |
| break; | |
| case kDivide: | |
| value /= childValue; | |
| break; | |
| } | |
| } | |
| return value; | |
| } | |
| - (NSString *)description { | |
| NSMutableString *result = [[NSMutableString alloc] init]; | |
| [result appendString:@"("]; | |
| switch (_operation) { | |
| case kAdd: | |
| [result appendString:@"+"]; | |
| break; | |
| case kSubtract: | |
| [result appendString:@"-"]; | |
| break; | |
| case kMultiply: | |
| [result appendString:@"*"]; | |
| break; | |
| case kDivide: | |
| [result appendString:@"/"]; | |
| break; | |
| } | |
| for (Equation *child in _children) { | |
| [result appendString:@" "]; | |
| [result appendString:[child description]]; | |
| } | |
| [result appendString:@")"]; | |
| return [result copy]; | |
| } | |
| - (BOOL)isEqual:(id)object { | |
| if (![object isKindOfClass:[self class]]) { | |
| return NO; | |
| } | |
| Equation *other = object; | |
| return other->_operation == _operation && | |
| [other->_children isEqual:_children]; | |
| } | |
| @end |