//
//  EXPDimensionedElement.m
//  dde
//
//  Created by Ashley on 23/07/2007.
//  Copyright 2007 __MyCompanyName__. All rights reserved.
//

#import "EXPDimensionedElement.h"
#import "EXPDimensionItemElement.h"
#import "EXPDimensionElement.h"
#import "EXPConstant.h"
#import "EXPParser.h"
#import "EXPError.h"

@implementation EXPDimensionedElement

- (id) init
{
	self = [super init];
	if (self!=nil) {
		_dimensions = [[NSMutableArray alloc] init];
	}
	
	return self;
}

/* - (BOOL) setElementFromParser:(EXPParser *)parser symbolTable:(EXPSymbolTable *)symbolTable error:(EXPError *)error
{
	BOOL success = [super setElementFromParser:parser symbolTable:symbolTable error:error];

	if ([parser testSymbol:@"["]) {
		do {
			EXPDimensionElement *dimension = [EXPNamedElement getElementFromParser:parser symbolTable:symbolTable error:error];
//			NSLog(@"%@", dimension);
//			if ([dimension isKindOfClass:[EXPDimensionElement class]]) {
			if ([[dimension elementType] isEqualToString:@"dimension"]) {
				[self addDimension:dimension];
			} else {
				[error addError:[NSString stringWithFormat:@"Dimension expected %@...", [dimension name]] atLine:[parser lineNumber]];
			}
			
		} while ([parser testSymbol:@","]);
		
		[parser checkSymbol:@"]"];

	}
	
	return success;
} */

- (void) setDimensions:(id)dimensions
{
	[dimensions retain];
	[_dimensions release];
	_dimensions = dimensions;
}

- (id) dimensions
{
	return _dimensions;
}

- (void) addDimension:(id)dimension
{
	[[self dimensions] addObject:dimension];
}

- (int) numberOfElements
{
	NSArray *dimensions = [self dimensions];
	int nElements = 0;
	if ([dimensions count]==0) {
		 nElements = 1;
	} else {
		int i;
		for(i=0; i<[dimensions count]; i++) {
			EXPDimensionElement *dimension = [dimensions objectAtIndex:i];
			nElements += [dimension nElements];
		}
	}
	
	return nElements;
}

- (id) indices
{
	return _dimensions;
}

- (unsigned int) length
{
	return [self numberOfElements]*[[self class] storageSize];
}

- (BOOL) isArray
{
	return [[self dimensions] count]>0;
}

/*- (BOOL) compileIndexOffset:(EXPVirtualMachine *)machine indices:(NSArray *)indices error:(EXPError *)err
{
	BOOL success = YES;
	
	NSArray *dimensions = [self dimensions];
	EXPElement *item = [indices objectAtIndex:0];
	EXPDimensionElement *dimension = [dimensions objectAtIndex:0];
	int index = [dimension indexOfItem:item];
	EXPConstant *indexConstant = [[EXPConstant alloc] initWithName:@""];
	[indexConstant setValue:index];

	EXPExpression *indexExp = indexConstant;

	int i;
	for(i=1; i<[indices count]; i++) {
		item = [indices objectAtIndex:i];
		dimension = [dimensions objectAtIndex:i];
		index = [dimension indexOfItem:item];
		NSLog(@"%@", index);
	}
	
	return success;
} */

- (void) dealloc
{
	[_dimensions release];
	[super dealloc];
}

@end