diff options
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit/internal/util/Optionally.java')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/internal/util/Optionally.java | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/util/Optionally.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/util/Optionally.java new file mode 100644 index 0000000000..270b760562 --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/util/Optionally.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Distribution License v. 1.0 which is available at + * https://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +package org.eclipse.jgit.internal.util; + +import java.lang.ref.SoftReference; +import java.util.Optional; + +/** + * Interface representing a reference to a potentially mutable optional object. + * + * @param <T> + * type of the mutable optional object + * + * @since 6.7 + */ +public interface Optionally<T> { + /** + * A permanently empty Optionally + * + * @param <T> + * type of the mutable optional object + * + */ + public class Empty<T> implements Optionally<T> { + @Override + public void clear() { + // empty + } + + @Override + public Optional<T> getOptional() { + return Optional.empty(); + } + } + + /** + * A permanent(hard) reference to an object + * + * @param <T> + * type of the mutable optional object + * + */ + public class Hard<T> implements Optionally<T> { + /** + * The mutable optional object + */ + protected Optional<T> optional; + + /** + * @param element + * the mutable optional object + */ + public Hard(T element) { + optional = Optional.ofNullable(element); + } + + @Override + public void clear() { + optional = Optional.empty(); + } + + @Override + public Optional<T> getOptional() { + return optional; + } + } + + /** + * A SoftReference Optionally + * + * @param <T> + * type of the mutable optional object + * + */ + public class Soft<T> extends SoftReference<T> implements Optionally<T> { + /** + * @param t + * the mutable optional object + */ + public Soft(T t) { + super(t); + } + + @Override + public Optional<T> getOptional() { + return Optional.ofNullable(get()); + } + } + + /** + * The empty Optionally + */ + public static final Optionally<?> EMPTY = new Empty<>(); + + /** + * Get empty Optionally + * + * @param <T> + * type of the empty Optionally + * @return the empty Optionally + */ + @SuppressWarnings("unchecked") + public static <T> Optionally<T> empty() { + return (Optionally<T>) EMPTY; + } + + /** + * Clear the object + */ + void clear(); + + /** + * Get an Optional representing the current state of the object + * + * @return the mutable optional object + */ + Optional<T> getOptional(); +} |