1a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong/*
2a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
3a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong *
5a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * This code is free software; you can redistribute it and/or modify it
6a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * under the terms of the GNU General Public License version 2 only, as
7a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * published by the Free Software Foundation.  Oracle designates this
8a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * particular file as subject to the "Classpath" exception as provided
9a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * by Oracle in the LICENSE file that accompanied this code.
10a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong *
11a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * This code is distributed in the hope that it will be useful, but WITHOUT
12a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * version 2 for more details (a copy is included in the LICENSE file that
15a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * accompanied this code).
16a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong *
17a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * You should have received a copy of the GNU General Public License version
18a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * 2 along with this work; if not, write to the Free Software Foundation,
19a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong *
21a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * or visit www.oracle.com if you need additional information or have any
23a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * questions.
24a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong */
25a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kongpackage java.util;
26a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong
27a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kongimport java.io.Serializable;
28a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kongimport java.util.function.BinaryOperator;
29a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kongimport java.util.function.Function;
30a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kongimport java.util.function.ToDoubleFunction;
31a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kongimport java.util.function.ToIntFunction;
32a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kongimport java.util.function.ToLongFunction;
33a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong
34a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong/**
35a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong * Package private supporting class for {@link Comparator}.
36a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong */
37a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kongclass Comparators {
38a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong    private Comparators() {
39a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        throw new AssertionError("no instances");
40a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong    }
41a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong
42a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong    /**
43a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong     * Compares {@link Comparable} objects in natural order.
44a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong     *
45a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong     * @see Comparable
46a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong     */
47a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong    enum NaturalOrderComparator implements Comparator<Comparable<Object>> {
48a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        INSTANCE;
49a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong
50a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        @Override
51a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        public int compare(Comparable<Object> c1, Comparable<Object> c2) {
52a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong            return c1.compareTo(c2);
53a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        }
54a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong
55a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        @Override
56a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        public Comparator<Comparable<Object>> reversed() {
57a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong            return Comparator.reverseOrder();
58a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        }
59a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong    }
60a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong
61a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong    /**
62a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong     * Null-friendly comparators
63a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong     */
64a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong    final static class NullComparator<T> implements Comparator<T>, Serializable {
65a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        private static final long serialVersionUID = -7569533591570686392L;
66a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        private final boolean nullFirst;
67a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        // if null, non-null Ts are considered equal
68a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        private final Comparator<T> real;
69a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong
70a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        @SuppressWarnings("unchecked")
71a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        NullComparator(boolean nullFirst, Comparator<? super T> real) {
72a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong            this.nullFirst = nullFirst;
73a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong            this.real = (Comparator<T>) real;
74a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        }
75a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong
76a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        @Override
77a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        public int compare(T a, T b) {
78a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong            if (a == null) {
79a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong                return (b == null) ? 0 : (nullFirst ? -1 : 1);
80a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong            } else if (b == null) {
81a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong                return nullFirst ? 1: -1;
82a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong            } else {
83a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong                return (real == null) ? 0 : real.compare(a, b);
84a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong            }
85a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        }
86a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong
87a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        @Override
88a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        public Comparator<T> thenComparing(Comparator<? super T> other) {
89a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong            Objects.requireNonNull(other);
90a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong            return new NullComparator<>(nullFirst, real == null ? other : real.thenComparing(other));
91a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        }
92a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong
93a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        @Override
94a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        public Comparator<T> reversed() {
95a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong            return new NullComparator<>(!nullFirst, real == null ? null : real.reversed());
96a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong        }
97a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong    }
98a8da445cdc91374ed0e105686feefd7e8ed79dc1Yi Kong}
99