All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.roaringbitmap.BatchIterator Maven / Gradle / Ivy

The newest version!
package org.roaringbitmap;

public interface BatchIterator extends Cloneable {

  /**
   * Writes the next batch of integers onto the buffer,
   * and returns how many were written. Aims to fill
   * the buffer.
   * @param buffer - the target to write onto
   * @return how many values were written during the call.
   */
  int nextBatch(int[] buffer);

  /**
   * Returns true is there are more values to get.
   * @return whether the iterator is exhaused or not.
   */
  boolean hasNext();

  /**
   * Creates a copy of the iterator.
   *
   * @return a clone of the current iterator
   */
  BatchIterator clone();

  /**
   * Creates a wrapper around the iterator so it behaves like an IntIterator
   * @param buffer - array to buffer bits into (size 128-256 should be best).
   * @return the wrapper
   */
  default IntIterator asIntIterator(int[] buffer) {
    return new BatchIntIterator(this, buffer);
  }

  /**
   * If needed, advance as long as the next value is smaller than minval
   *
   *  The advanceIfNeeded method is used for performance reasons, to skip
   *  over unnecessary repeated calls to next.
   *
   *  Suppose for example that you wish to compute the intersection between
   *  an ordered list of integers (e.g., int[] x = {1,4,5}) and a
   *  BatchIterator.
   *  You might do it as follows...
   *     

   *     int[] buffer = new int[128];
   *     BatchIterator j = // get an iterator
   *     int val = // first value from my other data structure
   *     j.advanceIfNeeded(val);
   *     while ( j.hasNext() ) {
   *       int limit = j.nextBatch(buffer);
   *       for (int i = 0; i < limit; i++) {
   *         if (buffer[i] == val) {
   *           // got it!
   *           // do something here
   *           val = // get next value?
   *         }
   *       }
   *       j.advanceIfNeeded(val);
   *     }
   *     
* * The benefit of calling advanceIfNeeded is that each such call * can be much faster than repeated calls to "next". The underlying * implementation can "skip" over some data. * * * @param target threshold */ void advanceIfNeeded(int target); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy