// 
// Decompiled by Procyon v0.6.0
// 

package com.github.luben.zstd;

import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;
import java.nio.ByteBuffer;

public class ZstdDictTrainer
{
    private final int allocatedSize;
    private final ByteBuffer trainingSamples;
    private final List<Integer> sampleSizes;
    private final int dictSize;
    private long filledSize;
    private int level;
    
    public ZstdDictTrainer(final int n, final int n2) {
        this(n, n2, Zstd.defaultCompressionLevel());
    }
    
    public ZstdDictTrainer(final int n, final int dictSize, final int level) {
        this.trainingSamples = ByteBuffer.allocateDirect(n);
        this.sampleSizes = new ArrayList<Integer>();
        this.allocatedSize = n;
        this.dictSize = dictSize;
        this.level = level;
    }
    
    public synchronized boolean addSample(final byte[] src) {
        if (this.filledSize + src.length > this.allocatedSize) {
            return false;
        }
        this.trainingSamples.put(src);
        this.sampleSizes.add(src.length);
        this.filledSize += src.length;
        return true;
    }
    
    public ByteBuffer trainSamplesDirect() throws ZstdException {
        return this.trainSamplesDirect(false);
    }
    
    public synchronized ByteBuffer trainSamplesDirect(final boolean b) throws ZstdException {
        final ByteBuffer allocateDirect = ByteBuffer.allocateDirect(this.dictSize);
        final long trainFromBufferDirect = Zstd.trainFromBufferDirect(this.trainingSamples, this.copyToIntArray(this.sampleSizes), allocateDirect, b, this.level);
        if (Zstd.isError(trainFromBufferDirect)) {
            allocateDirect.limit();
            throw new ZstdException(trainFromBufferDirect);
        }
        allocateDirect.limit();
        return allocateDirect;
    }
    
    public byte[] trainSamples() throws ZstdException {
        return this.trainSamples(false);
    }
    
    public byte[] trainSamples(final boolean b) throws ZstdException {
        final ByteBuffer trainSamplesDirect = this.trainSamplesDirect(b);
        final byte[] dst = new byte[trainSamplesDirect.remaining()];
        trainSamplesDirect.get(dst);
        return dst;
    }
    
    private int[] copyToIntArray(final List<Integer> list) {
        final int[] array = new int[list.size()];
        int n = 0;
        final Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            array[n] = (int)iterator.next();
            ++n;
        }
        return array;
    }
}
