package edu.berkeley.cs.succinct.util.stream.serops;
import edu.berkeley.cs.succinct.util.stream.IntArrayStream;
import edu.berkeley.cs.succinct.util.stream.LongArrayStream;
import java.io.IOException;
public class ArrayOps {
/**
* Get rank1 value at specified index in serialized Long array.
*
* @param arrayBuf Serialized Long array.
* @param startPos Start position.
* @param size Size of array.
* @param i Rank query.
* @return Value of rank1 for query.
*/
public static int getRank1(LongArrayStream arrayBuf, int startPos, int size, long i)
throws IOException {
int sp = 0, ep = size - 1;
int m;
while (sp <= ep) {
m = (sp + ep) / 2;
if (arrayBuf.get(startPos + m) == i) {
return m + 1;
} else if (i < arrayBuf.get(startPos + m)) {
ep = m - 1;
} else {
sp = m + 1;
}
}
return ep + 1;
}
/**
* Get rank1 value at specified index in serialized Int array.
*
* @param arrayBuf Serialized Int array.
* @param startPos Start position.
* @param size Size of array.
* @param i Rank query.
* @return Value of rank1 for query.
*/
public static int getRank1(IntArrayStream arrayBuf, int startPos, int size, int i)
throws IOException {
int sp = 0, ep = size - 1;
int m;
while (sp <= ep) {
m = (sp + ep) / 2;
if (arrayBuf.get(startPos + m) == i) {
return m + 1;
} else if (i < arrayBuf.get(startPos + m)) {
ep = m - 1;
} else {
sp = m + 1;
}
}
return ep + 1;
}
}