package org.basex.data; import java.util.Arrays; /** * This class contains full-text positions. * For each position, a pointer is stored. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class FTPos { /** Pre value. */ final int pre; /** Positions. */ int[] pos; /** Sorted flag. */ private boolean sorted = true; /** * Constructor. * @param p pre value * @param ps positions */ FTPos(final int p, final int[] ps) { pre = p; pos = ps; int x = -1; for(final int i : ps) { sorted = sorted && i >= x; x = i; if(!sorted) break; } } /** * Merges the specified position arrays. * @param ps positions */ void union(final int[] ps) { // skip existing values if(Arrays.equals(pos, ps)) return; // merge entries with the same pre value final int psl = ps.length; final int pol = pos.length; final int[] ts = new int[psl + pol]; for(int i = 0, si = 0, oi = 0; i < ts.length; ++i) { final boolean s = si == psl || oi < pol && pos[oi] < ps[si]; ts[i] = s ? pos[oi++] : ps[si++]; } pos = ts; int x = -1; for(final int i : pos) { sorted = sorted && i >= x; x = i; if(!sorted) break; } } /** * Checks if the specified position is found. * @param p position to be found * @return result of check */ public boolean contains(final int p) { if(sorted) return Arrays.binarySearch(pos, p) >= 0; for(final int i : pos) if(i == p) return true; return false; } /** * Returns the number of positions. * @return number of positions */ public int size() { return pos.length; } }