@Override public MappeableContainer flip(short x) { if (BufferUtil.isBackedBySimpleArray(this.content)) { short[] sarray = content.array(); int loc = Util.unsignedBinarySearch(sarray, 0, cardinality, x); if (loc < 0) { // Transform the ArrayContainer to a BitmapContainer // when cardinality = DEFAULT_MAX_SIZE if (cardinality >= DEFAULT_MAX_SIZE) { MappeableBitmapContainer a = this.toBitmapContainer(); a.add(x); return a; } if (cardinality >= sarray.length) { increaseCapacity(); sarray = content.array(); } // insertion : shift the elements > x by one position to // the right // and put x in it's appropriate place System.arraycopy(sarray, -loc - 1, sarray, -loc, cardinality + loc + 1); sarray[-loc - 1] = x; ++cardinality; } else { System.arraycopy(sarray, loc + 1, sarray, loc, cardinality - loc - 1); --cardinality; } return this; } else { int loc = BufferUtil.unsignedBinarySearch(content, 0, cardinality, x); if (loc < 0) { // Transform the ArrayContainer to a BitmapContainer // when cardinality = DEFAULT_MAX_SIZE if (cardinality >= DEFAULT_MAX_SIZE) { MappeableBitmapContainer a = this.toBitmapContainer(); a.add(x); return a; } if (cardinality >= content.limit()) { increaseCapacity(); } // insertion : shift the elements > x by one position to // the right // and put x in it's appropriate place for (int k = cardinality; k > -loc - 1; --k) content.put(k, content.get(k - 1)); content.put(-loc - 1, x); ++cardinality; } else { for (int k = loc + 1; k < cardinality; --k) { content.put(k - 1, content.get(k)); } --cardinality; } return this; } }
@Override public MappeableContainer iadd(int begin, int end) { int indexstart = BufferUtil.unsignedBinarySearch(content, 0, cardinality, (short) begin); if (indexstart < 0) indexstart = -indexstart - 1; int indexend = BufferUtil.unsignedBinarySearch(content, 0, cardinality, (short) (end - 1)); if (indexend < 0) indexend = -indexend - 1; else indexend++; int rangelength = end - begin; int newcardinality = indexstart + (cardinality - indexend) + rangelength; if (newcardinality > DEFAULT_MAX_SIZE) { MappeableBitmapContainer a = this.toBitmapContainer(); return a.iadd(begin, end); } if (newcardinality >= this.content.limit()) increaseCapacity(newcardinality); BufferUtil.arraycopy( content, indexend, content, indexstart + rangelength, cardinality - indexend); if (BufferUtil.isBackedBySimpleArray(content)) { short[] contentarray = content.array(); for (int k = 0; k < rangelength; ++k) { contentarray[k + indexstart] = (short) (begin + k); } } else { for (int k = 0; k < rangelength; ++k) { content.put(k + indexstart, (short) (begin + k)); } } cardinality = newcardinality; return this; }
// in order private void emit(short val) { if (cardinality == content.limit()) increaseCapacity(true); content.put(cardinality++, val); }
private void increaseCapacity() { increaseCapacity(false); }