Skip to content

Commit a89f27e

Browse files
committed
work on extending API
1 parent 4e6b556 commit a89f27e

11 files changed

Lines changed: 237 additions & 16 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ repositories {
4545
}
4646
4747
ext {
48-
rlibVersion = "10.0.alpha14"
48+
rlibVersion = "10.0.alpha15"
4949
}
5050
5151
dependencies {

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
rootProject.version = "10.0.alpha14"
1+
rootProject.version = "10.0.alpha15"
22
group = 'javasabr.rlib'
33

44
allprojects {

rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/Dictionary.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,13 @@ public interface Dictionary<K, V> extends Iterable<V> {
126126
*/
127127
MutableArray<V> values(MutableArray<V> container);
128128

129+
/**
130+
* Collects part of values from this dictionary with starting from index with provided soft limit.
131+
*
132+
* @return the index which can be used as startIndex for next iteration or -1
133+
*/
134+
int values(MutableArray<V> container, int startIndex, int limit);
135+
129136
/**
130137
* Returns all values as an immutable array.
131138
*

rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractHashBasedIntToRefDictionary.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,4 +225,56 @@ public MutableArray<V> values(MutableArray<V> container) {
225225
}
226226
return container;
227227
}
228+
229+
@Override
230+
public int values(MutableArray<V> container, int startIndex, int limit) {
231+
if (isEmpty()) {
232+
return -1;
233+
}
234+
UnsafeMutableArray<V> unsafe = container.asUnsafe();
235+
unsafe.prepareForSize(Math.min(limit, size()));
236+
E[] entries = entries();
237+
for (int i = startIndex, length = entries.length; i < length; i++) {
238+
if (unsafe.size() >= limit) {
239+
return i;
240+
}
241+
E entry = entries[i];
242+
while (entry != null) {
243+
V value = entry.value();
244+
if (value != null) {
245+
unsafe.unsafeAdd(value);
246+
}
247+
entry = entry.next();
248+
}
249+
}
250+
return -1;
251+
}
252+
253+
@Override
254+
public String toString() {
255+
if (isEmpty()) {
256+
return "[]";
257+
}
258+
StringBuilder builder = new StringBuilder("[");
259+
for (E entry : entries()) {
260+
while (entry != null) {
261+
builder
262+
.append('\'')
263+
.append(entry.key())
264+
.append('\'')
265+
.append(":")
266+
.append('\'')
267+
.append(entry.value())
268+
.append('\'')
269+
.append(", ");
270+
271+
entry = entry.next();
272+
}
273+
}
274+
if (builder.length() > 1) {
275+
builder.delete(builder.length() - 2, builder.length());
276+
}
277+
builder.append("]");
278+
return builder.toString();
279+
}
228280
}

rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractHashBasedLongToRefDictionary.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,4 +225,56 @@ public MutableArray<V> values(MutableArray<V> container) {
225225
}
226226
return container;
227227
}
228+
229+
@Override
230+
public int values(MutableArray<V> container, int startIndex, int limit) {
231+
if (isEmpty()) {
232+
return -1;
233+
}
234+
UnsafeMutableArray<V> unsafe = container.asUnsafe();
235+
unsafe.prepareForSize(Math.min(limit, size()));
236+
E[] entries = entries();
237+
for (int i = startIndex, length = entries.length; i < length; i++) {
238+
if (unsafe.size() >= limit) {
239+
return i;
240+
}
241+
E entry = entries[i];
242+
while (entry != null) {
243+
V value = entry.value();
244+
if (value != null) {
245+
unsafe.unsafeAdd(value);
246+
}
247+
entry = entry.next();
248+
}
249+
}
250+
return -1;
251+
}
252+
253+
@Override
254+
public String toString() {
255+
if (isEmpty()) {
256+
return "[]";
257+
}
258+
StringBuilder builder = new StringBuilder("[");
259+
for (E entry : entries()) {
260+
while (entry != null) {
261+
builder
262+
.append('\'')
263+
.append(entry.key())
264+
.append('\'')
265+
.append(":")
266+
.append('\'')
267+
.append(entry.value())
268+
.append('\'')
269+
.append(", ");
270+
271+
entry = entry.next();
272+
}
273+
}
274+
if (builder.length() > 1) {
275+
builder.delete(builder.length() - 2, builder.length());
276+
}
277+
builder.append("]");
278+
return builder.toString();
279+
}
228280
}

rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractHashBasedRefToRefDictionary.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,30 @@ public MutableArray<V> values(MutableArray<V> container) {
181181
return container;
182182
}
183183

184+
@Override
185+
public int values(MutableArray<V> container, int startIndex, int limit) {
186+
if (isEmpty()) {
187+
return -1;
188+
}
189+
UnsafeMutableArray<V> unsafe = container.asUnsafe();
190+
unsafe.prepareForSize(Math.min(limit, size()));
191+
E[] entries = entries();
192+
for (int i = startIndex, length = entries.length; i < length; i++) {
193+
if (unsafe.size() >= limit) {
194+
return i;
195+
}
196+
E entry = entries[i];
197+
while (entry != null) {
198+
V value = entry.value();
199+
if (value != null) {
200+
unsafe.unsafeAdd(value);
201+
}
202+
entry = entry.next();
203+
}
204+
}
205+
return -1;
206+
}
207+
184208
@Override
185209
public int hashCode() {
186210
return Arrays.hashCode(entries());
@@ -214,13 +238,10 @@ public boolean equals(Object obj) {
214238

215239
@Override
216240
public String toString() {
217-
218241
if (isEmpty()) {
219242
return "[]";
220243
}
221-
222244
StringBuilder builder = new StringBuilder("[");
223-
224245
for (E entry : entries()) {
225246
while (entry != null) {
226247
builder
@@ -236,13 +257,10 @@ public String toString() {
236257
entry = entry.next();
237258
}
238259
}
239-
240260
if (builder.length() > 1) {
241261
builder.delete(builder.length() - 2, builder.length());
242262
}
243-
244263
builder.append("]");
245-
246264
return builder.toString();
247265
}
248266
}

rlib-collections/src/test/java/javasabr/rlib/collections/dictionary/MutableIntToRefDictionaryTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import java.util.Optional;
77
import java.util.stream.Stream;
8+
import javasabr.rlib.collections.array.ArrayFactory;
89
import org.junit.jupiter.params.ParameterizedTest;
910
import org.junit.jupiter.params.provider.Arguments;
1011
import org.junit.jupiter.params.provider.MethodSource;
@@ -207,6 +208,35 @@ void shouldBeEmptyAfterClear(MutableIntToRefDictionary<String> dictionary) {
207208
assertThat(dictionary.containsKey(1)).isFalse();
208209
}
209210

211+
@ParameterizedTest
212+
@MethodSource("generateDictionaries")
213+
void shouldIterateAllValuesUsingPartIndex(MutableIntToRefDictionary<String> dictionary) {
214+
// given:
215+
var expectedValues = ArrayFactory.mutableArray(String.class);
216+
for (int i = 10; i < 1000; i += 8) {
217+
var value = "value_" + i;
218+
expectedValues.add(value);
219+
dictionary.put(i, value);
220+
}
221+
222+
expectedValues.sort();
223+
224+
var accumulatedValues = ArrayFactory.mutableArray(String.class);
225+
var extractedPart = ArrayFactory.mutableArray(String.class);
226+
227+
// when:
228+
int partIndex = 0;
229+
while (partIndex >= 0) {
230+
extractedPart.clear();
231+
partIndex = dictionary.values(extractedPart, partIndex, 20);
232+
accumulatedValues.addAll(extractedPart);
233+
}
234+
accumulatedValues.sort();
235+
236+
// then:
237+
assertThat(accumulatedValues).isEqualTo(expectedValues);
238+
}
239+
210240
private static Stream<Arguments> generateDictionaries() {
211241
return Stream.of(
212242
Arguments.of(MutableIntToRefDictionary.ofTypes(String.class)),

rlib-collections/src/test/java/javasabr/rlib/collections/dictionary/MutableLongToRefDictionaryTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import java.util.Optional;
77
import java.util.stream.Stream;
8+
import javasabr.rlib.collections.array.ArrayFactory;
89
import org.junit.jupiter.params.ParameterizedTest;
910
import org.junit.jupiter.params.provider.Arguments;
1011
import org.junit.jupiter.params.provider.MethodSource;
@@ -207,6 +208,35 @@ void shouldBeEmptyAfterClear(MutableLongToRefDictionary<String> dictionary) {
207208
assertThat(dictionary.containsKey(1)).isFalse();
208209
}
209210

211+
@ParameterizedTest
212+
@MethodSource("generateDictionaries")
213+
void shouldIterateAllValuesUsingPartIndex(MutableLongToRefDictionary<String> dictionary) {
214+
// given:
215+
var expectedValues = ArrayFactory.mutableArray(String.class);
216+
for (int i = 10; i < 1000; i += 8) {
217+
var value = "value_" + i;
218+
expectedValues.add(value);
219+
dictionary.put(i, value);
220+
}
221+
222+
expectedValues.sort();
223+
224+
var accumulatedValues = ArrayFactory.mutableArray(String.class);
225+
var extractedPart = ArrayFactory.mutableArray(String.class);
226+
227+
// when:
228+
int partIndex = 0;
229+
while (partIndex >= 0) {
230+
extractedPart.clear();
231+
partIndex = dictionary.values(extractedPart, partIndex, 20);
232+
accumulatedValues.addAll(extractedPart);
233+
}
234+
accumulatedValues.sort();
235+
236+
// then:
237+
assertThat(accumulatedValues).isEqualTo(expectedValues);
238+
}
239+
210240
private static Stream<Arguments> generateDictionaries() {
211241
return Stream.of(
212242
Arguments.of(MutableLongToRefDictionary.ofTypes(String.class)),

rlib-collections/src/test/java/javasabr/rlib/collections/dictionary/MutableRefToRefDictionaryTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import java.util.Optional;
77
import java.util.stream.Stream;
8+
import javasabr.rlib.collections.array.ArrayFactory;
89
import org.junit.jupiter.params.ParameterizedTest;
910
import org.junit.jupiter.params.provider.Arguments;
1011
import org.junit.jupiter.params.provider.MethodSource;
@@ -207,6 +208,36 @@ void shouldAppendDictionary(MutableRefToRefDictionary<String, String> dictionary
207208
assertThat(dictionary.size()).isEqualTo(5);
208209
}
209210

211+
@ParameterizedTest
212+
@MethodSource("generateDictionaries")
213+
void shouldIterateAllValuesUsingPartIndex(MutableRefToRefDictionary<String, String> dictionary) {
214+
// given:
215+
var expectedValues = ArrayFactory.mutableArray(String.class);
216+
for (int i = 10; i < 1000; i += 8) {
217+
var value = "value_" + i;
218+
var key = "key_" + i;
219+
expectedValues.add(value);
220+
dictionary.put(key, value);
221+
}
222+
223+
expectedValues.sort();
224+
225+
var accumulatedValues = ArrayFactory.mutableArray(String.class);
226+
var extractedPart = ArrayFactory.mutableArray(String.class);
227+
228+
// when:
229+
int partIndex = 0;
230+
while (partIndex >= 0) {
231+
extractedPart.clear();
232+
partIndex = dictionary.values(extractedPart, partIndex, 20);
233+
accumulatedValues.addAll(extractedPart);
234+
}
235+
accumulatedValues.sort();
236+
237+
// then:
238+
assertThat(accumulatedValues).isEqualTo(expectedValues);
239+
}
240+
210241
private static Stream<Arguments> generateDictionaries() {
211242
return Stream.of(
212243
Arguments.of(MutableRefToRefDictionary.ofTypes(String.class, String.class)),

rlib-collections/src/test/java/javasabr/rlib/collections/dictionary/RefToRefDictionaryTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ void shouldHaveExpectedResultFromForEach(RefToRefDictionary<String, String> dict
157157
// then:
158158
assertThat(pairs).isEqualTo(expectedPairs);
159159
}
160-
160+
161161
private static Stream<Arguments> generateDictionaries() {
162162

163163
RefToRefDictionary<String, String> source = RefToRefDictionary.ofEntries(

0 commit comments

Comments
 (0)