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

org.opendaylight.yangtools.util.SingletonSpliterators Maven / Gradle / Ivy

There is a newer version: 14.0.4
Show newest version
/*
 * 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; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy