content: package edu.berkeley.cs.succinct;
  
  import edu.berkeley.cs.succinct.regex.parser.RegExParsingException;
  import edu.berkeley.cs.succinct.util.Source;
  import edu.berkeley.cs.succinct.util.container.Range;
  
  import java.util.Comparator;
  import java.util.Iterator;
  
  public interface SuccinctIndexedFile extends SuccinctFile {
  
    /**
     * Search for offset corresponding to a position in the input.
     *
     * @param pos Position in the input
     * @return Offset corresponding to the position.
     */
    int offsetToRecordId(int pos);
  
    /**
     * Get the number of records.
     *
     * @return The number of records.
     */
    int getNumRecords();
  
    /**
     * Get the offset for a given recordId
     *
     * @param recordId The record id.
     * @return The corresponding offset.
     */
    int getRecordOffset(int recordId);
  
    /**
     * Get the record for a given recordId.
     *
     * @param recordId The record id.
     * @return The corresponding record.
     */
    byte[] getRecordBytes(int recordId);
  
    /**
     * Get random access into record.
     *
     * @param recordId The record id.
     * @param offset   Offset into record.
     * @param length   Number of bytes to fetch.
     * @return The extracted data.
     */
    byte[] extractRecordBytes(int recordId, int offset, int length);
  
    /**
     * Get the record for a given recordId.
     *
     * @param recordId The record id.
     * @return The corresponding record.
     */
    String getRecord(int recordId);
  
    /**
     * Get random access into record.
     *
     * @param recordId The record id.
     * @param offset   Offset into record.
     * @param length   Number of bytes to fetch.
     * @return The extracted data.
     */
    String extractRecord(int recordId, int offset, int length);
  
    /**
     * Search for an input query and return ids of all matching records.
     *
     * @param query Input query.
     * @return Ids of all matching records.
     */
    Integer[] recordSearchIds(Source query);
  
    /**
     * Search for an input query and return ids of all matching records.
     *
     * @param query Input query.
     * @return Ids of all matching records.
     */
    Integer[] recordSearchIds(byte[] query);
  
    /**
     * Search for an input query and return ids of all matching records.
     *
     * @param query Input query.
     * @return Ids of all matching records.
     */
    Integer[] recordSearchIds(char[] query);
  
    /**
     * Search for an input query and return an iterator over ids of all matching records.
     *
     * @param query Input query.
     * @return Iterator over ids of all matching records
     */
    Iterator<Integer> recordSearchIdIterator(Source query);
  
    /**
     * Search for an input query and return an iterator over ids of all matching records.
     *
     * @param query Input query.
     * @return Iterator over ids of all matching records
     */
    Iterator<Integer> recordSearchIdIterator(byte[] query);
  
    /**
     * Search for an input query and return an iterator over ids of all matching records.
     *
     * @param query Input query.
     * @return Iterator over ids of all matching records
     */
    Iterator<Integer> recordSearchIdIterator(char[] query);
  
    /**
     * Search for all records that contain a particular regular expression.
     *
     * @param query The regular expression (UTF-8 encoded).
     * @return The record ids corresponding to records that contain the regular search expression.
     * @throws RegExParsingException
     */
    Integer[] recordSearchRegexIds(String query) throws RegExParsingException;
  
    /**
     * Comparator for range objects based on the size of the range.
     */
    class RangeSizeComparator implements Comparator<Range> {
      @Override public int compare(Range r1, Range r2) {
        return (int) ((r1.second - r1.first) - (r2.second - r2.first));
      }
    }
  
  }
  