//
//  EXPSymbolTable.m
//  SimpleCalc
//
//  Created by Ashley on 03/04/2006.
//  Copyright 2006 __MyCompanyName__. All rights reserved.
//

#import "EXPExpression.h"
//#import "EXPConstant.h"
#import "EXPSymbolTable.h"

@implementation EXPSymbolTable

- (id) init
{
	[super init];
	
	_symbolTable = [[NSMutableDictionary alloc] init];
	_nextParamAddress = 0;
	_nextVariableAddress = 0;
	_parentTable = nil;
	
	return self;
}

- (void) resetSymbolTable
{
	[[self table] removeAllObjects];
}

- (NSMutableDictionary *)table
{
	return _symbolTable;
}

- (void) setParentTable:(id)parentTable
{
	_parentTable = parentTable;
}

- (id) parentTable
{
	return _parentTable;
}

- (int) nextParamAddress
{
	return _nextParamAddress;
}

- (void) setNextParamAddress:(int)nextParamAddress
{
	_nextParamAddress = nextParamAddress;
}

- (void) incParamAddress
{
	_nextParamAddress++;
}

- (int) nextVariableAddress
{
	return _nextVariableAddress;
}

- (void) setNextVariableAddress:(int)nextVariableAddress
{
	_nextVariableAddress = nextVariableAddress;
}

- (void) incVariableAddress
{
	_nextVariableAddress++;
}

- (id) symbolForName:(NSString *) symbolName
{
	id entry = [[self table] objectForKey:symbolName];
	if (entry==nil) {
		entry = [[self parentTable] symbolForName:symbolName];
	}
	return entry;
}

- (void) setSymbolForName:(NSString *) symbolName withEntry:(id) entry
{
	[_symbolTable setObject:entry forKey:symbolName];
}

- (BOOL) declareSymbol:(id) entry
{
	NSString *name = [entry name];
	if ([_symbolTable objectForKey:name]==nil) {
		[_symbolTable setObject:entry forKey:name];
		return YES;
	} else {
		return NO;
	}
}

- (double *) constants
{
	return _constants;
}

- (void) setConstants:(double *)constants
{
	_constants = constants;
}

- (double *) state
{
	return _state;
}

- (void) setState:(double *)state
{
	_state = state;
}

- (double *) gradients
{
	return _gradients;
}

- (void) setGradients:(double *)gradients
{
	_gradients = gradients;
}

/*- (void) loadConstant:(NSString *)name withValue:(double)value
{
	EXPConstant *constant = [[EXPConstant alloc] initWithName:name];
	[constant setValue:value];
	[self setSymbolForName:name withEntry:constant];
	[constant release];
}

- (void) loadConstants
{
	[self loadConstant:@"e" withValue:2.718281828459045235360287471352662497757247093699959574966];
	[self loadConstant:@"pi" withValue:3.14159265358979323846264338327950288419716939937510582097];
	[self loadConstant:@"gamma" withValue:0.577215664901532861];
	[self loadConstant:@"cvacuum" withValue:299792458];
	[self loadConstant:@"mu0" withValue:1.25663706144e-6];
	[self loadConstant:@"epsilon0" withValue:8.854187817e-12];
	[self loadConstant:@"h" withValue:6.6260755e-34];
	
} */

- (void) dump
{
	NSEnumerator *enumerator = [_symbolTable objectEnumerator];
	id symbol;
	while (symbol = [enumerator nextObject]) {
		[symbol dump];
	} 
}

- (NSString *)description
{
	NSMutableString *desc = [NSMutableString string];
	NSEnumerator *enumerator = [[self table] objectEnumerator];
	id symbol;
	while (symbol = [enumerator nextObject]) {
		[desc appendFormat:@"%@ = %@\n", [symbol name], [symbol description]];
	}
	return desc;
}

- (void) dealloc
{
//	printf("EXPSymbolTable - (void)dealloc\n");
	[_symbolTable release];
//	[_builtins release];
	[super dealloc];
}

@end