Skip to content

Commit

Permalink
Reorder if/else, add javadoc, add tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
gianm committed Jul 30, 2019
1 parent fcaa7f8 commit c48c149
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 6 deletions.
17 changes: 11 additions & 6 deletions src/main/java/org/apache/datasketches/memory/UnsafeUtil.java
Expand Up @@ -157,15 +157,14 @@ static long getFieldOffset(final Class<?> c, final String fieldName) {
}
}

/**
* Like {@link Unsafe#arrayBaseOffset(Class)}, but caches return values for common array types. Useful because
* calling {@link Unsafe#arrayBaseOffset(Class)} directly incurs more overhead.
*/
static long getArrayBaseOffset(final Class<?> c) {
// Ordering here is roughly in order of what we expect to be most popular.
if (c == byte[].class) {
return ARRAY_BYTE_BASE_OFFSET;
} else if (c == boolean[].class) {
return ARRAY_BOOLEAN_BASE_OFFSET;
} else if (c == short[].class) {
return ARRAY_SHORT_BASE_OFFSET;
} else if (c == char[].class) {
return ARRAY_CHAR_BASE_OFFSET;
} else if (c == int[].class) {
return ARRAY_INT_BASE_OFFSET;
} else if (c == long[].class) {
Expand All @@ -174,6 +173,12 @@ static long getArrayBaseOffset(final Class<?> c) {
return ARRAY_FLOAT_BASE_OFFSET;
} else if (c == double[].class) {
return ARRAY_DOUBLE_BASE_OFFSET;
} else if (c == boolean[].class) {
return ARRAY_BOOLEAN_BASE_OFFSET;
} else if (c == short[].class) {
return ARRAY_SHORT_BASE_OFFSET;
} else if (c == char[].class) {
return ARRAY_CHAR_BASE_OFFSET;
} else if (c == Object[].class) {
return ARRAY_OBJECT_BASE_OFFSET;
} else {
Expand Down
27 changes: 27 additions & 0 deletions src/test/java/org/apache/datasketches/memory/UnsafeUtilTest.java
Expand Up @@ -23,6 +23,9 @@
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;

import java.util.ArrayList;
import java.util.List;

import org.testng.annotations.Test;


Expand Down Expand Up @@ -122,6 +125,30 @@ public void checkInts() {
Ints.checkedCast(1L << 32);
}

@Test
public void checkArrayBaseOffset()
{
final List<Class<?>> classes = new ArrayList<>();
classes.add(byte[].class);
classes.add(int[].class);
classes.add(long[].class);
classes.add(float[].class);
classes.add(double[].class);
classes.add(boolean[].class);
classes.add(short[].class);
classes.add(char[].class);
classes.add(Object[].class);
classes.add(byte[][].class); // An array type that is not cached

for (Class<?> clazz : classes) {
assertEquals(
UnsafeUtil.getArrayBaseOffset(clazz),
UnsafeUtil.unsafe.arrayBaseOffset(clazz),
clazz.getTypeName()
);
}
}

@Test
public void printlnTest() {
println("PRINTING: "+this.getClass().getName());
Expand Down

0 comments on commit c48c149

Please sign in to comment.