1 /*
2 * Licensed under the Apache License, Version 2.0 (the "License");
3 * you may not use this file except in compliance with the License.
4 * You may obtain a copy of the License at
5 *
6 * http://www.apache.org/licenses/LICENSE-2.0
7 *
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS,
10 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 * See the License for the specific language governing permissions and
12 * limitations under the License.
13 */
14
15 package org.apache.commons.functor.generator.util;
16
17 import org.apache.commons.functor.UnaryProcedure;
18 import org.apache.commons.functor.generator.BaseGenerator;
19
20 /**
21 * A generator for the range <i>from</i> (inclusive) to <i>to</i> (exclusive).
22 *
23 * @since 1.0
24 * @version $Revision: 1156805 $ $Date: 2011-08-11 22:15:35 +0200 (Thu, 11 Aug 2011) $
25 * @author Jason Horman (jason@jhorman.org)
26 * @author Rodney Waldhoff
27 */
28 public final class LongRange extends BaseGenerator<Long> {
29 // attributes
30 //---------------------------------------------------------------
31
32 private final long from;
33 private final long to;
34 private final long step;
35
36 // constructors
37 //---------------------------------------------------------------
38 /**
39 * Create a new LongRange.
40 * @param from start
41 * @param to end
42 */
43 public LongRange(Number from, Number to) {
44 this(from.longValue(), to.longValue());
45 }
46
47 /**
48 * Create a new LongRange.
49 * @param from start
50 * @param to end
51 * @param step increment
52 */
53 public LongRange(Number from, Number to, Number step) {
54 this(from.longValue(), to.longValue(), step.longValue());
55 }
56
57 /**
58 * Create a new LongRange.
59 * @param from start
60 * @param to end
61 */
62 public LongRange(long from, long to) {
63 this(from, to, defaultStep(from, to));
64 }
65
66 /**
67 * Create a new LongRange.
68 * @param from start
69 * @param to end
70 * @param step increment
71 */
72 public LongRange(long from, long to, long step) {
73 if (from != to && signOf(step) != signOf(to - from)) {
74 throw new IllegalArgumentException("Will never reach " + to + " from " + from + " using step " + step);
75 }
76 this.from = from;
77 this.to = to;
78 this.step = step;
79 }
80
81 // methods
82 //---------------------------------------------------------------
83 /**
84 * {@inheritDoc}
85 */
86 public void run(UnaryProcedure<? super Long> proc) {
87 if (signOf(step) == -1L) {
88 for (long i = from; i > to; i += step) {
89 proc.run(i);
90 }
91 } else {
92 for (long i = from; i < to; i += step) {
93 proc.run(i);
94 }
95 }
96 }
97
98 /**
99 * {@inheritDoc}
100 */
101 public String toString() {
102 return "LongRange<" + from + "," + to + "," + step + ">";
103 }
104
105 /**
106 * {@inheritDoc}
107 */
108 public boolean equals(Object obj) {
109 if (obj == this) {
110 return true;
111 }
112 if (!(obj instanceof LongRange)) {
113 return false;
114 }
115 LongRange that = (LongRange) obj;
116 return this.from == that.from && this.to == that.to && this.step == that.step;
117 }
118
119 /**
120 * {@inheritDoc}
121 */
122 public int hashCode() {
123 int hash = "LongRange".hashCode();
124 hash <<= 2;
125 hash ^= from;
126 hash <<= 2;
127 hash ^= to;
128 hash <<= 2;
129 hash ^= step;
130 return hash;
131 }
132
133 // private methods
134 //---------------------------------------------------------------
135 /**
136 * Get <code>value/|value|</code> (0L when value == 0L).
137 * @param value to test
138 * @return long
139 */
140 private static long signOf(long value) {
141 return value < 0L ? -1L : value > 0L ? 1L : 0L;
142 }
143
144 /**
145 * Calculate default step to get from <code>from</code> to <code>to</code>.
146 * @param from start
147 * @param to end
148 * @return long
149 */
150 private static long defaultStep(long from, long to) {
151 return from > to ? -1L : 1L;
152 }
153
154 }