package tim.prune.data;
/**
* Class to hold an ordered list of fields
* to match the value list in a data point
*/
public class FieldList
{
/** Array of Field objects making the list */
private Field[] _fieldArray;
/**
* Constructor for an empty field list
*/
public FieldList()
{
_fieldArray = new Field[0];
}
/**
* Constructor for a given number of empty fields
* @param inNumFields
*/
public FieldList(int inNumFields)
{
if (inNumFields < 0) inNumFields = 0;
_fieldArray = new Field[inNumFields];
}
/**
* Constructor giving array of Field objects
* @param inFieldArray array of Field objects
*/
public FieldList(Field[] inFieldArray)
{
if (inFieldArray == null || inFieldArray.length == 0)
{
_fieldArray = new Field[0];
}
else
{
_fieldArray = new Field[inFieldArray.length];
System.arraycopy(inFieldArray, 0, _fieldArray, 0, inFieldArray.length);
}
}
/**
* Get the index of the given field
* @param inField field to look for
* @return index number of the field starting at zero
*/
public int getFieldIndex(Field inField)
{
if (inField == null) return -1;
for (int f=0; f<_fieldArray.length; f++)
{
if (_fieldArray[f] != null && _fieldArray[f].equals(inField))
return f;
}
return -1;
}
/**
* Check whether the FieldList contains the given Field object
* @param inField Field to check
* @return true if the FieldList contains the given field
*/
public boolean contains(Field inField)
{
return (getFieldIndex(inField) >= 0);
}
/**
* @return number of fields in list
*/
public int getNumFields()
{
if (_fieldArray == null) return 0;
return _fieldArray.length;
}
/**
* Get the specified Field object
* @param inIndex index to retrieve
* @return Field object
*/
public Field getField(int inIndex)
{
if (_fieldArray == null || inIndex < 0 || inIndex >= _fieldArray.length)
{
return null;
}
return _fieldArray[inIndex];
}
/**
* Merge this list with a second list, giving a superset
* @param inOtherList other FieldList object to merge
* @return Merged FieldList object
*/
public FieldList merge(FieldList inOtherList)
{
// count number of fields
int totalFields = _fieldArray.length;
for (int f=0; f<inOtherList._fieldArray.length; f++)
{
if (inOtherList._fieldArray[f] != null && !contains(inOtherList._fieldArray[f]))
{
totalFields++;
}
}
FieldList list = new FieldList(totalFields);
// copy these fields into array
System.arraycopy(_fieldArray, 0, list._fieldArray, 0, _fieldArray.length);
// copy additional fields from other array if any
if (totalFields > _fieldArray.length)
{
int fieldCounter = _fieldArray.length;
for (int f=0; f<inOtherList._fieldArray.length; f++)
{
if (inOtherList._fieldArray[f] != null && !contains(inOtherList._fieldArray[f]))
{
list._fieldArray[fieldCounter] = inOtherList._fieldArray[f];
fieldCounter++;
}
}
}
// return the merged list
return list;
}
/**
* Extend the field list to include the specified field
* @param inField Field to add
* @return new index of added Field
*/
public int extendList(Field inField)
{
// See if field is already in list
int currIndex = getFieldIndex(inField);
if (currIndex >= 0) return currIndex;
// Need to extend - increase array size
int oldNumFields = _fieldArray.length;
Field[] fields = new Field[oldNumFields + 1];
System.arraycopy(_fieldArray, 0, fields, 0, oldNumFields);
_fieldArray = fields;
// Add new field and return index
_fieldArray[oldNumFields] = inField;
return oldNumFields;
}
/**
* Convert to String for debug
*/
public String toString()
{
StringBuffer buffer = new StringBuffer();
buffer.append('(');
for (int i=0; i<_fieldArray.length; i++)
{
buffer.append(_fieldArray[i].getName()).append(',');
}
buffer.append(')');
return buffer.toString();
}
}