View Javadoc

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 }