VariantArray.java

/**
 * Copyright (c) 2016, All partners of the iTesla project (http://www.itesla-project.eu/consortium)
 * 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.iidm.network.impl;

import com.powsybl.commons.ref.Ref;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * To easily manage an array of variant.
 *
 * @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
 */
class VariantArray<S extends Variant> {

    private final Ref<? extends VariantManagerHolder> variantManagerHolder;

    private final List<S> variants;

    VariantArray(Ref<? extends VariantManagerHolder> variantManagerHolder, VariantFactory<S> variantFactory) {
        this.variantManagerHolder = variantManagerHolder;
        VariantManagerImpl variantManager = variantManagerHolder.get().getVariantManager();
        variants = Collections.synchronizedList(new ArrayList<S>(variantManager.getVariantArraySize()));
        for (int i = 0; i < variantManager.getVariantArraySize(); i++) {
            variants.add(null);
        }
        for (int i : variantManager.getVariantIndexes()) {
            variants.set(i, variantFactory.newVariant());
        }
    }

    S get() {
        return variants.get(variantManagerHolder.get().getVariantManager().getVariantContext().getVariantIndex());
    }

    void push(int number, VariantFactory<S> variantFactory) {
        for (int i = 0; i < number; i++) {
            variants.add(variantFactory.newVariant());
        }
    }

    void push(VariantFactory<S> variantFactory) {
        variants.add(variantFactory.newVariant());
    }

    void pop(int number) {
        for (int i = 0; i < number; i++) {
            variants.remove(variants.size() - 1);
        }
    }

    void delete(int index) {
        variants.set(index, null);
    }

    void allocate(int[] indexes, VariantFactory<S> variantFactory) {
        for (int index : indexes) {
            variants.set(index, variantFactory.newVariant());
        }
    }

    S copy(int index) {
        return variants.get(index).copy();
    }

}