package org.infinispan.marshall.core;
import org.infinispan.commons.marshall.WrappedByteArray;
import org.infinispan.commons.util.AbstractEntrySizeCalculatorHelper;
import org.infinispan.commons.util.EntrySizeCalculator;
/**
* Size calculator that supports a {@link WrappedByteArray} by adding its size and the underlying byte[].
* @author wburns
* @since 9.0
*/
public class WrappedByteArraySizeCalculator<K, V> extends AbstractEntrySizeCalculatorHelper<K, V> {
private final EntrySizeCalculator chained;
public WrappedByteArraySizeCalculator(EntrySizeCalculator<?, ?> chained) {
this.chained = chained;
}
@Override
public long calculateSize(K key, V value) {
long size = 0;
Object keyToUse;
Object valueToUse;
if (key instanceof WrappedByteArray) {
keyToUse = ((WrappedByteArray) key).getBytes();
// WBA object, the class pointer and the pointer to the byte[]
size += roundUpToNearest8(OBJECT_SIZE + POINTER_SIZE * 2);
} else {
keyToUse = key;
}
if (value instanceof WrappedByteArray) {
valueToUse = ((WrappedByteArray) value).getBytes();
// WBA object, the class pointer and the pointer to the byte[]
size += roundUpToNearest8(OBJECT_SIZE + POINTER_SIZE * 2);
} else {
valueToUse = value;
}
return size + chained.calculateSize(keyToUse, valueToUse);
}
}