17dd252788645e940eada959bdde927426e2531c9Paul Duffin/*
27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2011 The Guava Authors
37dd252788645e940eada959bdde927426e2531c9Paul Duffin *
47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License.
67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at
77dd252788645e940eada959bdde927426e2531c9Paul Duffin *
87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
97dd252788645e940eada959bdde927426e2531c9Paul Duffin *
107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software
117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and
147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License.
157dd252788645e940eada959bdde927426e2531c9Paul Duffin */
167dd252788645e940eada959bdde927426e2531c9Paul Duffin
177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.base;
187dd252788645e940eada959bdde927426e2531c9Paul Duffin
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.base.Preconditions.checkNotNull;
207dd252788645e940eada959bdde927426e2531c9Paul Duffin
217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.GwtCompatible;
227dd252788645e940eada959bdde927426e2531c9Paul Duffin
237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Collections;
247dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Set;
257dd252788645e940eada959bdde927426e2531c9Paul Duffin
267dd252788645e940eada959bdde927426e2531c9Paul Duffinimport javax.annotation.Nullable;
277dd252788645e940eada959bdde927426e2531c9Paul Duffin
287dd252788645e940eada959bdde927426e2531c9Paul Duffin/**
297dd252788645e940eada959bdde927426e2531c9Paul Duffin * Implementation of an {@link Optional} containing a reference.
307dd252788645e940eada959bdde927426e2531c9Paul Duffin */
317dd252788645e940eada959bdde927426e2531c9Paul Duffin@GwtCompatible
327dd252788645e940eada959bdde927426e2531c9Paul Duffinfinal class Present<T> extends Optional<T> {
337dd252788645e940eada959bdde927426e2531c9Paul Duffin  private final T reference;
347dd252788645e940eada959bdde927426e2531c9Paul Duffin
357dd252788645e940eada959bdde927426e2531c9Paul Duffin  Present(T reference) {
367dd252788645e940eada959bdde927426e2531c9Paul Duffin    this.reference = reference;
377dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
387dd252788645e940eada959bdde927426e2531c9Paul Duffin
390888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public boolean isPresent() {
407dd252788645e940eada959bdde927426e2531c9Paul Duffin    return true;
417dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
427dd252788645e940eada959bdde927426e2531c9Paul Duffin
430888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public T get() {
447dd252788645e940eada959bdde927426e2531c9Paul Duffin    return reference;
457dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
467dd252788645e940eada959bdde927426e2531c9Paul Duffin
470888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public T or(T defaultValue) {
487dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(defaultValue, "use Optional.orNull() instead of Optional.or(null)");
497dd252788645e940eada959bdde927426e2531c9Paul Duffin    return reference;
507dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
517dd252788645e940eada959bdde927426e2531c9Paul Duffin
520888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public Optional<T> or(Optional<? extends T> secondChoice) {
537dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(secondChoice);
547dd252788645e940eada959bdde927426e2531c9Paul Duffin    return this;
557dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
567dd252788645e940eada959bdde927426e2531c9Paul Duffin
570888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public T or(Supplier<? extends T> supplier) {
587dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(supplier);
597dd252788645e940eada959bdde927426e2531c9Paul Duffin    return reference;
607dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
617dd252788645e940eada959bdde927426e2531c9Paul Duffin
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public T orNull() {
637dd252788645e940eada959bdde927426e2531c9Paul Duffin    return reference;
647dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
657dd252788645e940eada959bdde927426e2531c9Paul Duffin
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public Set<T> asSet() {
677dd252788645e940eada959bdde927426e2531c9Paul Duffin    return Collections.singleton(reference);
687dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
690888a09821a98ac0680fad765217302858e70fa4Paul Duffin
700888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public <V> Optional<V> transform(Function<? super T, V> function) {
717dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new Present<V>(checkNotNull(function.apply(reference),
727dd252788645e940eada959bdde927426e2531c9Paul Duffin        "the Function passed to Optional.transform() must not return null."));
737dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
747dd252788645e940eada959bdde927426e2531c9Paul Duffin
750888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public boolean equals(@Nullable Object object) {
767dd252788645e940eada959bdde927426e2531c9Paul Duffin    if (object instanceof Present) {
777dd252788645e940eada959bdde927426e2531c9Paul Duffin      Present<?> other = (Present<?>) object;
787dd252788645e940eada959bdde927426e2531c9Paul Duffin      return reference.equals(other.reference);
797dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
807dd252788645e940eada959bdde927426e2531c9Paul Duffin    return false;
817dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
827dd252788645e940eada959bdde927426e2531c9Paul Duffin
830888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public int hashCode() {
847dd252788645e940eada959bdde927426e2531c9Paul Duffin    return 0x598df91c + reference.hashCode();
857dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
867dd252788645e940eada959bdde927426e2531c9Paul Duffin
870888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public String toString() {
887dd252788645e940eada959bdde927426e2531c9Paul Duffin    return "Optional.of(" + reference + ")";
897dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
907dd252788645e940eada959bdde927426e2531c9Paul Duffin
917dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static final long serialVersionUID = 0;
927dd252788645e940eada959bdde927426e2531c9Paul Duffin}
93