001/* 002 * Copyright 2001-2010 Stephen Colebourne 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.joda.primitives.listiterator.impl; 017 018import java.util.NoSuchElementException; 019 020import org.joda.primitives.CharUtils; 021import org.joda.primitives.listiterator.CharListIterator; 022 023/** 024 * An iterator over an array of <code>char</code> values. 025 * <p> 026 * This class implements {@link java.util.ListIterator ListIterator} allowing 027 * seamless integration with other APIs. 028 * <p> 029 * The iterator can be reset to the start if required. 030 * <code>add()</code> and <code>remove()</code> are unsupported, but 031 * <code>set()</code> is supported. 032 * 033 * @author Stephen Colebourne 034 * @author Jason Tiscione 035 * @version CODE GENERATED 036 * @since 1.0 037 */ 038public class ArrayCharListIterator implements CharListIterator { 039 // This file is CODE GENERATED. Do not change manually. 040 041 /** The array to iterate over */ 042 protected final char[] array; 043 /** Cursor position */ 044 protected int cursor = 0; 045 /** Last returned position */ 046 protected int last = -1; 047 048 /** 049 * Creates an iterator over a copy of an array of <code>char</code> values. 050 * <p> 051 * The specified array is copied, ensuring the original data is unaltered. 052 * Note that the class is not immutable due to the {@code set} methods. 053 * 054 * @param array the array to iterate over, must not be null 055 * @throws IllegalArgumentException if the array is null 056 */ 057 public static ArrayCharListIterator copyOf(char[] array) { 058 if (array == null) { 059 throw new IllegalArgumentException("Array must not be null"); 060 } 061 return new ArrayCharListIterator(array.clone()); 062 } 063 064 /** 065 * Constructs an iterator over an array of <code>char</code> values. 066 * <p> 067 * The array is assigned internally, thus the caller holds a reference to 068 * the internal state of the returned iterator. It is not recommended to 069 * modify the state of the array after construction. 070 * 071 * @param array the array to iterate over, must not be null 072 * @throws IllegalArgumentException if the array is null 073 */ 074 public ArrayCharListIterator(char[] array) { 075 super(); 076 if (array == null) { 077 throw new IllegalArgumentException("Array must not be null"); 078 } 079 this.array = array; 080 } 081 082 //----------------------------------------------------------------------- 083 public boolean isModifiable() { 084 return true; 085 } 086 087 public boolean isResettable() { 088 return true; 089 } 090 091 //----------------------------------------------------------------------- 092 public boolean hasNext() { 093 return (cursor < array.length); 094 } 095 096 public int nextIndex() { 097 return cursor; 098 } 099 100 public char nextChar() { 101 if (hasNext() == false) { 102 throw new NoSuchElementException("No more elements available"); 103 } 104 last = cursor; 105 return array[cursor++]; 106 } 107 108 public Character next() { 109 return CharUtils.toObject(nextChar()); 110 } 111 112 public boolean hasPrevious() { 113 return (cursor > 0); 114 } 115 116 public int previousIndex() { 117 return cursor - 1; 118 } 119 120 public char previousChar() { 121 if (hasPrevious() == false) { 122 throw new NoSuchElementException("No more elements available"); 123 } 124 last = --cursor; 125 return array[cursor]; 126 } 127 128 public Character previous() { 129 return CharUtils.toObject(previousChar()); 130 } 131 132 public void add(char value) { 133 throw new UnsupportedOperationException("ArrayCharListIterator does not support add"); 134 } 135 136 public void add(Character value) { 137 throw new UnsupportedOperationException("ArrayCharListIterator does not support add"); 138 } 139 140 public void remove() { 141 throw new UnsupportedOperationException("ArrayCharListIterator does not support remove"); 142 } 143 144 public void set(char value) { 145 if (last < 0) { 146 throw new IllegalStateException("ArrayCharListIterator cannot be set until next is called"); 147 } 148 array[last] = value; 149 } 150 151 public void set(Character value) { 152 set(CharUtils.toPrimitive(value)); 153 } 154 155 public void reset() { 156 cursor = 0; 157 last = -1; 158 } 159 160}