package com.carrotsearch.hppc.examples;
import static com.carrotsearch.hppc.examples.Helpers.*;
import static org.assertj.core.api.Assertions.*;
import org.junit.Before;
import org.junit.Test;
import com.carrotsearch.hppc.IntHashSet;
import com.carrotsearch.hppc.IntScatterSet;
import com.carrotsearch.hppc.cursors.IntCursor;
import com.carrotsearch.hppc.procedures.IntProcedure;
/**
* Examples of how to iterate over HPPC sets.
*/
public class HppcExample_003_IteratingOverSets {
public IntHashSet hashSet;
public IntScatterSet scatterSet;
@Before
public void setup() {
// Note that copying the other way around wouldn't be safe (and is thus impossible
// because there is no IntScatterSet constructor that can copy keys from another
// container).
scatterSet = IntScatterSet.from(1, 1, 2, 3, 5, 0);
hashSet = new IntHashSet(scatterSet);
}
/**
* All sets implement the {@link Iterable} interface that returns a "cursor"
* object that moves over the container's elements. The cursor object remains
* identical for the entire iteration (very little memory overhead).
*
* The cursor's index points at the underlying buffer's position of a
* given element, the cursor's value is the element itself.
*/
@Test
public void cursor() {
for (IntCursor c : scatterSet) {
printfln("scatterSet contains %d (at buffer index %d)", c.value, c.index);
assertThat(c.value).isEqualTo(scatterSet.keys[c.index]);
}
for (IntCursor c : hashSet) {
printfln("hashSet contains %d (at buffer index %d)", c.value, c.index);
assertThat(c.value).isEqualTo(hashSet.keys[c.index]);
}
}
/**
* A for-each type loop with an anonymous class.
*/
@Test
public void forEachLoop() {
scatterSet.forEach(new IntProcedure() {
@Override
public void apply(int value) {
printfln("scatterSet contains %d", value);
}
});
hashSet.forEach(new IntProcedure() {
@Override
public void apply(int value) {
printfln("hashSet contains %d", value);
}
});
}
}