001 /* 002 * $Id: LongIterable.java 3300 2010-08-29 19:48:28Z kredel $ 003 */ 004 005 package edu.jas.util; 006 007 008 import java.util.Iterator; 009 import java.util.NoSuchElementException; 010 011 012 /** 013 * Iterable for Long. 014 * @author Heinz Kredel 015 */ 016 public class LongIterable implements Iterable<Long> { 017 018 019 private boolean nonNegative = true; 020 021 022 private long upperBound = Long.MAX_VALUE; 023 024 025 /** 026 * Constructor. 027 */ 028 public LongIterable() { 029 } 030 031 032 /** 033 * Constructor. 034 */ 035 public LongIterable(long ub) { 036 upperBound = ub; 037 } 038 039 040 /** Set the upper bound for the iterator. 041 * @param ub an upper bound for the iterator elements. 042 */ 043 public void setUpperBound(long ub) { 044 upperBound = ub; 045 } 046 047 048 /** Get the upper bound for the iterator. 049 * @return the upper bound for the iterator elements. 050 */ 051 public long getUpperBound() { 052 return upperBound; 053 } 054 055 056 /** Set the iteration algorithm to all elements. 057 */ 058 public void setAllIterator() { 059 nonNegative = false; 060 } 061 062 063 /** Set the iteration algorithm to non-negative elements. 064 */ 065 public void setNonNegativeIterator() { 066 nonNegative = true; 067 } 068 069 070 /** 071 * Get an iterator over Long. 072 * @return an iterator. 073 */ 074 public Iterator<Long> iterator() { 075 return new LongIterator(nonNegative,upperBound); 076 } 077 078 } 079 080 081 /** 082 * Long iterator. 083 * @author Heinz Kredel 084 */ 085 class LongIterator implements Iterator<Long> { 086 087 088 /** 089 * data structure. 090 */ 091 long current; 092 093 094 boolean empty; 095 096 097 final boolean nonNegative; 098 099 100 protected long upperBound; 101 102 103 /** Set the upper bound for the iterator. 104 * @param ub an upper bound for the iterator elements. 105 */ 106 public void setUpperBound(long ub) { 107 upperBound = ub; 108 } 109 110 111 /** Get the upper bound for the iterator. 112 * @return the upper bound for the iterator elements. 113 */ 114 public long getUpperBound() { 115 return upperBound; 116 } 117 118 119 /** 120 * Long iterator constructor. 121 */ 122 public LongIterator() { 123 this(false,Long.MAX_VALUE); 124 } 125 126 127 /** 128 * Long iterator constructor. 129 * @param nn true for an iterator over non-negative longs, false for all elements iterator. 130 * @param ub an upper bound for the entrys. 131 */ 132 public LongIterator(boolean nn, long ub) { 133 current = 0L; 134 //System.out.println("current = " + current); 135 empty = false; 136 nonNegative = nn; 137 upperBound = ub; 138 //System.out.println("upperBound = " + upperBound); 139 } 140 141 142 /** 143 * Test for availability of a next long. 144 * @return true if the iteration has more Longs, else false. 145 */ 146 public synchronized boolean hasNext() { 147 return !empty; 148 } 149 150 151 /** 152 * Get next Long. 153 * @return next Long. 154 */ 155 public synchronized Long next() { 156 if (empty) { 157 throw new NoSuchElementException("invalid call of next()"); 158 } 159 Long res = new Long(current); 160 if ( nonNegative ) { 161 current++; 162 } else if ( current > 0L ) { 163 current = -current; 164 } else { 165 current = -current; 166 current++; 167 } 168 if ( current > upperBound ) { 169 empty = true; 170 } 171 return res; 172 } 173 174 175 /** 176 * Remove a tuple if allowed. 177 */ 178 public void remove() { 179 throw new UnsupportedOperationException("cannnot remove elements"); 180 } 181 182 }