| // Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| package com.android.tools.r8.utils.structural; |
| |
| /** An ordered type is a type with a total order. */ |
| public interface Ordered<T> extends Equatable<T>, Comparable<T> { |
| |
| /** Definition of total order. */ |
| @Override |
| int compareTo(T other); |
| |
| /** Default equality is now defined by the order. */ |
| @Override |
| default boolean isEqualTo(T other) { |
| assert other != null; |
| return this == other || compareTo(other) == 0; |
| } |
| |
| static <T extends Ordered<T>> T min(T o1, T o2) { |
| return o1.isLessThan(o2) ? o1 : o2; |
| } |
| |
| static <T extends Ordered<T>> T max(T o1, T o2) { |
| return o1.isLessThan(o2) ? o2 : o1; |
| } |
| |
| static <T extends Ordered<T>> T minIgnoreNull(T o1, T o2) { |
| if (o1 == null) { |
| return o2; |
| } |
| if (o2 == null) { |
| return o1; |
| } |
| return min(o1, o2); |
| } |
| |
| static <T extends Ordered<T>> T maxIgnoreNull(T o1, T o2) { |
| if (o1 == null) { |
| return o2; |
| } |
| if (o2 == null) { |
| return o1; |
| } |
| return o1.isLessThan(o2) ? o2 : o1; |
| } |
| |
| default boolean isLessThan(T other) { |
| return compareTo(other) < 0; |
| } |
| |
| default boolean isLessThanOrEqualTo(T other) { |
| return compareTo(other) <= 0; |
| } |
| |
| default boolean isGreaterThan(T other) { |
| return compareTo(other) > 0; |
| } |
| |
| default boolean isGreaterThanOrEqualTo(T other) { |
| return compareTo(other) >= 0; |
| } |
| } |