StoredDoubleTimeSeries.java

/**
 * Copyright (c) 2017, RTE (http://www.rte-france.com)
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 * SPDX-License-Identifier: MPL-2.0
 */
package com.powsybl.timeseries;

import java.nio.DoubleBuffer;
import java.util.List;
import java.util.function.Consumer;

/**
 * @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
 */
public class StoredDoubleTimeSeries extends AbstractTimeSeries<DoublePoint, DoubleDataChunk, DoubleTimeSeries> implements DoubleTimeSeries {

    private static final double[] NAN_ARRAY = new double[]{Double.NaN};

    public StoredDoubleTimeSeries(TimeSeriesMetadata metadata, DoubleDataChunk... chunks) {
        super(metadata, chunks);
    }

    public StoredDoubleTimeSeries(TimeSeriesMetadata metadata, List<DoubleDataChunk> chunks) {
        super(metadata, chunks);
    }

    protected CompressedDoubleDataChunk createGapFillingChunk(int i, int length) {
        return new CompressedDoubleDataChunk(i, length, NAN_ARRAY, new int[] {length});
    }

    @Override
    protected DoubleTimeSeries createTimeSeries(DoubleDataChunk chunk) {
        return new StoredDoubleTimeSeries(metadata, chunk);
    }

    private void forEachChunk(Consumer<DoubleDataChunk> consumer) {
        chunks.forEach(consumer);
    }

    @Override
    public void fillBuffer(DoubleBuffer buffer, int timeSeriesOffset) {
        forEachChunk(chunk -> chunk.fillBuffer(buffer, timeSeriesOffset));
    }

    @Override
    public void fillBuffer(BigDoubleBuffer buffer, long timeSeriesOffset) {
        forEachChunk(chunk -> chunk.fillBuffer(buffer, timeSeriesOffset));
    }

    @Override
    public double[] toArray() {
        DoubleBuffer buffer = DoubleBuffer.allocate(metadata.getIndex().getPointCount());
        for (int i = 0; i < metadata.getIndex().getPointCount(); i++) {
            buffer.put(i, Double.NaN);
        }
        fillBuffer(buffer, 0);
        return buffer.array();
    }
}