Coverage Report - org.apache.commons.collections.primitives.RandomAccessIntList
 
Classes in this File Line Coverage Branch Coverage Complexity
RandomAccessIntList
100%
53/53
100%
26/26
2.119
RandomAccessIntList$ComodChecker
100%
12/12
100%
2/2
2.119
RandomAccessIntList$RandomAccessIntListIterator
100%
52/52
100%
18/18
2.119
RandomAccessIntList$RandomAccessIntSubList
100%
47/47
100%
14/14
2.119
 
 1  
 /*
 2  
  * Licensed to the Apache Software Foundation (ASF) under one or more
 3  
  * contributor license agreements.  See the NOTICE file distributed with
 4  
  * this work for additional information regarding copyright ownership.
 5  
  * The ASF licenses this file to You under the Apache License, Version 2.0
 6  
  * (the "License"); you may not use this file except in compliance with
 7  
  * the License.  You may obtain a copy of the License at
 8  
  *
 9  
  *     http://www.apache.org/licenses/LICENSE-2.0
 10  
  *
 11  
  * Unless required by applicable law or agreed to in writing, software
 12  
  * distributed under the License is distributed on an "AS IS" BASIS,
 13  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 14  
  * See the License for the specific language governing permissions and
 15  
  * limitations under the License.
 16  
  */
 17  
 package org.apache.commons.collections.primitives;
 18  
 
 19  
 import java.util.ConcurrentModificationException;
 20  
 import java.util.NoSuchElementException;
 21  
 
 22  
 /**
 23  
  * Abstract base class for {@link IntList}s backed 
 24  
  * by random access structures like arrays.
 25  
  * <p />
 26  
  * Read-only subclasses must override {@link #get}
 27  
  * and {@link #size}.  Mutable subclasses
 28  
  * should also override {@link #set}.  Variably-sized
 29  
  * subclasses should also override {@link #add(int)} 
 30  
  * and {@link #removeElementAt}.  All other methods
 31  
  * have at least some base implementation derived from 
 32  
  * these.  Subclasses may choose to override these methods
 33  
  * to provide a more efficient implementation.
 34  
  * 
 35  
  * @since Commons Primitives 1.0
 36  
  * @version $Revision: 480460 $ $Date: 2006-11-29 03:14:21 -0500 (Wed, 29 Nov 2006) $
 37  
  * 
 38  
  * @author Rodney Waldhoff 
 39  
  */
 40  
 public abstract class RandomAccessIntList extends AbstractIntCollection implements IntList {
 41  
 
 42  
     // constructors
 43  
     //-------------------------------------------------------------------------
 44  
 
 45  
     /** Constructs an empty list. */
 46  1340
     protected RandomAccessIntList() { 
 47  1340
     }    
 48  
 
 49  
     // fully abstract methods
 50  
     //-------------------------------------------------------------------------
 51  
     
 52  
     public abstract int get(int index);
 53  
     public abstract int size();
 54  
 
 55  
     // unsupported in base
 56  
     //-------------------------------------------------------------------------
 57  
     
 58  
     /** 
 59  
      * Unsupported in this implementation. 
 60  
      * @throws UnsupportedOperationException since this method is not supported
 61  
      */
 62  
     public int removeElementAt(int index) {
 63  1
         throw new UnsupportedOperationException();
 64  
     }
 65  
     
 66  
     /** 
 67  
      * Unsupported in this implementation. 
 68  
      * @throws UnsupportedOperationException since this method is not supported
 69  
      */
 70  
     public int set(int index, int element) {
 71  2
         throw new UnsupportedOperationException();
 72  
     }
 73  
         
 74  
     /** 
 75  
      * Unsupported in this implementation. 
 76  
      * @throws UnsupportedOperationException since this method is not supported
 77  
      */
 78  
     public void add(int index, int element) {
 79  2
         throw new UnsupportedOperationException();
 80  
     }
 81  
 
 82  
     //-------------------------------------------------------------------------
 83  
 
 84  
     // javadocs here are inherited
 85  
     
 86  
     public boolean add(int element) {
 87  10583
         add(size(),element);
 88  10579
         return true;
 89  
     }
 90  
 
 91  
     public boolean addAll(int index, IntCollection collection) {
 92  4
         boolean modified = false;
 93  4
         for(IntIterator iter = collection.iterator(); iter.hasNext(); ) {
 94  52
             add(index++,iter.next());
 95  52
             modified = true;
 96  
         }
 97  4
         return modified;
 98  
     }
 99  
 
 100  
     public int indexOf(int element) {
 101  148
         int i = 0;
 102  148
         for(IntIterator iter = iterator(); iter.hasNext(); ) {
 103  1741
             if(iter.next() == element) { 
 104  74
                 return i;
 105  
             } else {
 106  1667
                 i++;
 107  
             }
 108  
         }
 109  74
         return -1;
 110  
     }
 111  
 
 112  
     public int lastIndexOf(int element) {
 113  148
         for(IntListIterator iter = listIterator(size()); iter.hasPrevious(); ) {
 114  1741
             if(iter.previous() == element) {
 115  74
                 return iter.nextIndex();
 116  
             }
 117  
         }
 118  74
         return -1;
 119  
     }
 120  
 
 121  
     public IntIterator iterator() {
 122  12257
         return listIterator();
 123  
     }
 124  
 
 125  
     public IntListIterator listIterator() {
 126  14508
         return listIterator(0);
 127  
     }
 128  
 
 129  
     public IntListIterator listIterator(int index) {
 130  14911
         return new RandomAccessIntListIterator(this,index);            
 131  
     }
 132  
 
 133  
     public IntList subList(int fromIndex, int toIndex) {
 134  337
         return new RandomAccessIntSubList(this,fromIndex,toIndex);
 135  
     }
 136  
 
 137  
     public boolean equals(Object that) {
 138  63
         if(this == that) { 
 139  6
             return true; 
 140  57
         } else if(that instanceof IntList) {
 141  51
             IntList thatList = (IntList)that;
 142  51
             if(size() != thatList.size()) {
 143  8
                 return false;
 144  
             }
 145  43
             for(IntIterator thatIter = thatList.iterator(), thisIter = iterator(); thisIter.hasNext();) {
 146  230
                 if(thisIter.next() != thatIter.next()) { 
 147  4
                     return false; 
 148  
                 }
 149  
             }
 150  39
             return true;
 151  
         } else {
 152  6
             return false;
 153  
         }        
 154  
     }
 155  
     
 156  
     public int hashCode() {
 157  2103
         int hash = 1;
 158  2103
         for(IntIterator iter = iterator(); iter.hasNext(); ) {
 159  29317
             hash = 31*hash + iter.next();
 160  
         }
 161  2103
         return hash;
 162  
     }
 163  
     
 164  
     public String toString() {
 165  10
         StringBuffer buf = new StringBuffer();
 166  10
         buf.append("[");
 167  10
         for(IntIterator iter = iterator(); iter.hasNext();) {
 168  74
             buf.append(iter.next());
 169  74
             if(iter.hasNext()) {
 170  69
                 buf.append(", ");
 171  
             }
 172  
         }
 173  10
         buf.append("]");
 174  10
         return buf.toString();
 175  
     }
 176  
     
 177  
     // protected utilities
 178  
     //-------------------------------------------------------------------------
 179  
     
 180  
     /** Get my count of structural modifications. */
 181  
     protected int getModCount() {
 182  824084
         return _modCount;
 183  
     }
 184  
 
 185  
     /** Increment my count of structural modifications. */
 186  
     protected void incrModCount() {
 187  24279
         _modCount++;
 188  24279
     }
 189  
 
 190  
     // attributes
 191  
     //-------------------------------------------------------------------------
 192  
     
 193  1340
     private int _modCount = 0;
 194  
 
 195  
     // inner classes
 196  
     //-------------------------------------------------------------------------
 197  
     
 198  
     private static class ComodChecker {
 199  15240
         ComodChecker(RandomAccessIntList source) {
 200  15240
             _source = source;  
 201  15240
             resyncModCount();             
 202  15240
         }
 203  
         
 204  
         protected RandomAccessIntList getList() {
 205  1433131
             return _source;
 206  
         }
 207  
         
 208  
         protected void assertNotComodified() throws ConcurrentModificationException {
 209  792106
             if(_expectedModCount != getList().getModCount()) {
 210  2
                 throw new ConcurrentModificationException();
 211  
             }
 212  792104
         }
 213  
             
 214  
         protected void resyncModCount() {
 215  31978
             _expectedModCount = getList().getModCount();
 216  31978
         }
 217  
         
 218  15240
         private RandomAccessIntList _source = null;
 219  15240
         private int _expectedModCount = -1;
 220  
     }
 221  
     
 222  
     protected static class RandomAccessIntListIterator extends ComodChecker implements IntListIterator {
 223  
         RandomAccessIntListIterator(RandomAccessIntList list, int index) {
 224  14911
             super(list);
 225  14911
             if(index < 0 || index > getList().size()) {
 226  16
                 throw new IndexOutOfBoundsException("Index " + index + " not in [0," + getList().size() + ")");
 227  
             } else {
 228  14895
                 _nextIndex = index;
 229  14895
                 resyncModCount();
 230  
             }
 231  14895
         }
 232  
             
 233  
         public boolean hasNext() {
 234  396989
             assertNotComodified();
 235  396989
             return _nextIndex < getList().size();
 236  
         }
 237  
         
 238  
         public boolean hasPrevious() {
 239  6625
             assertNotComodified();
 240  6625
             return _nextIndex > 0;
 241  
         }
 242  
         
 243  
         public int nextIndex() {
 244  2416
             assertNotComodified();
 245  2416
             return _nextIndex;
 246  
         }
 247  
         
 248  
         public int previousIndex() {
 249  2342
             assertNotComodified();
 250  2342
             return _nextIndex - 1;
 251  
         }
 252  
         
 253  
         public int next() {
 254  193202
             assertNotComodified();
 255  193200
             if(!hasNext()) {
 256  120
                 throw new NoSuchElementException();
 257  
             } else {
 258  193080
                 int val = getList().get(_nextIndex);
 259  193080
                 _lastReturnedIndex = _nextIndex;
 260  193080
                 _nextIndex++;
 261  193080
                 return val;
 262  
             }
 263  
         }
 264  
         
 265  
         public int previous() {
 266  3355
             assertNotComodified();
 267  3355
             if(!hasPrevious()) {
 268  175
                 throw new NoSuchElementException();
 269  
             } else {
 270  3180
                 int val = getList().get(_nextIndex-1);
 271  3180
                 _lastReturnedIndex = _nextIndex-1;
 272  3180
                 _nextIndex--;
 273  3180
                 return val;
 274  
             }
 275  
         }
 276  
         
 277  
         public void add(int value) {
 278  256
             assertNotComodified();
 279  256
             getList().add(_nextIndex,value);
 280  256
             _nextIndex++;
 281  256
             _lastReturnedIndex = -1;
 282  256
             resyncModCount();
 283  256
         }
 284  
     
 285  
         public void remove() {
 286  574
             assertNotComodified();
 287  574
             if (_lastReturnedIndex == -1) {
 288  38
                 throw new IllegalStateException();
 289  
             }
 290  536
             if (_lastReturnedIndex == _nextIndex) {
 291  
                 // remove() following previous()
 292  5
                 getList().removeElementAt(_lastReturnedIndex);
 293  
             } else {
 294  
                 // remove() following next()
 295  531
                 getList().removeElementAt(_lastReturnedIndex);
 296  531
                 _nextIndex--;
 297  
             }
 298  536
             _lastReturnedIndex = -1;
 299  536
             resyncModCount();
 300  536
         }
 301  
         
 302  
         public void set(int value) {
 303  108
             assertNotComodified();
 304  108
             if(-1 == _lastReturnedIndex) {
 305  22
                 throw new IllegalStateException();
 306  
             } else {
 307  86
                 getList().set(_lastReturnedIndex,value);
 308  86
                 resyncModCount();
 309  
             }
 310  86
         }
 311  
         
 312  14911
         private int _nextIndex = 0;
 313  14911
         private int _lastReturnedIndex = -1;        
 314  
     }   
 315  
 
 316  
     protected static class RandomAccessIntSubList extends RandomAccessIntList implements IntList {
 317  337
         RandomAccessIntSubList(RandomAccessIntList list, int fromIndex, int toIndex) {
 318  337
             if(fromIndex < 0 || toIndex > list.size()) {
 319  6
                 throw new IndexOutOfBoundsException();
 320  331
             } else if(fromIndex > toIndex) {
 321  2
                 throw new IllegalArgumentException();                
 322  
             } else {
 323  329
                 _list = list;
 324  329
                 _offset = fromIndex;
 325  329
                 _limit = toIndex - fromIndex;
 326  329
                 _comod = new ComodChecker(list);
 327  329
                 _comod.resyncModCount();
 328  
             }            
 329  329
         }
 330  
     
 331  
         public int get(int index) {
 332  47363
             checkRange(index);
 333  47345
             _comod.assertNotComodified();
 334  47345
             return _list.get(toUnderlyingIndex(index));
 335  
         }
 336  
     
 337  
         public int removeElementAt(int index) {
 338  334
             checkRange(index);
 339  316
             _comod.assertNotComodified();
 340  316
             int val = _list.removeElementAt(toUnderlyingIndex(index));
 341  316
             _limit--;
 342  316
             _comod.resyncModCount();
 343  316
             incrModCount();
 344  316
             return val;
 345  
         }
 346  
     
 347  
         public int set(int index, int element) {
 348  74
             checkRange(index);
 349  56
             _comod.assertNotComodified();
 350  56
             int val = _list.set(toUnderlyingIndex(index),element);
 351  56
             incrModCount();
 352  56
             _comod.resyncModCount();
 353  56
             return val;
 354  
         }
 355  
     
 356  
         public void add(int index, int element) {
 357  280
             checkRangeIncludingEndpoint(index);
 358  264
             _comod.assertNotComodified();
 359  264
              _list.add(toUnderlyingIndex(index),element);
 360  264
             _limit++;
 361  264
             _comod.resyncModCount();
 362  264
             incrModCount();
 363  264
         }
 364  
     
 365  
         public int size() {
 366  138258
             _comod.assertNotComodified();
 367  138258
             return _limit;
 368  
         }
 369  
     
 370  
         private void checkRange(int index) {
 371  47771
             if(index < 0 || index >= size()) {
 372  54
                 throw new IndexOutOfBoundsException("index " + index + " not in [0," + size() + ")");
 373  
             }
 374  47717
         }
 375  
           
 376  
         private void checkRangeIncludingEndpoint(int index) {
 377  280
             if(index < 0 || index > size()) {
 378  16
                 throw new IndexOutOfBoundsException("index " + index + " not in [0," + size() + "]");
 379  
             }
 380  264
         }
 381  
           
 382  
         private int toUnderlyingIndex(int index) {
 383  47981
             return (index + _offset);
 384  
         }
 385  
         
 386  337
         private int _offset = 0;        
 387  337
         private int _limit = 0; 
 388  337
         private RandomAccessIntList _list = null;
 389  337
         private ComodChecker _comod = null;
 390  
     
 391  
     }
 392  
 }
 393