/** * Compute the first few words of the XOR aggregate between two iterators. * * @param container where to write * @param desiredrlwcount number of words to be written (max) * @param rlwi first iterator to aggregate * @param rlwj second iterator to aggregate */ public static void xorToContainer( final BitmapStorage32 container, int desiredrlwcount, final IteratingRLW32 rlwi, IteratingRLW32 rlwj) { while ((rlwi.size() > 0) && (rlwj.size() > 0) && (desiredrlwcount-- > 0)) { while ((rlwi.getRunningLength() > 0) || (rlwj.getRunningLength() > 0)) { final boolean i_is_prey = rlwi.getRunningLength() < rlwj.getRunningLength(); final IteratingRLW32 prey = i_is_prey ? rlwi : rlwj; final IteratingRLW32 predator = i_is_prey ? rlwj : rlwi; if (!predator.getRunningBit()) { int index = discharge(container, prey, predator.getRunningLength()); container.addStreamOfEmptyWords(false, predator.getRunningLength() - index); predator.discardFirstWords(predator.getRunningLength()); } else { int index = dischargeNegated(container, prey, predator.getRunningLength()); container.addStreamOfEmptyWords(true, predator.getRunningLength() - index); predator.discardFirstWords(predator.getRunningLength()); } } final int nbre_literal = Math.min(rlwi.getNumberOfLiteralWords(), rlwj.getNumberOfLiteralWords()); if (nbre_literal > 0) { desiredrlwcount -= nbre_literal; for (int k = 0; k < nbre_literal; ++k) container.addWord(rlwi.getLiteralWordAt(k) ^ rlwj.getLiteralWordAt(k)); rlwi.discardFirstWords(nbre_literal); rlwj.discardFirstWords(nbre_literal); } } }
/** * Write out up to max words, returns how many were written * * @param container target for writes * @param i source of data * @param max maximal number of writes * @return how many written */ protected static int discharge(final BitmapStorage32 container, IteratingRLW32 i, int max) { int counter = 0; while (i.size() > 0 && counter < max) { int l1 = i.getRunningLength(); if (l1 > 0) { if (l1 + counter > max) l1 = max - counter; container.addStreamOfEmptyWords(i.getRunningBit(), l1); counter += l1; } int l = i.getNumberOfLiteralWords(); if (l + counter > max) l = max - counter; for (int k = 0; k < l; ++k) { container.addWord(i.getLiteralWordAt(k)); } counter += l; i.discardFirstWords(l + l1); } return counter; }
/** * Write out the content of the iterator, but as if it were all zeros. * * @param container where we write * @param i the iterator */ protected static void dischargeAsEmpty(final BitmapStorage32 container, final IteratingRLW32 i) { while (i.size() > 0) { container.addStreamOfEmptyWords(false, i.size()); i.next(); } }