001package net.automatalib.commons.util.collections;
002
003import java.util.AbstractList;
004import java.util.RandomAccess;
005
006import net.automatalib.commons.util.array.ArrayWritable;
007
008public class CharRange extends AbstractList<Character> implements
009                ArrayWritable<Character>, RandomAccess {
010        
011        private final IntRange delegate;
012
013        public CharRange(char low, char high) {
014                this(low, 1, high);
015        }
016        
017        public CharRange(char low, int step, char high) {
018                this(new IntRange(low, step, high));
019        }
020        
021        public CharRange(IntRange delegate) {
022                this.delegate = delegate;
023        }
024
025        public char charGet(int index) {
026                int i = delegate.intGet(index);
027                return (char)i;
028        }
029        /*
030         * (non-Javadoc)
031         * @see java.util.AbstractList#get(int)
032         */
033        @Override
034        public Character get(int index) {
035                return Character.valueOf(charGet(index));
036        }
037
038        /*
039         * (non-Javadoc)
040         * @see java.util.AbstractCollection#size()
041         */
042        @Override
043        public int size() {
044                return delegate.size();
045        }
046
047        /* (non-Javadoc)
048         * @see net.automatalib.commons.util.array.ArrayWritable#writeToArray(int, java.lang.Object[], int, int)
049         */
050        @Override
051        public void writeToArray(int offset, Object[] array, int tgtOfs, int num) {
052                int si = offset;
053                int ti = tgtOfs;
054                for(int i = 0; i < num; i++)
055                        array[ti++] = charGet(si++);
056        }
057        
058        public int indexOf(char c) {
059                return delegate.indexOf(c);
060        }
061
062        /* (non-Javadoc)
063         * @see java.util.AbstractList#indexOf(java.lang.Object)
064         */
065        @Override
066        public int indexOf(Object o) {
067                if(o == null || o.getClass() != Character.class)
068                        return -1;
069                return indexOf(((Character)o).charValue());
070        }
071
072        /* (non-Javadoc)
073         * @see java.util.AbstractList#lastIndexOf(java.lang.Object)
074         */
075        @Override
076        public int lastIndexOf(Object o) {
077                return indexOf(o);
078        }
079
080        /* (non-Javadoc)
081         * @see java.util.AbstractList#iterator()
082         */
083        @Override
084        public CharRangeIterator iterator() {
085                return new CharRangeIterator(delegate.iterator());
086        }
087
088        /* (non-Javadoc)
089         * @see java.util.AbstractList#listIterator()
090         */
091        @Override
092        public CharRangeIterator listIterator() {
093                return new CharRangeIterator(delegate.listIterator());
094        }
095
096        /* (non-Javadoc)
097         * @see java.util.AbstractList#listIterator(int)
098         */
099        @Override
100        public CharRangeIterator listIterator(int index) {
101                return new CharRangeIterator(delegate.listIterator(index));
102        }
103
104        
105        public char charValue(int i) {
106                return (char)delegate.intValue(i);
107        }
108
109}