/**
   * Compared the value represented by element and the one of row number <code>pos</code>. <code>
   * elements</code> will be converted to a compatible type to this column. if element > pos returns
   * 1. if element < pos retruns -1. if the are equal returns 0. if one of the representation does
   * not hold a value, it is considered smaller than the other.
   */
  public int compareRows(Object element, int pos) {

    // validating the objects to be compared
    int val = validate(element, pos);
    if (val <= 1) {
      return val;
    }

    // retrieving the object from pos
    Object obj = getObject(pos);

    // if they are of the smae type - comparing them
    if (element.getClass().equals(obj.getClass())) {
      return compareObjects(element, obj);
    }

    // if both are numbers - comparing them as doubles.
    if (element instanceof Number && obj instanceof Number) {
      return SparseDoubleColumn.compareDoubles(
          SparseDoubleColumn.toDouble(element), SparseDoubleColumn.toDouble(obj));
    }

    // they are probably not mutually comparable...
    // if this is an object column, i.e. the type of the objects is unknown
    // converting both of the objects into strings and comparing them
    if (ColumnTypes.OBJECT == getType()) {
      return SparseStringColumn.toStringObject(element)
          .compareTo(SparseStringColumn.toStringObject(obj));
    }

    // this is not an object column - converting element to the type of this
    // column, and comparing the objects.
    switch (getType()) {
      case (ColumnTypes.BYTE_ARRAY):
        element = SparseByteArrayColumn.toByteArray(element);
        break;
      case (ColumnTypes.CHAR_ARRAY):
        element = SparseCharArrayColumn.toCharArray(element);
        break;
      case (ColumnTypes.STRING):
        element = SparseStringColumn.toStringObject(element);
        break;
      default:
        break;
    }

    return compareObjects(element, obj);
  }
  /**
   * Inserts a new entry in the Column at position <code>pos</code>. All entries at row numbers
   * greater than <codE>pos</code> are moved down the column to the next row.
   *
   * @param newEntry the newEntry to insert
   * @param pos the position to insert at
   */
  public void insertRow(Object newEntry, int pos) {

    switch (getType()) {
      case ColumnTypes.BYTE_ARRAY:
        newEntry = SparseByteArrayColumn.toByteArray(newEntry);
        break;
      case ColumnTypes.CHAR_ARRAY:
        newEntry = SparseCharArrayColumn.toCharArray(newEntry);
        break;
      case ColumnTypes.STRING:
        newEntry = SparseStringColumn.toStringObject(newEntry);
        break;
    }

    super.insertRow(newEntry, pos);
  }
 /**
  * If the entry at pos is a byte[], return the byte[], otherwise convert the Object to a byte[] by
  * calling ByteUtils.writeObject()
  *
  * @param row the row number
  * @return the entry at pos as a byte[]. if no such entry exists returns null
  */
 public byte[] getBytes(int row) {
   Object obj = elements.get(row);
   return SparseByteArrayColumn.toByteArray(obj);
 }