001/* Copyright (C) 2013 TU Dortmund
002 * This file is part of AutomataLib, http://www.automatalib.net/.
003 * 
004 * AutomataLib is free software; you can redistribute it and/or
005 * modify it under the terms of the GNU Lesser General Public
006 * License version 3.0 as published by the Free Software Foundation.
007 * 
008 * AutomataLib is distributed in the hope that it will be useful,
009 * but WITHOUT ANY WARRANTY; without even the implied warranty of
010 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
011 * Lesser General Public License for more details.
012 * 
013 * You should have received a copy of the GNU Lesser General Public
014 * License along with AutomataLib; if not, see
015 * http://www.gnu.de/documents/lgpl.en.html.
016 */
017package net.automatalib.commons.util.collections;
018
019import java.util.AbstractList;
020import java.util.RandomAccess;
021
022import net.automatalib.commons.util.array.ArrayWritable;
023
024public class CharRange extends AbstractList<Character> implements
025                ArrayWritable<Character>, RandomAccess {
026        
027        private final IntRange delegate;
028
029        public CharRange(char low, char high) {
030                this(low, high, 1);
031        }
032        
033        public CharRange(char low, char high, int step) {
034                this(new IntRange(low, high, step));
035        }
036        
037        public CharRange(IntRange delegate) {
038                this.delegate = delegate;
039        }
040
041        public char charGet(int index) {
042                int i = delegate.intGet(index);
043                return (char)i;
044        }
045        /*
046         * (non-Javadoc)
047         * @see java.util.AbstractList#get(int)
048         */
049        @Override
050        public Character get(int index) {
051                return Character.valueOf(charGet(index));
052        }
053
054        /*
055         * (non-Javadoc)
056         * @see java.util.AbstractCollection#size()
057         */
058        @Override
059        public int size() {
060                return delegate.size();
061        }
062
063        /* (non-Javadoc)
064         * @see net.automatalib.commons.util.array.ArrayWritable#writeToArray(int, java.lang.Object[], int, int)
065         */
066        @Override
067        public void writeToArray(int offset, Object[] array, int tgtOfs, int num) {
068                int si = offset;
069                int ti = tgtOfs;
070                for(int i = 0; i < num; i++)
071                        array[ti++] = charGet(si++);
072        }
073        
074        public int indexOf(char c) {
075                return delegate.indexOf(c);
076        }
077
078        /* (non-Javadoc)
079         * @see java.util.AbstractList#indexOf(java.lang.Object)
080         */
081        @Override
082        public int indexOf(Object o) {
083                if(o == null || o.getClass() != Character.class)
084                        return -1;
085                return indexOf(((Character)o).charValue());
086        }
087
088        /* (non-Javadoc)
089         * @see java.util.AbstractList#lastIndexOf(java.lang.Object)
090         */
091        @Override
092        public int lastIndexOf(Object o) {
093                return indexOf(o);
094        }
095
096        /* (non-Javadoc)
097         * @see java.util.AbstractList#iterator()
098         */
099        @Override
100        public CharRangeIterator iterator() {
101                return new CharRangeIterator(delegate.iterator());
102        }
103
104        /* (non-Javadoc)
105         * @see java.util.AbstractList#listIterator()
106         */
107        @Override
108        public CharRangeIterator listIterator() {
109                return new CharRangeIterator(delegate.listIterator());
110        }
111
112        /* (non-Javadoc)
113         * @see java.util.AbstractList#listIterator(int)
114         */
115        @Override
116        public CharRangeIterator listIterator(int index) {
117                return new CharRangeIterator(delegate.listIterator(index));
118        }
119
120        
121        public char charValue(int i) {
122                return (char)delegate.intValue(i);
123        }
124
125}