package com.arturmkrtchyan.sizeof4j.calculation;
import com.arturmkrtchyan.sizeof4j.MemoryLayout;
import com.arturmkrtchyan.sizeof4j.Primitive;
import com.arturmkrtchyan.sizeof4j.util.JvmUtil;
public abstract class BaseCalculationStrategy implements CalculationStrategy {
protected static final MemoryLayout memoryLayout = JvmUtil.memoryLayout();
protected int roundToMultiple(final int value, final int multiple) {
return ((value + multiple - 1) / multiple) * multiple;
}
@Override
public <T> int calculateShallow(final Class<T> clazz, final int length) {
Class arrayType = clazz.getComponentType();
int size = memoryLayout.arrayHeaderSize();
if(arrayType.isPrimitive()) {
size += length * Primitive.get(arrayType).size();
} else {
size += length * memoryLayout.referenceSize();
}
return roundToMultiple(size, memoryLayout.objectPadding());
}
}