All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.digitalid.utility.conversion.collectors.ArrayCollector Maven / Gradle / Ivy

The newest version!
package net.digitalid.utility.conversion.collectors;

import javax.annotation.Nonnull;

import net.digitalid.utility.annotations.generics.Specifiable;
import net.digitalid.utility.annotations.method.Impure;
import net.digitalid.utility.annotations.method.Pure;
import net.digitalid.utility.annotations.ownership.Capturable;
import net.digitalid.utility.annotations.ownership.Captured;
import net.digitalid.utility.conversion.exceptions.RecoveryException;
import net.digitalid.utility.conversion.exceptions.RecoveryExceptionBuilder;
import net.digitalid.utility.functional.failable.FailableCollector;
import net.digitalid.utility.string.Strings;
import net.digitalid.utility.validation.annotations.math.NonNegative;
import net.digitalid.utility.validation.annotations.type.Mutable;

@Mutable
public class ArrayCollector<@Specifiable TYPE> implements FailableCollector {
    
    /* -------------------------------------------------- Array -------------------------------------------------- */
    
    private final @Nonnull TYPE[] array;
    
    /* -------------------------------------------------- Constructor -------------------------------------------------- */
    
    @SuppressWarnings("unchecked")
    protected ArrayCollector(@NonNegative int size) {
        this.array = (TYPE[]) new Object[size];
    }
    
    @Pure
    public static <@Specifiable TYPE> @Nonnull ArrayCollector with(@NonNegative int size) {
        return new ArrayCollector<>(size);
    }
    
    /* -------------------------------------------------- Collector -------------------------------------------------- */
    
    private int nextIndex = 0;
    
    @Impure
    @Override
    public void consume(@Captured TYPE element) throws RecoveryException {
        if (nextIndex < array.length) {
            array[nextIndex] = element;
            nextIndex += 1;
        } else {
            throw RecoveryExceptionBuilder.withMessage("The array can take at most " + Strings.getCardinal(array.length) + " elements.").build();
        }
    }
    
    @Pure
    @Override
    @SuppressWarnings("ReturnOfCollectionOrArrayField")
    public @Capturable TYPE[] getResult() {
        return array;
    }
    
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy