1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * 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 package org.apache.commons.functor.core.comparator;
18
19 import java.io.Serializable;
20 import org.apache.commons.functor.UnaryPredicate;
21
22 /**
23 * A {@link UnaryPredicate} that tests whether a {@link Comparable} object is
24 * within a range. The range is defined in the constructor.
25 *
26 * @since 1.0
27 * @version $Revision: 1171154 $ $Date: 2011-09-15 17:58:38 +0200 (Thu, 15 Sep 2011) $
28 * @author Jason Horman (jason@jhorman.org)
29 */
30
31 public class IsWithinRange<A extends Comparable<A>> implements UnaryPredicate<A>, Serializable {
32 /**
33 * serialVersionUID declaration.
34 */
35 private static final long serialVersionUID = -7584005207181667878L;
36
37 /** Hashcode of the name of this Predicate. */
38 private static final int NAME_HASH_CODE = "IsWithinRange".hashCode();
39
40 /** Base Hashcode. */
41 private static final int BASE_HASH_CODE = 29;
42
43 /***************************************************
44 * Instance variables
45 ***************************************************/
46
47 /** The minimum value of the range. */
48 private final A min;
49 /** The maximum value of the range. */
50 private final A max;
51
52 /***************************************************
53 * Constructors
54 ***************************************************/
55
56 /**
57 * Create a new IsWithinRange by passing in the range that will
58 * be used in the {@link #test}.
59 * @param min Comparable
60 * @param max Comparable
61 */
62 public IsWithinRange(A min, A max) {
63 if (min == null || max == null) {
64 throw new IllegalArgumentException("min and max must not be null");
65 }
66 if (min.compareTo(max) > 0) {
67 throw new IllegalArgumentException("min must be <= max");
68 }
69 this.min = min;
70 this.max = max;
71 }
72
73 /***************************************************
74 * Instance methods
75 ***************************************************/
76
77 /**
78 * {@inheritDoc}
79 * Test if the passed in object is within the specified range.
80 */
81 public final boolean test(A o) {
82 return o.compareTo(min) >= 0 && o.compareTo(max) <= 0;
83 }
84
85 /**
86 * {@inheritDoc}
87 */
88 public final boolean equals(Object o) {
89 if (this == o) {
90 return true;
91 }
92 if (!(o instanceof IsWithinRange<?>)) {
93 return false;
94 }
95 final IsWithinRange<?> isWithinRange = (IsWithinRange<?>) o;
96 return max.equals(isWithinRange.max) && min.equals(isWithinRange.min);
97 }
98
99 /**
100 * {@inheritDoc}
101 */
102 public int hashCode() {
103 return BASE_HASH_CODE * min.hashCode() + max.hashCode() + NAME_HASH_CODE;
104 }
105
106 /**
107 * {@inheritDoc}
108 */
109 public String toString() {
110 return "IsWithinRange(" + min + ", " + max + ")";
111 }
112
113 /**
114 * Obtain an IsWithinRange instance.
115 * @param <A>
116 * @param min A
117 * @param max A
118 * @return IsWithinRange<A>
119 */
120 public static <A extends Comparable<A>> IsWithinRange<A> instance(A min, A max) {
121 return new IsWithinRange<A>(min, max);
122 }
123 }