public KeyDeps slice()

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);
    }