aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse/jgit/internal/util/Optionally.java
diff options
context:
space:
mode:
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.java127
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();
+}