@Override
 public RoaringArray clone() throws CloneNotSupportedException {
   RoaringArray sa;
   sa = (RoaringArray) super.clone();
   sa.array = Arrays.copyOf(this.array, this.size);
   for (int k = 0; k < this.size; ++k) sa.array[k] = sa.array[k].clone();
   sa.size = this.size;
   return sa;
 }
  /**
   * Append copies of the values AFTER a specified key (may or may not be present) to end.
   *
   * @param sa the other array
   * @param beforeStart given key is the largest key that we won't copy
   */
  protected void appendCopiesAfter(RoaringArray sa, short beforeStart) {
    int startLocation = sa.getIndex(beforeStart);
    if (startLocation >= 0) startLocation++;
    else startLocation = -startLocation - 1;
    extendArray(sa.size - startLocation);

    for (int i = startLocation; i < sa.size; ++i) {
      this.array[this.size++] = new Element(sa.array[i].key, sa.array[i].value.clone());
    }
  }