You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Niall Pemberton <ni...@gmail.com> on 2010/02/03 11:32:40 UTC
Re: svn commit: r905919 - in /commons/proper/lang/trunk/src:
main/java/org/apache/commons/lang3/CharRange.java test/java/org/apache/commons/lang3/CharRangeTest.java
CharRange should now implement Iterable.
Niall
On Wed, Feb 3, 2010 at 7:31 AM, <ba...@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-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org