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
12 changes: 6 additions & 6 deletions .github/workflows/develop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,16 @@ jobs:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Set up JDK 21
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
uses: gradle/actions/setup-gradle@v6

- name: Compile all modules
run: ./gradlew testClasses
Expand Down Expand Up @@ -61,13 +61,13 @@ jobs:
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Set up JDK 21
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'

- name: Generate and submit dependency graph
uses: gradle/actions/dependency-submission@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
uses: gradle/actions/dependency-submission@v6
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ repositories {
}

ext {
rlibVersion = "10.0.alpha14"
rlibVersion = "10.0.alpha15"
}

dependencies {
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
rootProject.version = "10.0.alpha14"
rootProject.version = "10.0.alpha15"
group = 'javasabr.rlib'

allprojects {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,13 @@ public interface Dictionary<K, V> extends Iterable<V> {
*/
MutableArray<V> values(MutableArray<V> container);

/**
* Collects part of values from this dictionary with starting from index with provided soft limit.
*
* @return the index which can be used as startIndex for next iteration or -1
*/
int values(MutableArray<V> container, int startIndex, int limit);

Comment thread
JavaSaBr marked this conversation as resolved.
/**
* Returns all values as an immutable array.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,4 +225,56 @@ public MutableArray<V> values(MutableArray<V> container) {
}
return container;
}

@Override
public int values(MutableArray<V> container, int startIndex, int limit) {
if (isEmpty()) {
return -1;
}
UnsafeMutableArray<V> unsafe = container.asUnsafe();
unsafe.prepareForSize(Math.min(limit, size()));
E[] entries = entries();
for (int i = startIndex, length = entries.length; i < length; i++) {
if (unsafe.size() >= limit) {
return i;
}
E entry = entries[i];
while (entry != null) {
V value = entry.value();
if (value != null) {
unsafe.unsafeAdd(value);
}
entry = entry.next();
}
}
return -1;
}

@Override
public String toString() {
if (isEmpty()) {
return "[]";
}
StringBuilder builder = new StringBuilder("[");
for (E entry : entries()) {
while (entry != null) {
builder
.append('\'')
.append(entry.key())
.append('\'')
.append(":")
.append('\'')
.append(entry.value())
.append('\'')
.append(", ");

entry = entry.next();
}
}
if (builder.length() > 1) {
builder.delete(builder.length() - 2, builder.length());
}
builder.append("]");
return builder.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -225,4 +225,56 @@ public MutableArray<V> values(MutableArray<V> container) {
}
return container;
}

@Override
public int values(MutableArray<V> container, int startIndex, int limit) {
if (isEmpty()) {
return -1;
}
UnsafeMutableArray<V> unsafe = container.asUnsafe();
unsafe.prepareForSize(Math.min(limit, size()));
E[] entries = entries();
for (int i = startIndex, length = entries.length; i < length; i++) {
if (unsafe.size() >= limit) {
return i;
}
E entry = entries[i];
while (entry != null) {
V value = entry.value();
if (value != null) {
unsafe.unsafeAdd(value);
}
entry = entry.next();
}
}
return -1;
}

@Override
public String toString() {
if (isEmpty()) {
return "[]";
}
StringBuilder builder = new StringBuilder("[");
for (E entry : entries()) {
while (entry != null) {
builder
.append('\'')
.append(entry.key())
.append('\'')
.append(":")
.append('\'')
.append(entry.value())
.append('\'')
.append(", ");

entry = entry.next();
}
}
if (builder.length() > 1) {
builder.delete(builder.length() - 2, builder.length());
}
builder.append("]");
return builder.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,30 @@ public MutableArray<V> values(MutableArray<V> container) {
return container;
}

@Override
public int values(MutableArray<V> container, int startIndex, int limit) {
if (isEmpty()) {
return -1;
}
UnsafeMutableArray<V> unsafe = container.asUnsafe();
unsafe.prepareForSize(Math.min(limit, size()));
E[] entries = entries();
for (int i = startIndex, length = entries.length; i < length; i++) {
if (unsafe.size() >= limit) {
return i;
}
E entry = entries[i];
while (entry != null) {
V value = entry.value();
if (value != null) {
unsafe.unsafeAdd(value);
}
entry = entry.next();
}
}
return -1;
}
Comment thread
JavaSaBr marked this conversation as resolved.

@Override
public int hashCode() {
return Arrays.hashCode(entries());
Expand Down Expand Up @@ -214,13 +238,10 @@ public boolean equals(Object obj) {

@Override
public String toString() {

if (isEmpty()) {
return "[]";
}

StringBuilder builder = new StringBuilder("[");

for (E entry : entries()) {
while (entry != null) {
builder
Expand All @@ -236,13 +257,10 @@ public String toString() {
entry = entry.next();
}
}

if (builder.length() > 1) {
builder.delete(builder.length() - 2, builder.length());
}

builder.append("]");

return builder.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import java.util.Optional;
import java.util.stream.Stream;
import javasabr.rlib.collections.array.ArrayFactory;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
Expand Down Expand Up @@ -207,6 +208,35 @@ void shouldBeEmptyAfterClear(MutableIntToRefDictionary<String> dictionary) {
assertThat(dictionary.containsKey(1)).isFalse();
}

@ParameterizedTest
@MethodSource("generateDictionaries")
void shouldIterateAllValuesUsingPartIndex(MutableIntToRefDictionary<String> dictionary) {
// given:
var expectedValues = ArrayFactory.mutableArray(String.class);
for (int i = 10; i < 1000; i += 8) {
var value = "value_" + i;
expectedValues.add(value);
dictionary.put(i, value);
}

expectedValues.sort();

var accumulatedValues = ArrayFactory.mutableArray(String.class);
var extractedPart = ArrayFactory.mutableArray(String.class);

// when:
int partIndex = 0;
while (partIndex >= 0) {
extractedPart.clear();
partIndex = dictionary.values(extractedPart, partIndex, 20);
accumulatedValues.addAll(extractedPart);
}
accumulatedValues.sort();

// then:
assertThat(accumulatedValues).isEqualTo(expectedValues);
}

private static Stream<Arguments> generateDictionaries() {
return Stream.of(
Arguments.of(MutableIntToRefDictionary.ofTypes(String.class)),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import java.util.Optional;
import java.util.stream.Stream;
import javasabr.rlib.collections.array.ArrayFactory;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
Expand Down Expand Up @@ -207,6 +208,35 @@ void shouldBeEmptyAfterClear(MutableLongToRefDictionary<String> dictionary) {
assertThat(dictionary.containsKey(1)).isFalse();
}

@ParameterizedTest
@MethodSource("generateDictionaries")
void shouldIterateAllValuesUsingPartIndex(MutableLongToRefDictionary<String> dictionary) {
// given:
var expectedValues = ArrayFactory.mutableArray(String.class);
for (int i = 10; i < 1000; i += 8) {
var value = "value_" + i;
expectedValues.add(value);
dictionary.put(i, value);
}

expectedValues.sort();

var accumulatedValues = ArrayFactory.mutableArray(String.class);
var extractedPart = ArrayFactory.mutableArray(String.class);

// when:
int partIndex = 0;
while (partIndex >= 0) {
extractedPart.clear();
partIndex = dictionary.values(extractedPart, partIndex, 20);
accumulatedValues.addAll(extractedPart);
}
accumulatedValues.sort();

// then:
assertThat(accumulatedValues).isEqualTo(expectedValues);
}

private static Stream<Arguments> generateDictionaries() {
return Stream.of(
Arguments.of(MutableLongToRefDictionary.ofTypes(String.class)),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import java.util.Optional;
import java.util.stream.Stream;
import javasabr.rlib.collections.array.ArrayFactory;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
Expand Down Expand Up @@ -207,6 +208,36 @@ void shouldAppendDictionary(MutableRefToRefDictionary<String, String> dictionary
assertThat(dictionary.size()).isEqualTo(5);
}

@ParameterizedTest
@MethodSource("generateDictionaries")
void shouldIterateAllValuesUsingPartIndex(MutableRefToRefDictionary<String, String> dictionary) {
// given:
var expectedValues = ArrayFactory.mutableArray(String.class);
for (int i = 10; i < 1000; i += 8) {
var value = "value_" + i;
var key = "key_" + i;
expectedValues.add(value);
dictionary.put(key, value);
}

expectedValues.sort();

var accumulatedValues = ArrayFactory.mutableArray(String.class);
var extractedPart = ArrayFactory.mutableArray(String.class);

// when:
int partIndex = 0;
while (partIndex >= 0) {
extractedPart.clear();
partIndex = dictionary.values(extractedPart, partIndex, 20);
accumulatedValues.addAll(extractedPart);
}
accumulatedValues.sort();

// then:
assertThat(accumulatedValues).isEqualTo(expectedValues);
}

private static Stream<Arguments> generateDictionaries() {
return Stream.of(
Arguments.of(MutableRefToRefDictionary.ofTypes(String.class, String.class)),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ void shouldHaveExpectedResultFromForEach(RefToRefDictionary<String, String> dict
// then:
assertThat(pairs).isEqualTo(expectedPairs);
}

private static Stream<Arguments> generateDictionaries() {

RefToRefDictionary<String, String> source = RefToRefDictionary.ofEntries(
Expand Down
Loading
Loading