package jmathlib.core.tokens;
import jmathlib.core.interpreter.*;
import jmathlib.core.tokens.numbertokens.*;
import java.util.*;
/** */
public class MathLibObject extends DataToken
{
/**An array of all the data stored in the structure*/
private HashMap fields;
/**Create a new structure*/
public MathLibObject()
{
super(10, "struct");
fields = new HashMap();
}
/**Create a structure and copy it's data from another structure
@param oldVal = the structure to copy the values from*/
public MathLibObject(MathLibObject oldVal)
{
super(10, "struct");
fields = ((HashMap)oldVal.getFieldsHash().clone());
}
/**Set the value of one of the structures fields
@param fieldName = the name of the field to set
@param value = the value to set the field to*/
public void setField(String fieldName, OperandToken value)
{
Variable var = ((Variable)fields.get(fieldName));
if(var == null)
{
var = new Variable(fieldName, value);
fields.put(fieldName, var);
}
var.assign(value);
}
/**Get the value of a particular field
@param fieldName = the name of the field
@return the fields data*/
public OperandToken getFieldData(String fieldName)
{
ErrorLogger.debugLine("getfield");
Variable var = ((Variable)fields.get(fieldName));
if(var != null)
return var.getData();
return null;
}
/**Get the value of a particular field
@param fieldName = the name of the field
@return a variable pointing to the fields data*/
public Variable getFieldVariable(String fieldName)
{
Variable var = ((Variable)fields.get(fieldName));
if(var != null)
{
ErrorLogger.debugLine("getting field data");
return var;
}
return null;
}
/**@return a list of all fields*/
public Iterator getFields()
{
return fields.entrySet().iterator();
}
/**@return a list of all fields*/
public HashMap getFieldsHash()
{
return fields;
}
/**Turns the structure into a string*/
public String toString()
{
String result = "[";
Set entries = fields.entrySet();
Iterator iter = entries.iterator();
while(iter.hasNext())
{
Map.Entry entry = (Map.Entry)iter.next();
result += entry.getKey() + " = " + entry.getValue();
if(iter.hasNext())
result += ", ";
}
result += "]";
return result;
}
/**Evaluates the structure
@return the structure itself*/
public OperandToken evaluate(Token[] operands, GlobalValues globals)
{
return this;
}
/**
* @param
* @return
*/
public OperandToken add(OperandToken arg)
{
MathLibObject result = new MathLibObject(this);
if(arg instanceof MathLibObject)
{
Iterator argFields = ((MathLibObject)arg).getFields();
while(argFields.hasNext())
{
Variable var = ((Variable)((Map.Entry)argFields.next()).getValue());
String fieldName = var.getName();
OperandToken data = getFieldData(fieldName);
if(data != null)
{
result.setField(fieldName, data.add(var.getData()));
}
else
{
result.setField(fieldName, var.getData());
}
}
}
return result;
}
/**
* @param
* @return
*/
public OperandToken subtract(OperandToken arg)
{
MathLibObject result = new MathLibObject(this);
if(arg instanceof MathLibObject)
{
Iterator argFields = ((MathLibObject)arg).getFields();
while(argFields.hasNext())
{
Variable var = ((Variable)((Map.Entry)argFields.next()).getValue());
String fieldName = var.getName();
OperandToken data = getFieldData(fieldName);
if(data != null)
{
result.setField(fieldName, data.subtract(var.getData()));
}
else
{
NumberToken temp = DoubleNumberToken.zero;
result.setField(fieldName, temp.subtract(var.getData()));
}
}
}
return result;
}
/**
* @param arg
* @return
*/
public OperandToken multiply(OperandToken arg)
{
MathLibObject result = new MathLibObject(this);
if(arg instanceof MathLibObject)
{
Iterator argFields = ((MathLibObject)arg).getFields();
while(argFields.hasNext())
{
Variable var = ((Variable)((Map.Entry)argFields.next()).getValue());
String fieldName = var.getName();
OperandToken data = getFieldData(fieldName);
if(data != null)
{
result.setField(fieldName, data.multiply(var.getData()));
}
else
{
result.setField(fieldName, DoubleNumberToken.zero);
}
}
}
return result;
}
/**
* @param
* @return
*/
public OperandToken divide(OperandToken arg)
{
MathLibObject result = new MathLibObject(this);
if(arg instanceof MathLibObject)
{
Iterator argFields = ((MathLibObject)arg).getFields();
while(argFields.hasNext())
{
Variable var = ((Variable)((Map.Entry)argFields.next()).getValue());
String fieldName = var.getName();
OperandToken data = getFieldData(fieldName);
if(data != null)
{
result.setField(fieldName, data.divide(var.getData()));
}
else
{
result.setField(fieldName, DoubleNumberToken.zero);
}
}
}
return result;
}
/**
* @param
*/
public OperandToken power(OperandToken arg)
{
MathLibObject result = new MathLibObject(this);
if(arg instanceof MathLibObject)
{
Iterator argFields = ((MathLibObject)arg).getFields();
while(argFields.hasNext())
{
Variable var = ((Variable)((Map.Entry)argFields.next()).getValue());
String fieldName = var.getName();
OperandToken data = getFieldData(fieldName);
if(data != null)
{
result.setField(fieldName, data.power(var.getData()));
}
else
{
result.setField(fieldName, DoubleNumberToken.zero);
}
}
}
return result;
}
}