1 /*
   2  * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * The Universal Permissive License (UPL), Version 1.0
   6  *
   7  * Subject to the condition set forth below, permission is hereby granted to any
   8  * person obtaining a copy of this software, associated documentation and/or
   9  * data (collectively the "Software"), free of charge and under any and all
  10  * copyright rights in the Software, and any and all patent rights owned or
  11  * freely licensable by each licensor hereunder covering either (i) the
  12  * unmodified Software as contributed to or provided by such licensor, or (ii)
  13  * the Larger Works (as defined below), to deal in both
  14  *
  15  * (a) the Software, and
  16  *
  17  * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
  18  * one is included with the Software each a "Larger Work" to which the Software
  19  * is contributed by such licensors),
  20  *
  21  * without restriction, including without limitation the rights to copy, create
  22  * derivative works of, display, perform, and distribute the Software and make,
  23  * use, sell, offer for sale, import, export, have made, and have sold the
  24  * Software and the Larger Work(s), and to sublicense the foregoing rights on
  25  * either these or other terms.
  26  *
  27  * This license is subject to the following condition:
  28  *
  29  * The above copyright notice and either this complete permission notice or at a
  30  * minimum a reference to the UPL must be included in all copies or substantial
  31  * portions of the Software.
  32  *
  33  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  34  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  35  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  36  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  37  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  38  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  39  * SOFTWARE.
  40  */
  41 package jdk.internal.vm.compiler.collections;
  42 
  43 /**
  44  * Strategy for comparing two objects. Default predefined strategies are {@link #DEFAULT},
  45  * {@link #IDENTITY}, and {@link #IDENTITY_WITH_SYSTEM_HASHCODE}.
  46  *
  47  * @since 1.0
  48  */
  49 public abstract class Equivalence {
  50 
  51     /**
  52      * Default equivalence calling {@link #equals(Object)} to check equality and {@link #hashCode()}
  53      * for obtaining hash values. Do not change the logic of this class as it may be inlined in
  54      * other places.
  55      *
  56      * @since 1.0
  57      */
  58     public static final Equivalence DEFAULT = new Equivalence() {
  59 
  60         @Override
  61         public boolean equals(Object a, Object b) {
  62             return a.equals(b);
  63         }
  64 
  65         @Override
  66         public int hashCode(Object o) {
  67             return o.hashCode();
  68         }
  69     };
  70 
  71     /**
  72      * Identity equivalence using {@code ==} to check equality and {@link #hashCode()} for obtaining
  73      * hash values. Do not change the logic of this class as it may be inlined in other places.
  74      *
  75      * @since 1.0
  76      */
  77     public static final Equivalence IDENTITY = new Equivalence() {
  78 
  79         @Override
  80         public boolean equals(Object a, Object b) {
  81             return a == b;
  82         }
  83 
  84         @Override
  85         public int hashCode(Object o) {
  86             return o.hashCode();
  87         }
  88     };
  89 
  90     /**
  91      * Identity equivalence using {@code ==} to check equality and
  92      * {@link System#identityHashCode(Object)} for obtaining hash values. Do not change the logic of
  93      * this class as it may be inlined in other places.
  94      *
  95      * @since 1.0
  96      */
  97     public static final Equivalence IDENTITY_WITH_SYSTEM_HASHCODE = new Equivalence() {
  98 
  99         @Override
 100         public boolean equals(Object a, Object b) {
 101             return a == b;
 102         }
 103 
 104         @Override
 105         public int hashCode(Object o) {
 106             return System.identityHashCode(o);
 107         }
 108     };
 109 
 110     /**
 111      * Subclass for creating custom equivalence definitions.
 112      *
 113      * @since 1.0
 114      */
 115     protected Equivalence() {
 116     }
 117 
 118     /**
 119      * Returns {@code true} if the non-{@code null} arguments are equal to each other and
 120      * {@code false} otherwise.
 121      *
 122      * @since 1.0
 123      */
 124     public abstract boolean equals(Object a, Object b);
 125 
 126     /**
 127      * Returns the hash code of a non-{@code null} argument {@code o}.
 128      *
 129      * @since 1.0
 130      */
 131     public abstract int hashCode(Object o);
 132 }