Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 21 additions & 8 deletions src/main/java/io/airlift/slice/Slice.java
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,8 @@ public void clear()

public void clear(int offset, int length)
{
Arrays.fill(base, baseOffset, baseOffset + size, (byte) 0);
checkFromIndexSize(offset, length, size);
Arrays.fill(base, baseOffset + offset, baseOffset + offset + length, (byte) 0);
Comment thread
wendigo marked this conversation as resolved.
}

/**
Expand Down Expand Up @@ -1150,7 +1151,7 @@ public int indexOf(Slice pattern, int offset)
}

// Try fast match of head and the rest
if (value == head && equalsUnchecked(index, pattern, 0, pattern.length())) {
if (value == head && equalsUnchecked(index, pattern.byteArray(), pattern.byteArrayOffset(), pattern.length())) {
return index;
}

Expand Down Expand Up @@ -1182,7 +1183,7 @@ int indexOfBruteForce(Slice pattern, int offset)
break;
}

if (equalsUnchecked(index, pattern, 0, pattern.length())) {
if (equalsUnchecked(index, pattern.byteArray(), pattern.byteArrayOffset(), pattern.length())) {
return index;
}

Expand Down Expand Up @@ -1248,7 +1249,7 @@ public boolean equals(Object o)
return false;
}

return equalsUnchecked(0, that, 0, length());
return equalsUnchecked(0, that.byteArray(), that.byteArrayOffset(), length());
}

/**
Expand Down Expand Up @@ -1293,18 +1294,30 @@ public boolean equals(int offset, int length, Slice that, int otherOffset, int o
checkFromIndexSize(offset, length, length());
checkFromIndexSize(otherOffset, otherLength, that.length());

return equalsUnchecked(offset, that.byteArray(), that.byteArrayOffset() + otherOffset, length);
}

public boolean equals(int offset, int length, byte[] that, int otherOffset, int otherLength)
{
if (length != otherLength) {
return false;
}

checkFromIndexSize(offset, length, length());
checkFromIndexSize(otherOffset, otherLength, that.length);
Comment thread
wendigo marked this conversation as resolved.
Outdated

return equalsUnchecked(offset, that, otherOffset, length);
}

boolean equalsUnchecked(int offset, Slice that, int otherOffset, int length)
boolean equalsUnchecked(int offset, byte[] that, int otherOffset, int length)
{
return Arrays.equals(
base,
baseOffset + offset,
baseOffset + offset + length,
that.base,
that.baseOffset + otherOffset,
that.baseOffset + otherOffset + length);
that,
otherOffset,
otherOffset + length);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/test/java/io/airlift/slice/BenchmarkSlice.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public Object compareTo(BenchmarkData data)
@Benchmark
public Object equalsUnchecked(BenchmarkData data)
{
return data.slice1.equalsUnchecked(0, data.slice2, 0, data.slice1.length());
return data.slice1.equalsUnchecked(0, data.slice2.byteArray(), data.slice2.byteArrayOffset(), data.slice1.length());
}

@Benchmark
Expand Down
15 changes: 15 additions & 0 deletions src/test/java/io/airlift/slice/TestSlice.java
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ private static void assertSlicesEquals(Slice slice, Slice other)
assertThat(slice.compareTo(0, size, other, 0, size)).isEqualTo(0);
for (int i = 0; i < slice.length(); i++) {
assertThat(slice.equals(i, size - i, other, i, size - i)).isTrue();
assertThat(slice.equals(i, size - i, other.byteArray(), other.byteArrayOffset() + i, size - i)).isTrue();
assertThat(slice.hashCode(i, size - i)).isEqualTo(other.hashCode(i, size - i));
assertThat(slice.compareTo(i, size - i, other, i, size - i)).isEqualTo(0);
}
Expand Down Expand Up @@ -664,6 +665,20 @@ public void testBytesSlice()
}
}

@Test
public void testClear()
{
byte[] bytes = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8};

Slice slice = Slices.wrappedBuffer(bytes);

assertThat(slice.getByte(1)).isEqualTo((byte) 1);
assertThat(slice.getByte(2)).isEqualTo((byte) 2);
slice.clear(1, 1);
assertThat(slice.getByte(1)).isEqualTo((byte) 0);
assertThat(slice.getByte(2)).isEqualTo((byte) 2);
}

private void assertBytesSlice(Slice slice, int index)
{
// fill slice with FF
Expand Down