/**
   * Returns a copy of this deque.
   *
   * @return a copy of this deque
   */
  public ArrayDeque<E> clone() {
    try {
      @SuppressWarnings("unchecked")
      ArrayDeque<E> result = (ArrayDeque<E>) super.clone();
      result.elements = Arrays.copyOf(elements, elements.length);
      return result;

    } catch (CloneNotSupportedException e) {
      throw new AssertionError();
    }
  }