in accord-core/src/main/java/accord/primitives/KeyDeps.java [163:210]
public KeyDeps slice(Ranges ranges)
{
if (isEmpty())
return new KeyDeps(keys, txnIds, keysToTxnIds);
// TODO (low priority, efficiency): can slice in parallel with selecting keyToTxnId contents to avoid duplicate merging
Keys select = keys.slice(ranges);
if (select.isEmpty())
return new KeyDeps(Keys.EMPTY, NO_TXNIDS, NO_INTS);
if (select.size() == keys.size())
return this;
int i = 0;
int offset = select.size();
for (int j = 0 ; j < select.size() ; ++j)
{
int findi = keys.findNext(i, select.get(j), FAST);
if (findi < 0)
continue;
i = findi;
offset += keysToTxnIds[i] - (i == 0 ? keys.size() : keysToTxnIds[i - 1]);
}
int[] src = keysToTxnIds;
int[] trg = new int[offset];
i = 0;
offset = select.size();
for (int j = 0 ; j < select.size() ; ++j)
{
int findi = keys.findNext(i, select.get(j), FAST);
if (findi >= 0)
{
i = findi;
int start = i == 0 ? keys.size() : src[i - 1];
int count = src[i] - start;
System.arraycopy(src, start, trg, offset, count);
offset += count;
}
trg[j] = offset;
}
TxnId[] txnIds = trimUnusedValues(select.keys, this.txnIds, trg, TxnId[]::new);
return new KeyDeps(select, txnIds, trg);
}