CharRange should now implement Iterable. Niall
On Wed, Feb 3, 2010 at 7:31 AM, <bay...@apache.org> wrote: > Author: bayard > Date: Wed Feb 3 07:31:10 2010 > New Revision: 905919 > > URL: http://svn.apache.org/viewvc?rev=905919&view=rev > Log: > Adding Vincent Ricard's patch to CharRange.java providing an iterator that > lets you walk the chars in the range. LANG-454 > > Modified: > > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/CharRange.java > > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/CharRangeTest.java > > Modified: > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/CharRange.java > URL: > http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/CharRange.java?rev=905919&r1=905918&r2=905919&view=diff > ============================================================================== > --- > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/CharRange.java > (original) > +++ > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/CharRange.java > Wed Feb 3 07:31:10 2010 > @@ -17,6 +17,8 @@ > package org.apache.commons.lang3; > > import java.io.Serializable; > +import java.util.Iterator; > +import java.util.NoSuchElementException; > > /** > * <p>A contiguous range of characters, optionally negated.</p> > @@ -241,5 +243,96 @@ > } > return iToString; > } > - > + > + // Expansions > + //----------------------------------------------------------------------- > + /** > + * <p>Returns an iterator which can be used to walk through the > characters described by this range.</p> > + * > + * @return an iterator to the chars represented by this range > + */ > + public Iterator iterator() { > + return new CharacterIterator(this); > + } > + > + static class CharacterIterator implements Iterator { > + /** The currect character */ > + private char current; > + > + private CharRange range; > + private boolean hasNext; > + > + public CharacterIterator(CharRange r) { > + range = r; > + hasNext = true; > + > + if (range.negated) { > + if (range.start == 0) { > + if (range.end == Character.MAX_VALUE) { > + // This range is an empty set > + hasNext = false; > + } else { > + current = (char) (range.end + 1); > + } > + } else { > + current = 0; > + } > + } else { > + current = range.start; > + } > + } > + > + private void prepareNext() { > + if (range.negated) { > + if (current == Character.MAX_VALUE) { > + hasNext = false; > + } else if (current + 1 == range.start) { > + if (range.end == Character.MAX_VALUE) { > + hasNext = false; > + } else { > + current = (char) (range.end + 1); > + } > + } else { > + current = (char) (current + 1); > + } > + } else if (current < range.end) { > + current = (char) (current + 1); > + } else { > + hasNext = false; > + } > + } > + > + /** > + * Has the iterator not reached the end character yet? > + * > + * @return <code>true</code> if the iterator has yet to reach the > character date > + */ > + public boolean hasNext() { > + return hasNext; > + } > + > + /** > + * Return the next character in the iteration > + * > + * @return <code>Character</code> for the next character > + */ > + public Object next() { > + if (hasNext == false) { > + throw new NoSuchElementException(); > + } > + char cur = current; > + prepareNext(); > + return Character.valueOf(cur); > + } > + > + /** > + * Always throws UnsupportedOperationException. > + * > + * @throws UnsupportedOperationException > + * @see java.util.Iterator#remove() > + */ > + public void remove() { > + throw new UnsupportedOperationException(); > + } > + } > } > > Modified: > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/CharRangeTest.java > URL: > http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/CharRangeTest.java?rev=905919&r1=905918&r2=905919&view=diff > ============================================================================== > --- > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/CharRangeTest.java > (original) > +++ > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/CharRangeTest.java > Wed Feb 3 07:31:10 2010 > @@ -19,6 +19,8 @@ > package org.apache.commons.lang3; > > import java.lang.reflect.Modifier; > +import java.util.Iterator; > +import java.util.NoSuchElementException; > > import junit.framework.TestCase; > > @@ -301,7 +303,73 @@ > assertEquals("The Range must not be null", e.getMessage()); > } > } > - > + > + public void testIterator() { > + CharRange a = CharRange.is('a'); > + CharRange ad = CharRange.isIn('a', 'd'); > + CharRange nota = CharRange.isNot('a'); > + CharRange emptySet = CharRange.isNotIn((char) 0, > Character.MAX_VALUE); > + CharRange notFirst = CharRange.isNotIn((char) 1, > Character.MAX_VALUE); > + CharRange notLast = CharRange.isNotIn((char) 0, (char) > (Character.MAX_VALUE - 1)); > + > + Iterator aIt = a.iterator(); > + assertNotNull(aIt); > + assertTrue(aIt.hasNext()); > + assertEquals(Character.valueOf('a'), aIt.next()); > + assertFalse(aIt.hasNext()); > + > + Iterator adIt = ad.iterator(); > + assertNotNull(adIt); > + assertTrue(adIt.hasNext()); > + assertEquals(Character.valueOf('a'), adIt.next()); > + assertEquals(Character.valueOf('b'), adIt.next()); > + assertEquals(Character.valueOf('c'), adIt.next()); > + assertEquals(Character.valueOf('d'), adIt.next()); > + assertFalse(adIt.hasNext()); > + > + Iterator notaIt = nota.iterator(); > + assertNotNull(notaIt); > + assertTrue(notaIt.hasNext()); > + while (notaIt.hasNext()) { > + Character c = (Character) notaIt.next(); > + assertFalse('a' == c.charValue()); > + } > + > + Iterator emptySetIt = emptySet.iterator(); > + assertNotNull(emptySetIt); > + assertFalse(emptySetIt.hasNext()); > + try { > + emptySetIt.next(); > + fail("Should throw NoSuchElementException"); > + } catch (NoSuchElementException e) { > + assertTrue(true); > + } > + > + Iterator notFirstIt = notFirst.iterator(); > + assertNotNull(notFirstIt); > + assertTrue(notFirstIt.hasNext()); > + assertEquals(Character.valueOf((char) 0), notFirstIt.next()); > + assertFalse(notFirstIt.hasNext()); > + try { > + notFirstIt.next(); > + fail("Should throw NoSuchElementException"); > + } catch (NoSuchElementException e) { > + assertTrue(true); > + } > + > + Iterator notLastIt = notLast.iterator(); > + assertNotNull(notLastIt); > + assertTrue(notLastIt.hasNext()); > + assertEquals(Character.valueOf(Character.MAX_VALUE), > notLastIt.next()); > + assertFalse(notLastIt.hasNext()); > + try { > + notLastIt.next(); > + fail("Should throw NoSuchElementException"); > + } catch (NoSuchElementException e) { > + assertTrue(true); > + } > + } > + > //----------------------------------------------------------------------- > public void testSerialization() { > CharRange range = CharRange.is('a'); > > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org