@Override public Container iand(RunContainer x) { // could probably be replaced with return iand(x.toBitmapOrArrayContainer()); final int card = x.getCardinality(); if (card <= ArrayContainer.DEFAULT_MAX_SIZE) { // no point in doing it in-place ArrayContainer answer = new ArrayContainer(card); answer.cardinality = 0; for (int rlepos = 0; rlepos < x.nbrruns; ++rlepos) { int runStart = Util.toIntUnsigned(x.getValue(rlepos)); int runEnd = runStart + Util.toIntUnsigned(x.getLength(rlepos)); for (int runValue = runStart; runValue <= runEnd; ++runValue) { if (this.contains( (short) runValue)) { // it looks like contains() should be cheap enough if accessed // sequentially answer.content[answer.cardinality++] = (short) runValue; } } } return answer; } int start = 0; for (int rlepos = 0; rlepos < x.nbrruns; ++rlepos) { int end = Util.toIntUnsigned(x.getValue(rlepos)); Util.resetBitmapRange(this.bitmap, start, end); start = end + Util.toIntUnsigned(x.getLength(rlepos)) + 1; } Util.resetBitmapRange(this.bitmap, start, Util.maxLowBitAsInteger() + 1); computeCardinality(); if (getCardinality() > ArrayContainer.DEFAULT_MAX_SIZE) return this; else return toArrayContainer(); }
@Override public ArrayContainer and(final ArrayContainer value2) { final ArrayContainer answer = new ArrayContainer(value2.content.length); for (int k = 0; k < value2.getCardinality(); ++k) if (this.contains(value2.content[k])) answer.content[answer.cardinality++] = value2.content[k]; return answer; }
@Override public Container ixor(BitmapContainer b2) { int newCardinality = 0; for (int k = 0; k < this.bitmap.length; ++k) { newCardinality += Long.bitCount(this.bitmap[k] ^ b2.bitmap[k]); } if (newCardinality > ArrayContainer.DEFAULT_MAX_SIZE) { for (int k = 0; k < this.bitmap.length; ++k) { this.bitmap[k] = this.bitmap[k] ^ b2.bitmap[k]; } this.cardinality = newCardinality; return this; } ArrayContainer ac = new ArrayContainer(newCardinality); Util.fillArrayXOR(ac.content, this.bitmap, b2.bitmap); ac.cardinality = newCardinality; return ac; }
@Override public Container xor(BitmapContainer value2) { int newCardinality = 0; for (int k = 0; k < this.bitmap.length; ++k) { newCardinality += Long.bitCount(this.bitmap[k] ^ value2.bitmap[k]); } if (newCardinality > ArrayContainer.DEFAULT_MAX_SIZE) { final BitmapContainer answer = new BitmapContainer(); for (int k = 0; k < answer.bitmap.length; ++k) { answer.bitmap[k] = this.bitmap[k] ^ value2.bitmap[k]; } answer.cardinality = newCardinality; return answer; } ArrayContainer ac = new ArrayContainer(newCardinality); Util.fillArrayXOR(ac.content, this.bitmap, value2.bitmap); ac.cardinality = newCardinality; return ac; }
@Override public Container xor(final ArrayContainer value2) { final BitmapContainer answer = clone(); for (int k = 0; k < value2.getCardinality(); ++k) { final int index = Util.toIntUnsigned(value2.content[k]) >>> 6; answer.cardinality += 1 - 2 * ((answer.bitmap[index] & (1l << value2.content[k])) >>> value2.content[k]); answer.bitmap[index] = answer.bitmap[index] ^ (1l << value2.content[k]); } if (answer.cardinality <= ArrayContainer.DEFAULT_MAX_SIZE) return answer.toArrayContainer(); return answer; }
@Override public Container ixor(final ArrayContainer value2) { for (int k = 0; k < value2.getCardinality(); ++k) { final int index = Util.toIntUnsigned(value2.content[k]) >>> 6; this.cardinality += 1 - 2 * ((this.bitmap[index] & (1l << value2.content[k])) >>> value2.content[k]); this.bitmap[index] ^= (1l << value2.content[k]); } if (this.cardinality <= ArrayContainer.DEFAULT_MAX_SIZE) { return this.toArrayContainer(); } return this; }
/** * Copies the data to an array container * * @return the array container */ public ArrayContainer toArrayContainer() { ArrayContainer ac = new ArrayContainer(cardinality); ac.loadData(this); return ac; }
@Override public Container iand(final ArrayContainer b2) { return b2.and(this); // no inplace possible }
@Override public boolean intersects(ArrayContainer value2) { for (int k = 0; k < value2.getCardinality(); ++k) if (this.contains(value2.content[k])) return true; return false; }