void removeAll(@NotNull Predicate<? super T> shouldRemove) {
    int o;
    if (head <= tail) {
      // shift alive items in [head..tail) left to head
      o = head;
      for (int i=head; i<tail; i++) {
        T info = getAndNullize(i);
        if (!shouldRemove.test(info)) {
          myQueue[o++] = info;
        }
      }
    }
    else {
      // shift living items in [head..capacity) right
      o = myQueue.length;
      for (int i= myQueue.length-1; i>=head; i--) {
        T info = getAndNullize(i);
        if (!shouldRemove.test(info)) {
          myQueue[--o] = info;
        }
      }
      head = o % myQueue.length;
      // shift alive items in [0..tail) left to 0
      o = 0;
      for (int i=0; i<tail; i++) {
        T info = getAndNullize(i);
        if (!shouldRemove.test(info)) {
          myQueue[o++] = info;
        }
      }
    }
    tail = o;
  }
void removeAll(@NotNull Predicate<? super T> shouldRemove)