org.opendaylight.yangtools.util.SingletonSpliterators Maven / Gradle / Ivy
/*
* Copyright (c) 2018 Pantheon Technologies, s.r.o. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.yangtools.util;
import static java.util.Objects.requireNonNull;
import com.google.common.annotations.Beta;
import java.util.Spliterator;
import java.util.function.Consumer;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.yangtools.concepts.Mutable;
/**
* Utility methods for instantiating {@link Spliterator}s containing a single element.
*
* @author Robert Varga
*/
@Beta
@NonNullByDefault
public final class SingletonSpliterators {
private SingletonSpliterators() {
}
/**
* Create a new {@link Spliterator} reporting specified element. It has the following characteristics:
*
* - {@link Spliterator#DISTINCT}
* - {@link Spliterator#IMMUTABLE}
* - {@link Spliterator#NONNULL}
* - {@link Spliterator#ORDERED}
* - {@link Spliterator#SIZED}
* - {@link Spliterator#SUBSIZED}
*
*
* @param element Single element to report
* @param the type of elements returned by this Spliterator
* @return A new spliterator
* @throws NullPointerException if element is null
*/
public static Spliterator immutableOf(final T element) {
return new ImmutableNonNull<>(element);
}
/**
* Create a new {@link Spliterator} reporting a {@code null} element. It has the following characteristics:
*
* - {@link Spliterator#DISTINCT}
* - {@link Spliterator#IMMUTABLE}
* - {@link Spliterator#ORDERED}
* - {@link Spliterator#SIZED}
* - {@link Spliterator#SUBSIZED}
*
*
* @return A new spliterator
*/
public static <@Nullable T> Spliterator immutableOfNull() {
return new ImmutableNull<>();
}
private static final class ImmutableNonNull implements Mutable, Spliterator {
private final T element;
private boolean consumed;
private ImmutableNonNull(final T element) {
this.element = requireNonNull(element);
}
@Override
public boolean tryAdvance(final @Nullable Consumer action) {
requireNonNull(action);
if (consumed) {
return false;
}
action.accept(element);
consumed = true;
return true;
}
@Override
public @Nullable Spliterator trySplit() {
return null;
}
@Override
public long estimateSize() {
return consumed ? 0 : 1;
}
@Override
public int characteristics() {
return Spliterator.NONNULL | Spliterator.SIZED | Spliterator.SUBSIZED | Spliterator.IMMUTABLE
| Spliterator.DISTINCT | Spliterator.ORDERED;
}
}
private static final class ImmutableNull<@Nullable E> implements Mutable, Spliterator {
private boolean consumed;
@Override
public boolean tryAdvance(final @Nullable Consumer action) {
requireNonNull(action);
if (consumed) {
return false;
}
action.accept(null);
consumed = true;
return true;
}
@Override
public @Nullable Spliterator trySplit() {
return null;
}
@Override
public long estimateSize() {
return consumed ? 0 : 1;
}
@Override
public int characteristics() {
return Spliterator.SIZED | Spliterator.SUBSIZED | Spliterator.IMMUTABLE | Spliterator.DISTINCT
| Spliterator.ORDERED;
}
}
}