Search in sources :

Example 11 with BitmapDataProvider

use of org.roaringbitmap.BitmapDataProvider in project RoaringBitmap by RoaringBitmap.

the class Roaring64NavigableMap method or.

/**
 * In-place bitwise OR (union) operation. The current bitmap is modified.
 *
 * @param x2 other bitmap
 */
public void or(final Roaring64NavigableMap x2) {
    boolean firstBucket = true;
    for (Entry<Integer, BitmapDataProvider> e2 : x2.highToBitmap.entrySet()) {
        // Keep object to prevent auto-boxing
        Integer high = e2.getKey();
        BitmapDataProvider lowBitmap1 = this.highToBitmap.get(high);
        BitmapDataProvider lowBitmap2 = e2.getValue();
        // not on buffer
        if ((lowBitmap1 == null || lowBitmap1 instanceof RoaringBitmap) && lowBitmap2 instanceof RoaringBitmap) {
            if (lowBitmap1 == null) {
                // Clone to prevent future modification of this modifying the input Bitmap
                RoaringBitmap lowBitmap2Clone = ((RoaringBitmap) lowBitmap2).clone();
                pushBitmapForHigh(high, lowBitmap2Clone);
            } else {
                ((RoaringBitmap) lowBitmap1).or((RoaringBitmap) lowBitmap2);
            }
        } else if ((lowBitmap1 == null || lowBitmap1 instanceof MutableRoaringBitmap) && lowBitmap2 instanceof MutableRoaringBitmap) {
            if (lowBitmap1 == null) {
                // Clone to prevent future modification of this modifying the input Bitmap
                BitmapDataProvider lowBitmap2Clone = ((MutableRoaringBitmap) lowBitmap2).clone();
                pushBitmapForHigh(high, lowBitmap2Clone);
            } else {
                ((MutableRoaringBitmap) lowBitmap1).or((MutableRoaringBitmap) lowBitmap2);
            }
        } else {
            throw new UnsupportedOperationException(".or is not between " + this.getClass() + " and " + lowBitmap2.getClass());
        }
        if (firstBucket) {
            firstBucket = false;
            // Invalidate the lowest high as lowest not valid
            firstHighNotValid = Math.min(firstHighNotValid, high);
            allValid = false;
        }
    }
}
Also used : MutableRoaringBitmap(org.roaringbitmap.buffer.MutableRoaringBitmap) BitmapDataProvider(org.roaringbitmap.BitmapDataProvider) RoaringBitmap(org.roaringbitmap.RoaringBitmap) MutableRoaringBitmap(org.roaringbitmap.buffer.MutableRoaringBitmap)

Example 12 with BitmapDataProvider

use of org.roaringbitmap.BitmapDataProvider in project RoaringBitmap by RoaringBitmap.

the class Roaring64NavigableMap method and.

/**
 * In-place bitwise AND (intersection) operation. The current bitmap is modified.
 *
 * @param x2 other bitmap
 */
public void and(final Roaring64NavigableMap x2) {
    boolean firstBucket = true;
    Iterator<Entry<Integer, BitmapDataProvider>> thisIterator = highToBitmap.entrySet().iterator();
    while (thisIterator.hasNext()) {
        Entry<Integer, BitmapDataProvider> e1 = thisIterator.next();
        // Keep object to prevent auto-boxing
        Integer high = e1.getKey();
        BitmapDataProvider lowBitmap2 = x2.highToBitmap.get(high);
        if (lowBitmap2 == null) {
            // None of given high values are present in x2
            thisIterator.remove();
        } else {
            BitmapDataProvider lowBitmap1 = e1.getValue();
            if (lowBitmap2 instanceof RoaringBitmap && lowBitmap1 instanceof RoaringBitmap) {
                ((RoaringBitmap) lowBitmap1).and((RoaringBitmap) lowBitmap2);
            } else if (lowBitmap2 instanceof MutableRoaringBitmap && lowBitmap1 instanceof MutableRoaringBitmap) {
                ((MutableRoaringBitmap) lowBitmap1).and((MutableRoaringBitmap) lowBitmap2);
            } else {
                throw new UnsupportedOperationException(".and is not between " + this.getClass() + " and " + lowBitmap1.getClass());
            }
        }
        if (firstBucket) {
            firstBucket = false;
            // Invalidate the lowest high as lowest not valid
            firstHighNotValid = Math.min(firstHighNotValid, high);
            allValid = false;
        }
    }
}
Also used : Entry(java.util.Map.Entry) MutableRoaringBitmap(org.roaringbitmap.buffer.MutableRoaringBitmap) BitmapDataProvider(org.roaringbitmap.BitmapDataProvider) RoaringBitmap(org.roaringbitmap.RoaringBitmap) MutableRoaringBitmap(org.roaringbitmap.buffer.MutableRoaringBitmap)

Example 13 with BitmapDataProvider

use of org.roaringbitmap.BitmapDataProvider in project RoaringBitmap by RoaringBitmap.

the class Roaring64NavigableMap method addLong.

/**
 * Add the value to the container (set the value to "true"), whether it already appears or not.
 *
 * Java lacks native unsigned longs but the x argument is considered to be unsigned. Within
 * bitmaps, numbers are ordered according to {@link Long#compareUnsigned}. We order the numbers
 * like 0, 1, ..., 9223372036854775807, -9223372036854775808, -9223372036854775807,..., -1.
 *
 * @param x long value
 */
@Override
public void addLong(long x) {
    int high = high(x);
    int low = low(x);
    // Copy the reference to prevent race-condition
    Map.Entry<Integer, BitmapDataProvider> local = latestAddedHigh;
    BitmapDataProvider bitmap;
    if (local != null && local.getKey().intValue() == high) {
        bitmap = local.getValue();
    } else {
        bitmap = highToBitmap.get(high);
        if (bitmap == null) {
            bitmap = newRoaringBitmap();
            pushBitmapForHigh(high, bitmap);
        }
        latestAddedHigh = new AbstractMap.SimpleImmutableEntry<>(high, bitmap);
    }
    bitmap.add(low);
    invalidateAboveHigh(high);
}
Also used : AbstractMap(java.util.AbstractMap) NavigableMap(java.util.NavigableMap) AbstractMap(java.util.AbstractMap) TreeMap(java.util.TreeMap) Map(java.util.Map) SortedMap(java.util.SortedMap) BitmapDataProvider(org.roaringbitmap.BitmapDataProvider)

Aggregations

BitmapDataProvider (org.roaringbitmap.BitmapDataProvider)13 RoaringBitmap (org.roaringbitmap.RoaringBitmap)6 MutableRoaringBitmap (org.roaringbitmap.buffer.MutableRoaringBitmap)6 Entry (java.util.Map.Entry)2 AbstractMap (java.util.AbstractMap)1 Map (java.util.Map)1 NavigableMap (java.util.NavigableMap)1 SortedMap (java.util.SortedMap)1 TreeMap (java.util.TreeMap)1