01 /*
02 * Java Genetic Algorithm Library (jenetics-8.0.0).
03 * Copyright (c) 2007-2024 Franz Wilhelmstötter
04 *
05 * Licensed under the Apache License, Version 2.0 (the "License");
06 * you may not use this file except in compliance with the License.
07 * You may obtain a copy of the License at
08 *
09 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 * Author:
18 * Franz Wilhelmstötter (franz.wilhelmstoetter@gmail.com)
19 */
20 package io.jenetics.util;
21
22 import static java.util.Objects.requireNonNull;
23
24 import java.util.Comparator;
25 import java.util.function.Supplier;
26
27 /**
28 * Object wrapper, which makes the wrapped value {@link Comparable}, by defining
29 * a separate {@link Comparator}.
30 *
31 * @param <T> the type of the wrapped object
32 *
33 * @author <a href="mailto:franz.wilhelmstoetter@gmail.com">Franz Wilhelmstötter</a>
34 * @version 6.3
35 * @since 6.3
36 */
37 public final class Ordered<T> implements Comparable<Ordered<T>>, Supplier<T> {
38 private final T _value;
39 private final Comparator<? super T> _comparator;
40
41 private Ordered(final T value, final Comparator<? super T> comparator) {
42 _value = value;
43 _comparator = requireNonNull(comparator);
44 }
45
46 /**
47 * Return the wrapped value.
48 *
49 * @return the wrapped value
50 */
51 @Override
52 public T get() {
53 return _value;
54 }
55
56 @Override
57 public int compareTo(final Ordered<T> other) {
58 return _comparator.compare(_value, other._value);
59 }
60
61 /**
62 * Make the given {@code value} comparable, by using the given
63 * {@code comparator}.
64 *
65 * @param value the wrapped object, may be {@code null}
66 * @param comparator the comparator used for comparing two value objects
67 * @param <T> the type of the wrapped object
68 * @return a new ordered object
69 * @throws NullPointerException if the given {@code comparator} is
70 * {@code null}
71 */
72 public static <T> Ordered<T> of(
73 final T value,
74 final Comparator<? super T> comparator
75 ) {
76 return new Ordered<>(value, comparator);
77 }
78
79 }
|