/**
   * Removes from the receiver all elements that are contained in the specified list. Tests for
   * identity.
   *
   * @param other the other list.
   * @return <code>true</code> if the receiver changed as a result of the call.
   */
  public boolean removeAll(AbstractShortList other) {
    // overridden for performance only.
    if (!(other instanceof ShortArrayList)) return super.removeAll(other);

    /*
     * There are two possibilities to do the thing a) use other.indexOf(...)
     * b) sort other, then use other.binarySearch(...)
     *
     * Let's try to figure out which one is faster. Let M=size,
     * N=other.size, then a) takes O(M*N) steps b) takes O(N*logN + M*logN)
     * steps (sorting is O(N*logN) and binarySearch is O(logN))
     *
     * Hence, if N*logN + M*logN < M*N, we use b) otherwise we use a).
     */
    if (other.size() == 0) {
      return false;
    } // nothing to do
    int limit = other.size() - 1;
    int j = 0;
    short[] theElements = elements;
    int mySize = size();

    double N = (double) other.size();
    double M = (double) mySize;
    if ((N + M) * cern.jet.math.Arithmetic.log2(N) < M * N) {
      // it is faster to sort other before searching in it
      ShortArrayList sortedList = (ShortArrayList) other.clone();
      sortedList.quickSort();

      for (int i = 0; i < mySize; i++) {
        if (sortedList.binarySearchFromTo(theElements[i], 0, limit) < 0)
          theElements[j++] = theElements[i];
      }
    } else {
      // it is faster to search in other without sorting
      for (int i = 0; i < mySize; i++) {
        if (other.indexOfFromTo(theElements[i], 0, limit) < 0) theElements[j++] = theElements[i];
      }
    }

    boolean modified = (j != mySize);
    setSize(j);
    return modified;
  }
 /**
  * Replaces a number of elements in the receiver with the same number of elements of another list.
  * Replaces elements in the receiver, between <code>from</code> (inclusive) and <code>to</code>
  * (inclusive), with elements of <code>other</code>, starting from <code>otherFrom</code>
  * (inclusive).
  *
  * @param from the position of the first element to be replaced in the receiver
  * @param to the position of the last element to be replaced in the receiver
  * @param other list holding elements to be copied into the receiver.
  * @param otherFrom position of first element within other list to be copied.
  */
 public void replaceFromToWithFrom(int from, int to, AbstractShortList other, int otherFrom) {
   // overridden for performance only.
   if (!(other instanceof ShortArrayList)) {
     // slower
     super.replaceFromToWithFrom(from, to, other, otherFrom);
     return;
   }
   int length = to - from + 1;
   if (length > 0) {
     checkRangeFromTo(from, to, size());
     checkRangeFromTo(otherFrom, otherFrom + length - 1, other.size());
     System.arraycopy(((ShortArrayList) other).elements, otherFrom, elements, from, length);
   }
 }