/** ************************************************************************** */
  private void insertIndirectionAndPrediction(boolean isPrediction, int position) {

    int[] newIndirection = new int[indirection.length + 1];
    boolean[] newPrediction = new boolean[newIndirection.length];

    for (int i = 0; i < position; i++) {
      newIndirection[i] = indirection[i];
      newPrediction[i] = prediction[i];
    }

    if (isPrediction) {
      if (newTableHackVariable) newIndirection[position] = 0;
      else newIndirection[position] = predictionColumnsTable.getNumColumns();
    } else newIndirection[position] = original.getNumColumns();

    newPrediction[position] = isPrediction;

    for (int i = position + 1; i < newIndirection.length; i++) {
      newIndirection[i] = indirection[i - 1];
      newPrediction[i] = prediction[i - 1];
    }

    indirection = newIndirection;
    prediction = newPrediction;

    // also might need to modify predictionSet
    if (isPrediction) {

      int[] newPredictionSet = new int[predictionSet.length + 1];
      for (int i = 0; i < predictionSet.length; i++) newPredictionSet[i] = predictionSet[i];
      newPredictionSet[predictionSet.length] = getNumColumns();

      predictionSet = newPredictionSet;
    }

    for (int i = 0; i < predictionSet.length; i++)
      if (predictionSet[i] > position) predictionSet[i]++;

    // Arrays.sort(predictionSet);

  }
  public int getNumColumns() {
    if (newTableHackVariable) return original.getNumColumns();

    return (original.getNumColumns() + predictionColumnsTable.getNumColumns());
  }