| // Copyright 2014 The Bazel Authors. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.devtools.build.xcode.util; |
| |
| import com.google.common.base.Preconditions; |
| import com.google.common.collect.ImmutableList; |
| |
| /** |
| * Represents a type whose equality, hash code, and string representation are defined by a single |
| * immutable array. This class is designed to be extended by a final class, and to pass the member |
| * data to this class's constructor. |
| * |
| * @param <V> the base class that extends {@code Value} |
| */ |
| public class Value<V extends Value<V>> { |
| private final Object memberData; |
| |
| /** |
| * Constructs a new instance with the given member data. Generally, all member data should be |
| * reflected in final fields in the child class. |
| * @throws NullPointerException if any element in {@code memberData} is null |
| */ |
| public Value(Object... memberData) { |
| Preconditions.checkArgument(memberData.length > 0); |
| this.memberData = (memberData.length == 1) |
| ? Preconditions.checkNotNull(memberData[0]) : ImmutableList.copyOf(memberData); |
| } |
| |
| /** |
| * A type-safe alternative to calling {@code a.equals(b)}. When using {@code a.equals(b)}, |
| * {@code b} may accidentally be a different class from {@code a}, in which case there will be no |
| * compiler warning and the result will always be false. This method requires both values to have |
| * compatible types and to be non-null. |
| */ |
| public boolean equalsOther(V other) { |
| return equals(Preconditions.checkNotNull(other)); |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| if ((o == null) || (o.getClass() != getClass())) { |
| return false; |
| } |
| Value<?> other = (Value<?>) o; |
| return memberData.equals(other.memberData); |
| } |
| |
| @Override |
| public int hashCode() { |
| return memberData.hashCode(); |
| } |
| |
| @Override |
| public String toString() { |
| return getClass().getSimpleName() + ":" + memberData.toString(); |
| } |
| } |