X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.db.impl%2Fsrc%2Forg%2Fsimantics%2Fdb%2Fimpl%2Fgraph%2FTIntArrayListInternal.java;h=5b60ed6bb4b5c32b962019715541c5b29792ca6f;hb=d85a4d990c5cac9d0c70781a265f02888b3aaa43;hp=0fa24d4b8dd4041b083abe856e3abcba683abeb0;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git
diff --git a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/TIntArrayListInternal.java b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/TIntArrayListInternal.java
index 0fa24d4b8..5b60ed6bb 100644
--- a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/TIntArrayListInternal.java
+++ b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/TIntArrayListInternal.java
@@ -1,1078 +1,1078 @@
-///////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2001, Eric D. Friedman All Rights Reserved.
-// Copyright (c) 2009, Rob Eden All Rights Reserved.
-// Copyright (c) 2009, Jeff Randall All Rights Reserved.
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-///////////////////////////////////////////////////////////////////////////////
-
-package org.simantics.db.impl.graph;
-
-import gnu.trove.TIntCollection;
-import gnu.trove.function.TIntFunction;
-import gnu.trove.impl.Constants;
-import gnu.trove.impl.HashFunctions;
-import gnu.trove.iterator.TIntIterator;
-import gnu.trove.procedure.TIntProcedure;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.ConcurrentModificationException;
-import java.util.NoSuchElementException;
-import java.util.Random;
-
-
-//////////////////////////////////////////////////
-// THIS IS A GENERATED CLASS. DO NOT HAND EDIT! //
-//////////////////////////////////////////////////
-
-
-/**
- * A resizable, array-backed list of int primitives.
- */
-public class TIntArrayListInternal {
-
- /** the data of the list */
- protected int[] _data;
-
- /** the index after the last entry in the list */
- protected int _pos;
-
- /** the default capacity for new lists */
- protected static final int DEFAULT_CAPACITY = Constants.DEFAULT_CAPACITY;
-
- /** the int value that represents null */
- protected int no_entry_value;
-
-
- /**
- * Creates a new TIntArrayList
instance with the
- * default capacity.
- */
- @SuppressWarnings({"RedundantCast"})
- public TIntArrayListInternal() {
- this( DEFAULT_CAPACITY, ( int ) 0 );
- }
-
-
- /**
- * Creates a new TIntArrayList
instance with the
- * specified capacity.
- *
- * @param capacity an int
value
- */
- @SuppressWarnings({"RedundantCast"})
- public TIntArrayListInternal( int capacity ) {
- this( capacity, ( int ) 0 );
- }
-
-
- /**
- * Creates a new TIntArrayList
instance with the
- * specified capacity.
- *
- * @param capacity an int
value
- * @param no_entry_value an int
value that represents null.
- */
- public TIntArrayListInternal( int capacity, int no_entry_value ) {
- _data = new int[ capacity ];
- _pos = 0;
- this.no_entry_value = no_entry_value;
- }
-
- /**
- * Creates a new TIntArrayList
instance that contains
- * a copy of the collection passed to us.
- *
- * @param collection the collection to copy
- */
- public TIntArrayListInternal ( TIntCollection collection ) {
- this( collection.size() );
- addAll( collection );
- }
-
-
- /**
- * Creates a new TIntArrayList
instance whose
- * capacity is the length of values array and whose
- * initial contents are the specified values.
- *
- * A defensive copy of the given values is held by the new instance.
- *
- * @param values an int[]
value
- */
- public TIntArrayListInternal( int[] values ) {
- this( values.length );
- add( values );
- }
-
- protected TIntArrayListInternal(int[] values, int no_entry_value, boolean wrap) {
- if (!wrap)
- throw new IllegalStateException("Wrong call");
-
- if (values == null)
- throw new IllegalArgumentException("values can not be null");
-
- _data = values;
- _pos = values.length;
- this.no_entry_value = no_entry_value;
- }
-
- /**
- * Returns a primitive List implementation that wraps around the given primitive array.
- *
- * NOTE: mutating operation are allowed as long as the List does not grow. In that case
- * an IllegalStateException will be thrown
- *
- * @param values
- * @return
- */
- public static TIntArrayListInternal wrap(int[] values) {
- return wrap(values, ( int ) 0);
- }
-
- /**
- * Returns a primitive List implementation that wraps around the given primitive array.
- *
- * NOTE: mutating operation are allowed as long as the List does not grow. In that case
- * an IllegalStateException will be thrown
- *
- * @param values
- * @param no_entry_value
- * @return
- */
- public static TIntArrayListInternal wrap(int[] values, int no_entry_value) {
- return new TIntArrayListInternal(values, no_entry_value, true) {
- /**
- * Growing the wrapped external array is not allow
- */
- @Override
- public void ensureCapacity(int capacity) {
- if (capacity > _data.length)
- throw new IllegalStateException("Can not grow ArrayList wrapped external array");
- }
- };
- }
-
- /** {@inheritDoc} */
- public int getNoEntryValue() {
- return no_entry_value;
- }
-
-
- // sizing
-
- /**
- * Grow the internal array as needed to accommodate the specified number of elements.
- * The size of the array bytes on each resize unless capacity requires more than twice
- * the current capacity.
- */
- public void ensureCapacity( int capacity ) {
- if ( capacity > _data.length ) {
- int newCap = Math.max( _data.length << 1, capacity );
- int[] tmp = new int[ newCap ];
- System.arraycopy( _data, 0, tmp, 0, _data.length );
- _data = tmp;
- }
- }
-
-
- /** {@inheritDoc} */
- public int sizeInternal() {
- return _pos;
- }
-
-
- /** {@inheritDoc} */
- public boolean isEmpty() {
- return _pos == 0;
- }
-
-
- /**
- * Sheds any excess capacity above and beyond the current size of the list.
- */
- public void trimToSize() {
- if ( _data.length > sizeInternal() ) {
- int[] tmp = new int[ sizeInternal() ];
- toArray( tmp, 0, tmp.length );
- _data = tmp;
- }
- }
-
-
- // modifying
-
- /** {@inheritDoc} */
- public boolean add( int val ) {
- ensureCapacity( _pos + 1 );
- _data[ _pos++ ] = val;
- return true;
- }
-
-
- /** {@inheritDoc} */
- public void add( int[] vals ) {
- add( vals, 0, vals.length );
- }
-
-
- /** {@inheritDoc} */
- public void add( int[] vals, int offset, int length ) {
- ensureCapacity( _pos + length );
- System.arraycopy( vals, offset, _data, _pos, length );
- _pos += length;
- }
-
-
- /** {@inheritDoc} */
- public void insert( int offset, int value ) {
- if ( offset == _pos ) {
- add( value );
- return;
- }
- ensureCapacity( _pos + 1 );
- // shift right
- System.arraycopy( _data, offset, _data, offset + 1, _pos - offset );
- // insert
- _data[ offset ] = value;
- _pos++;
- }
-
-
- /** {@inheritDoc} */
- public void insert( int offset, int[] values ) {
- insert( offset, values, 0, values.length );
- }
-
-
- /** {@inheritDoc} */
- public void insert( int offset, int[] values, int valOffset, int len ) {
- if ( offset == _pos ) {
- add( values, valOffset, len );
- return;
- }
-
- ensureCapacity( _pos + len );
- // shift right
- System.arraycopy( _data, offset, _data, offset + len, _pos - offset );
- // insert
- System.arraycopy( values, valOffset, _data, offset, len );
- _pos += len;
- }
-
-
- /** {@inheritDoc} */
- public int getAt( int offset ) {
- if ( offset >= _pos ) {
- throw new ArrayIndexOutOfBoundsException( offset );
- }
- return _data[ offset ];
- }
-
-
- /**
- * Returns the value at the specified offset without doing any bounds checking.
- */
- public int getQuick( int offset ) {
- return _data[ offset ];
- }
-
-
- /** {@inheritDoc} */
- public int set( int offset, int val ) {
- if ( offset >= _pos ) {
- throw new ArrayIndexOutOfBoundsException( offset );
- }
-
- int prev_val = _data[ offset ];
- _data[ offset ] = val;
- return prev_val;
- }
-
-
- /** {@inheritDoc} */
- public int replace( int offset, int val ) {
- if ( offset >= _pos ) {
- throw new ArrayIndexOutOfBoundsException( offset );
- }
- int old = _data[ offset ];
- _data[ offset ] = val;
- return old;
- }
-
-
- /** {@inheritDoc} */
- public void set( int offset, int[] values ) {
- set( offset, values, 0, values.length );
- }
-
-
- /** {@inheritDoc} */
- public void set( int offset, int[] values, int valOffset, int length ) {
- if ( offset < 0 || offset + length > _pos ) {
- throw new ArrayIndexOutOfBoundsException( offset );
- }
- System.arraycopy( values, valOffset, _data, offset, length );
- }
-
-
- /**
- * Sets the value at the specified offset without doing any bounds checking.
- */
- public void setQuick( int offset, int val ) {
- _data[ offset ] = val;
- }
-
-
- /** {@inheritDoc} */
- public void clear() {
- clear( DEFAULT_CAPACITY );
- }
-
-
- /**
- * Flushes the internal state of the list, setting the capacity of the empty list to
- * capacity.
- */
- public void clear( int capacity ) {
- _data = new int[ capacity ];
- _pos = 0;
- }
-
-
- /**
- * Sets the size of the list to 0, but does not change its capacity. This method can
- * be used as an alternative to the {@link #clear()} method if you want to recycle a
- * list without allocating new backing arrays.
- */
- public void reset() {
- _pos = 0;
- Arrays.fill( _data, no_entry_value );
- }
-
-
- /**
- * Sets the size of the list to 0, but does not change its capacity. This method can
- * be used as an alternative to the {@link #clear()} method if you want to recycle a
- * list without allocating new backing arrays. This method differs from
- * {@link #reset()} in that it does not clear the old values in the backing array.
- * Thus, it is possible for getQuick to return stale data if this method is used and
- * the caller is careless about bounds checking.
- */
- public void resetQuick() {
- _pos = 0;
- }
-
-
- /** {@inheritDoc} */
- public boolean removeValue( int value ) {
- for ( int index = 0; index < _pos; index++ ) {
- if ( value == _data[index] ) {
- remove( index, 1 );
- return true;
- }
- }
- return false;
- }
-
-
- /** {@inheritDoc} */
- public int removeAt( int offset ) {
- int old = getAt( offset );
- remove( offset, 1 );
- return old;
- }
-
-
- /** {@inheritDoc} */
- public void remove( int offset, int length ) {
- if ( length == 0 ) return;
- if ( offset < 0 || offset >= _pos ) {
- throw new ArrayIndexOutOfBoundsException(offset);
- }
-
- if ( offset == 0 ) {
- // data at the front
- System.arraycopy( _data, length, _data, 0, _pos - length );
- }
- else if ( _pos - length == offset ) {
- // no copy to make, decrementing pos "deletes" values at
- // the end
- }
- else {
- // data in the middle
- System.arraycopy( _data, offset + length, _data, offset,
- _pos - ( offset + length ) );
- }
- _pos -= length;
- // no need to clear old values beyond _pos, because this is a
- // primitive collection and 0 takes as much room as any other
- // value
- }
-
-
- /** {@inheritDoc} */
- public TIntIterator iteratorInternal() {
- return new TIntArrayIterator( 0 );
- }
-
-
- /** {@inheritDoc} */
- public boolean containsAll( Collection> collection ) {
- for ( Object element : collection ) {
- if ( element instanceof Integer ) {
- int c = ( ( Integer ) element ).intValue();
- if ( ! contains( c ) ) {
- return false;
- }
- } else {
- return false;
- }
-
- }
- return true;
- }
-
-
- /** {@inheritDoc} */
- public boolean containsAll( TIntCollection collection ) {
- if ( this == collection ) {
- return true;
- }
- TIntIterator iter = collection.iterator();
- while ( iter.hasNext() ) {
- int element = iter.next();
- if ( ! contains( element ) ) {
- return false;
- }
- }
- return true;
- }
-
-
- /** {@inheritDoc} */
- public boolean containsAll( int[] array ) {
- for ( int i = array.length; i-- > 0; ) {
- if ( ! contains( array[i] ) ) {
- return false;
- }
- }
- return true;
- }
-
-
-// /** {@inheritDoc} */
-// public boolean addAll( Collection extends Integer> collection ) {
-// boolean changed = false;
-// for ( Integer element : collection ) {
-// int e = element.intValue();
-// if ( add( e ) ) {
-// changed = true;
-// }
-// }
-// return changed;
-// }
-
-
- /** {@inheritDoc} */
- public boolean addAll( TIntCollection collection ) {
- boolean changed = false;
- TIntIterator iter = collection.iterator();
- while ( iter.hasNext() ) {
- int element = iter.next();
- if ( add( element ) ) {
- changed = true;
- }
- }
- return changed;
- }
-
-
- /** {@inheritDoc} */
- public boolean addAll( int[] array ) {
- boolean changed = false;
- for ( int element : array ) {
- if ( add( element ) ) {
- changed = true;
- }
- }
- return changed;
- }
-
-
- /** {@inheritDoc} */
- @SuppressWarnings({"SuspiciousMethodCalls"})
- public boolean retainAll( Collection> collection ) {
- boolean modified = false;
- TIntIterator iter = iteratorInternal();
- while ( iter.hasNext() ) {
- if ( ! collection.contains( Integer.valueOf ( iter.next() ) ) ) {
- iter.remove();
- modified = true;
- }
- }
- return modified;
- }
-
-
- /** {@inheritDoc} */
- public boolean retainAll( TIntCollection collection ) {
- if ( this == collection ) {
- return false;
- }
- boolean modified = false;
- TIntIterator iter = iteratorInternal();
- while ( iter.hasNext() ) {
- if ( ! collection.contains( iter.next() ) ) {
- iter.remove();
- modified = true;
- }
- }
- return modified;
- }
-
-
- /** {@inheritDoc} */
- public boolean retainAll( int[] array ) {
- boolean changed = false;
- Arrays.sort( array );
- int[] data = _data;
-
- for ( int i = _pos; i-- > 0; ) {
- if ( Arrays.binarySearch( array, data[i] ) < 0 ) {
- remove( i, 1 );
- changed = true;
- }
- }
- return changed;
- }
-
-
- /** {@inheritDoc} */
- public boolean removeAll( Collection> collection ) {
- boolean changed = false;
- for ( Object element : collection ) {
- if ( element instanceof Integer ) {
- int c = ( ( Integer ) element ).intValue();
- if ( removeValue( c ) ) {
- changed = true;
- }
- }
- }
- return changed;
- }
-
-
- /** {@inheritDoc} */
- public boolean removeAll( TIntCollection collection ) {
- if ( collection == this ) {
- clear();
- return true;
- }
- boolean changed = false;
- TIntIterator iter = collection.iterator();
- while ( iter.hasNext() ) {
- int element = iter.next();
- if ( removeValue( element ) ) {
- changed = true;
- }
- }
- return changed;
- }
-
-
- /** {@inheritDoc} */
- public boolean removeAll( int[] array ) {
- boolean changed = false;
- for ( int i = array.length; i-- > 0; ) {
- if ( removeValue(array[i]) ) {
- changed = true;
- }
- }
- return changed;
- }
-
-
- /** {@inheritDoc} */
- public void transformValues( TIntFunction function ) {
- for ( int i = _pos; i-- > 0; ) {
- _data[ i ] = function.execute( _data[ i ] );
- }
- }
-
-
- /** {@inheritDoc} */
- public void reverse() {
- reverse( 0, _pos );
- }
-
-
- /** {@inheritDoc} */
- public void reverse( int from, int to ) {
- if ( from == to ) {
- return; // nothing to do
- }
- if ( from > to ) {
- throw new IllegalArgumentException( "from cannot be greater than to" );
- }
- for ( int i = from, j = to - 1; i < j; i++, j-- ) {
- swap( i, j );
- }
- }
-
-
- /** {@inheritDoc} */
- public void shuffle( Random rand ) {
- for ( int i = _pos; i-- > 1; ) {
- swap( i, rand.nextInt( i ) );
- }
- }
-
-
- /**
- * Swap the values at offsets i and j.
- *
- * @param i an offset into the data array
- * @param j an offset into the data array
- */
- private void swap( int i, int j ) {
- int tmp = _data[ i ];
- _data[ i ] = _data[ j ];
- _data[ j ] = tmp;
- }
-
-
- // copying
-
-// /** {@inheritDoc} */
-// public TIntList subList( int begin, int end ) {
-// if ( end < begin ) {
-// throw new IllegalArgumentException( "end index " + end +
-// " greater than begin index " + begin );
-// }
-// if ( begin < 0 ) {
-// throw new IndexOutOfBoundsException( "begin index can not be < 0" );
-// }
-// if ( end > _data.length ) {
-// throw new IndexOutOfBoundsException( "end index < " + _data.length );
-// }
-// TIntArrayListInternal list = new TIntArrayListInternal( end - begin );
-// for ( int i = begin; i < end; i++ ) {
-// list.add( _data[ i ] );
-// }
-// return list;
-// }
-
-
- /** {@inheritDoc} */
- public int[] toArrayInternal() {
- return toArray( 0, _pos );
- }
-
-
- /** {@inheritDoc} */
- public int[] toArray( int offset, int len ) {
- int[] rv = new int[ len ];
- toArray( rv, offset, len );
- return rv;
- }
-
-
- /** {@inheritDoc} */
- public int[] toArray( int[] dest ) {
- int len = dest.length;
- if ( dest.length > _pos ) {
- len = _pos;
- dest[len] = no_entry_value;
- }
- toArray( dest, 0, len );
- return dest;
- }
-
-
- /** {@inheritDoc} */
- public int[] toArray( int[] dest, int offset, int len ) {
- if ( len == 0 ) {
- return dest; // nothing to copy
- }
- if ( offset < 0 || offset >= _pos ) {
- throw new ArrayIndexOutOfBoundsException( offset );
- }
- System.arraycopy( _data, offset, dest, 0, len );
- return dest;
- }
-
-
- /** {@inheritDoc} */
- public int[] toArray( int[] dest, int source_pos, int dest_pos, int len ) {
- if ( len == 0 ) {
- return dest; // nothing to copy
- }
- if ( source_pos < 0 || source_pos >= _pos ) {
- throw new ArrayIndexOutOfBoundsException( source_pos );
- }
- System.arraycopy( _data, source_pos, dest, dest_pos, len );
- return dest;
- }
-
-
- // comparing
-
- /** {@inheritDoc} */
- @Override
- public boolean equals( Object other ) {
- if ( other == this ) {
- return true;
- }
- else if ( other instanceof TIntArrayListInternal ) {
- TIntArrayListInternal that = ( TIntArrayListInternal )other;
- if ( that.sizeInternal() != this.sizeInternal() ) return false;
- else {
- for ( int i = _pos; i-- > 0; ) {
- if ( this._data[ i ] != that._data[ i ] ) {
- return false;
- }
- }
- return true;
- }
- }
- else return false;
- }
-
-
- /** {@inheritDoc} */
- @Override
- public int hashCode() {
- int h = 0;
- for ( int i = _pos; i-- > 0; ) {
- h += HashFunctions.hash( _data[ i ] );
- }
- return h;
- }
-
-
- // procedures
-
- /** {@inheritDoc} */
- public boolean forEach( TIntProcedure procedure ) {
- for ( int i = 0; i < _pos; i++ ) {
- if ( !procedure.execute( _data[ i ] ) ) {
- return false;
- }
- }
- return true;
- }
-
-
- /** {@inheritDoc} */
- public boolean forEachDescending( TIntProcedure procedure ) {
- for ( int i = _pos; i-- > 0; ) {
- if ( !procedure.execute( _data[ i ] ) ) {
- return false;
- }
- }
- return true;
- }
-
-
- // sorting
-
- /** {@inheritDoc} */
- public void sort() {
- Arrays.sort( _data, 0, _pos );
- }
-
-
- /** {@inheritDoc} */
- public void sort( int fromIndex, int toIndex ) {
- Arrays.sort( _data, fromIndex, toIndex );
- }
-
-
- // filling
-
- /** {@inheritDoc} */
- public void fill( int val ) {
- Arrays.fill( _data, 0, _pos, val );
- }
-
-
- /** {@inheritDoc} */
- public void fill( int fromIndex, int toIndex, int val ) {
- if ( toIndex > _pos ) {
- ensureCapacity( toIndex );
- _pos = toIndex;
- }
- Arrays.fill( _data, fromIndex, toIndex, val );
- }
-
-
- // searching
-
- /** {@inheritDoc} */
- public int binarySearch( int value ) {
- return binarySearch( value, 0, _pos );
- }
-
-
- /** {@inheritDoc} */
- public int binarySearch(int value, int fromIndex, int toIndex) {
- if ( fromIndex < 0 ) {
- throw new ArrayIndexOutOfBoundsException( fromIndex );
- }
- if ( toIndex > _pos ) {
- throw new ArrayIndexOutOfBoundsException( toIndex );
- }
-
- int low = fromIndex;
- int high = toIndex - 1;
-
- while ( low <= high ) {
- int mid = ( low + high ) >>> 1;
- int midVal = _data[ mid ];
-
- if ( midVal < value ) {
- low = mid + 1;
- }
- else if ( midVal > value ) {
- high = mid - 1;
- }
- else {
- return mid; // value found
- }
- }
- return -( low + 1 ); // value not found.
- }
-
-
- /** {@inheritDoc} */
- public int indexOf( int value ) {
- return indexOf( 0, value );
- }
-
-
- /** {@inheritDoc} */
- public int indexOf( int offset, int value ) {
- for ( int i = offset; i < _pos; i++ ) {
- if ( _data[ i ] == value ) {
- return i;
- }
- }
- return -1;
- }
-
-
- /** {@inheritDoc} */
- public int lastIndexOf( int value ) {
- return lastIndexOf( _pos, value );
- }
-
-
- /** {@inheritDoc} */
- public int lastIndexOf( int offset, int value ) {
- for ( int i = offset; i-- > 0; ) {
- if ( _data[ i ] == value ) {
- return i;
- }
- }
- return -1;
- }
-
-
- /** {@inheritDoc} */
- public boolean contains( int value ) {
- return lastIndexOf( value ) >= 0;
- }
-
-
-// /** {@inheritDoc} */
-// public TIntList grep( TIntProcedure condition ) {
-// TIntArrayListInternal list = new TIntArrayListInternal();
-// for ( int i = 0; i < _pos; i++ ) {
-// if ( condition.execute( _data[ i ] ) ) {
-// list.add( _data[ i ] );
-// }
-// }
-// return list;
-// }
-
-
-// /** {@inheritDoc} */
-// public TIntList inverseGrep( TIntProcedure condition ) {
-// TIntArrayListInternal list = new TIntArrayListInternal();
-// for ( int i = 0; i < _pos; i++ ) {
-// if ( !condition.execute( _data[ i ] ) ) {
-// list.add( _data[ i ] );
-// }
-// }
-// return list;
-// }
-
-
- /** {@inheritDoc} */
- public int max() {
- if ( sizeInternal() == 0 ) {
- throw new IllegalStateException("cannot find maximum of an empty list");
- }
- int max = Integer.MIN_VALUE;
- for ( int i = 0; i < _pos; i++ ) {
- if ( _data[ i ] > max ) {
- max = _data[ i ];
- }
- }
- return max;
- }
-
-
- /** {@inheritDoc} */
- public int min() {
- if ( sizeInternal() == 0 ) {
- throw new IllegalStateException( "cannot find minimum of an empty list" );
- }
- int min = Integer.MAX_VALUE;
- for ( int i = 0; i < _pos; i++ ) {
- if ( _data[i] < min ) {
- min = _data[i];
- }
- }
- return min;
- }
-
-
- /** {@inheritDoc} */
- public int sum() {
- int sum = 0;
- for ( int i = 0; i < _pos; i++ ) {
- sum += _data[ i ];
- }
- return sum;
- }
-
-
- // stringification
-
- /** {@inheritDoc} */
- @Override
- public String toString() {
- final StringBuilder buf = new StringBuilder( "{" );
- for ( int i = 0, end = _pos - 1; i < end; i++ ) {
- buf.append( _data[ i ] );
- buf.append( ", " );
- }
- if ( sizeInternal() > 0 ) {
- buf.append( _data[ _pos - 1 ] );
- }
- buf.append( "}" );
- return buf.toString();
- }
-
-
- /** TIntArrayList iterator */
- class TIntArrayIterator implements TIntIterator {
-
- /** Index of element to be returned by subsequent call to next. */
- private int cursor = 0;
-
- /**
- * Index of element returned by most recent call to next or
- * previous. Reset to -1 if this element is deleted by a call
- * to remove.
- */
- int lastRet = -1;
-
-
- TIntArrayIterator( int index ) {
- cursor = index;
- }
-
-
- /** {@inheritDoc} */
- public boolean hasNext() {
- return cursor < sizeInternal();
- }
-
-
- /** {@inheritDoc} */
- public int next() {
- try {
- int next = getAt( cursor );
- lastRet = cursor++;
- return next;
- } catch ( IndexOutOfBoundsException e ) {
- throw new NoSuchElementException();
- }
- }
-
-
- /** {@inheritDoc} */
- public void remove() {
- if ( lastRet == -1 )
- throw new IllegalStateException();
-
- try {
- TIntArrayListInternal.this.remove( lastRet, 1);
- if ( lastRet < cursor )
- cursor--;
- lastRet = -1;
- } catch ( IndexOutOfBoundsException e ) {
- throw new ConcurrentModificationException();
- }
- }
- }
-
-
- public void writeExternal( ObjectOutput out ) throws IOException {
- // VERSION
- out.writeByte( 0 );
-
- // POSITION
- out.writeInt( _pos );
-
- // NO_ENTRY_VALUE
- out.writeInt( no_entry_value );
-
- // ENTRIES
- int len = _data.length;
- out.writeInt( len );
- for( int i = 0; i < len; i++ ) {
- out.writeInt( _data[ i ] );
- }
- }
-
-
- public void readExternal( ObjectInput in )
- throws IOException, ClassNotFoundException {
-
- // VERSION
- in.readByte();
-
- // POSITION
- _pos = in.readInt();
-
- // NO_ENTRY_VALUE
- no_entry_value = in.readInt();
-
- // ENTRIES
- int len = in.readInt();
- _data = new int[ len ];
- for( int i = 0; i < len; i++ ) {
- _data[ i ] = in.readInt();
- }
- }
-} // TIntArrayList
+///////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2001, Eric D. Friedman All Rights Reserved.
+// Copyright (c) 2009, Rob Eden All Rights Reserved.
+// Copyright (c) 2009, Jeff Randall All Rights Reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+///////////////////////////////////////////////////////////////////////////////
+
+package org.simantics.db.impl.graph;
+
+import gnu.trove.TIntCollection;
+import gnu.trove.function.TIntFunction;
+import gnu.trove.impl.Constants;
+import gnu.trove.impl.HashFunctions;
+import gnu.trove.iterator.TIntIterator;
+import gnu.trove.procedure.TIntProcedure;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.ConcurrentModificationException;
+import java.util.NoSuchElementException;
+import java.util.Random;
+
+
+//////////////////////////////////////////////////
+// THIS IS A GENERATED CLASS. DO NOT HAND EDIT! //
+//////////////////////////////////////////////////
+
+
+/**
+ * A resizable, array-backed list of int primitives.
+ */
+public class TIntArrayListInternal {
+
+ /** the data of the list */
+ protected int[] _data;
+
+ /** the index after the last entry in the list */
+ protected int _pos;
+
+ /** the default capacity for new lists */
+ protected static final int DEFAULT_CAPACITY = Constants.DEFAULT_CAPACITY;
+
+ /** the int value that represents null */
+ protected int no_entry_value;
+
+
+ /**
+ * Creates a new TIntArrayList
instance with the
+ * default capacity.
+ */
+ @SuppressWarnings({"RedundantCast"})
+ public TIntArrayListInternal() {
+ this( DEFAULT_CAPACITY, ( int ) 0 );
+ }
+
+
+ /**
+ * Creates a new TIntArrayList
instance with the
+ * specified capacity.
+ *
+ * @param capacity an int
value
+ */
+ @SuppressWarnings({"RedundantCast"})
+ public TIntArrayListInternal( int capacity ) {
+ this( capacity, ( int ) 0 );
+ }
+
+
+ /**
+ * Creates a new TIntArrayList
instance with the
+ * specified capacity.
+ *
+ * @param capacity an int
value
+ * @param no_entry_value an int
value that represents null.
+ */
+ public TIntArrayListInternal( int capacity, int no_entry_value ) {
+ _data = new int[ capacity ];
+ _pos = 0;
+ this.no_entry_value = no_entry_value;
+ }
+
+ /**
+ * Creates a new TIntArrayList
instance that contains
+ * a copy of the collection passed to us.
+ *
+ * @param collection the collection to copy
+ */
+ public TIntArrayListInternal ( TIntCollection collection ) {
+ this( collection.size() );
+ addAll( collection );
+ }
+
+
+ /**
+ * Creates a new TIntArrayList
instance whose
+ * capacity is the length of values array and whose
+ * initial contents are the specified values.
+ *
+ * A defensive copy of the given values is held by the new instance.
+ *
+ * @param values an int[]
value
+ */
+ public TIntArrayListInternal( int[] values ) {
+ this( values.length );
+ add( values );
+ }
+
+ protected TIntArrayListInternal(int[] values, int no_entry_value, boolean wrap) {
+ if (!wrap)
+ throw new IllegalStateException("Wrong call");
+
+ if (values == null)
+ throw new IllegalArgumentException("values can not be null");
+
+ _data = values;
+ _pos = values.length;
+ this.no_entry_value = no_entry_value;
+ }
+
+ /**
+ * Returns a primitive List implementation that wraps around the given primitive array.
+ *
+ * NOTE: mutating operation are allowed as long as the List does not grow. In that case
+ * an IllegalStateException will be thrown
+ *
+ * @param values
+ * @return
+ */
+ public static TIntArrayListInternal wrap(int[] values) {
+ return wrap(values, ( int ) 0);
+ }
+
+ /**
+ * Returns a primitive List implementation that wraps around the given primitive array.
+ *
+ * NOTE: mutating operation are allowed as long as the List does not grow. In that case
+ * an IllegalStateException will be thrown
+ *
+ * @param values
+ * @param no_entry_value
+ * @return
+ */
+ public static TIntArrayListInternal wrap(int[] values, int no_entry_value) {
+ return new TIntArrayListInternal(values, no_entry_value, true) {
+ /**
+ * Growing the wrapped external array is not allow
+ */
+ @Override
+ public void ensureCapacity(int capacity) {
+ if (capacity > _data.length)
+ throw new IllegalStateException("Can not grow ArrayList wrapped external array");
+ }
+ };
+ }
+
+ /** {@inheritDoc} */
+ public int getNoEntryValue() {
+ return no_entry_value;
+ }
+
+
+ // sizing
+
+ /**
+ * Grow the internal array as needed to accommodate the specified number of elements.
+ * The size of the array bytes on each resize unless capacity requires more than twice
+ * the current capacity.
+ */
+ public void ensureCapacity( int capacity ) {
+ if ( capacity > _data.length ) {
+ int newCap = Math.max( _data.length << 1, capacity );
+ int[] tmp = new int[ newCap ];
+ System.arraycopy( _data, 0, tmp, 0, _data.length );
+ _data = tmp;
+ }
+ }
+
+
+ /** {@inheritDoc} */
+ public int sizeInternal() {
+ return _pos;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean isEmpty() {
+ return _pos == 0;
+ }
+
+
+ /**
+ * Sheds any excess capacity above and beyond the current size of the list.
+ */
+ public void trimToSize() {
+ if ( _data.length > sizeInternal() ) {
+ int[] tmp = new int[ sizeInternal() ];
+ toArray( tmp, 0, tmp.length );
+ _data = tmp;
+ }
+ }
+
+
+ // modifying
+
+ /** {@inheritDoc} */
+ public boolean add( int val ) {
+ ensureCapacity( _pos + 1 );
+ _data[ _pos++ ] = val;
+ return true;
+ }
+
+
+ /** {@inheritDoc} */
+ public void add( int[] vals ) {
+ add( vals, 0, vals.length );
+ }
+
+
+ /** {@inheritDoc} */
+ public void add( int[] vals, int offset, int length ) {
+ ensureCapacity( _pos + length );
+ System.arraycopy( vals, offset, _data, _pos, length );
+ _pos += length;
+ }
+
+
+ /** {@inheritDoc} */
+ public void insert( int offset, int value ) {
+ if ( offset == _pos ) {
+ add( value );
+ return;
+ }
+ ensureCapacity( _pos + 1 );
+ // shift right
+ System.arraycopy( _data, offset, _data, offset + 1, _pos - offset );
+ // insert
+ _data[ offset ] = value;
+ _pos++;
+ }
+
+
+ /** {@inheritDoc} */
+ public void insert( int offset, int[] values ) {
+ insert( offset, values, 0, values.length );
+ }
+
+
+ /** {@inheritDoc} */
+ public void insert( int offset, int[] values, int valOffset, int len ) {
+ if ( offset == _pos ) {
+ add( values, valOffset, len );
+ return;
+ }
+
+ ensureCapacity( _pos + len );
+ // shift right
+ System.arraycopy( _data, offset, _data, offset + len, _pos - offset );
+ // insert
+ System.arraycopy( values, valOffset, _data, offset, len );
+ _pos += len;
+ }
+
+
+ /** {@inheritDoc} */
+ public int getAt( int offset ) {
+ if ( offset >= _pos ) {
+ throw new ArrayIndexOutOfBoundsException( offset );
+ }
+ return _data[ offset ];
+ }
+
+
+ /**
+ * Returns the value at the specified offset without doing any bounds checking.
+ */
+ public int getQuick( int offset ) {
+ return _data[ offset ];
+ }
+
+
+ /** {@inheritDoc} */
+ public int set( int offset, int val ) {
+ if ( offset >= _pos ) {
+ throw new ArrayIndexOutOfBoundsException( offset );
+ }
+
+ int prev_val = _data[ offset ];
+ _data[ offset ] = val;
+ return prev_val;
+ }
+
+
+ /** {@inheritDoc} */
+ public int replace( int offset, int val ) {
+ if ( offset >= _pos ) {
+ throw new ArrayIndexOutOfBoundsException( offset );
+ }
+ int old = _data[ offset ];
+ _data[ offset ] = val;
+ return old;
+ }
+
+
+ /** {@inheritDoc} */
+ public void set( int offset, int[] values ) {
+ set( offset, values, 0, values.length );
+ }
+
+
+ /** {@inheritDoc} */
+ public void set( int offset, int[] values, int valOffset, int length ) {
+ if ( offset < 0 || offset + length > _pos ) {
+ throw new ArrayIndexOutOfBoundsException( offset );
+ }
+ System.arraycopy( values, valOffset, _data, offset, length );
+ }
+
+
+ /**
+ * Sets the value at the specified offset without doing any bounds checking.
+ */
+ public void setQuick( int offset, int val ) {
+ _data[ offset ] = val;
+ }
+
+
+ /** {@inheritDoc} */
+ public void clear() {
+ clear( DEFAULT_CAPACITY );
+ }
+
+
+ /**
+ * Flushes the internal state of the list, setting the capacity of the empty list to
+ * capacity.
+ */
+ public void clear( int capacity ) {
+ _data = new int[ capacity ];
+ _pos = 0;
+ }
+
+
+ /**
+ * Sets the size of the list to 0, but does not change its capacity. This method can
+ * be used as an alternative to the {@link #clear()} method if you want to recycle a
+ * list without allocating new backing arrays.
+ */
+ public void reset() {
+ _pos = 0;
+ Arrays.fill( _data, no_entry_value );
+ }
+
+
+ /**
+ * Sets the size of the list to 0, but does not change its capacity. This method can
+ * be used as an alternative to the {@link #clear()} method if you want to recycle a
+ * list without allocating new backing arrays. This method differs from
+ * {@link #reset()} in that it does not clear the old values in the backing array.
+ * Thus, it is possible for getQuick to return stale data if this method is used and
+ * the caller is careless about bounds checking.
+ */
+ public void resetQuick() {
+ _pos = 0;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean removeValue( int value ) {
+ for ( int index = 0; index < _pos; index++ ) {
+ if ( value == _data[index] ) {
+ remove( index, 1 );
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /** {@inheritDoc} */
+ public int removeAt( int offset ) {
+ int old = getAt( offset );
+ remove( offset, 1 );
+ return old;
+ }
+
+
+ /** {@inheritDoc} */
+ public void remove( int offset, int length ) {
+ if ( length == 0 ) return;
+ if ( offset < 0 || offset >= _pos ) {
+ throw new ArrayIndexOutOfBoundsException(offset);
+ }
+
+ if ( offset == 0 ) {
+ // data at the front
+ System.arraycopy( _data, length, _data, 0, _pos - length );
+ }
+ else if ( _pos - length == offset ) {
+ // no copy to make, decrementing pos "deletes" values at
+ // the end
+ }
+ else {
+ // data in the middle
+ System.arraycopy( _data, offset + length, _data, offset,
+ _pos - ( offset + length ) );
+ }
+ _pos -= length;
+ // no need to clear old values beyond _pos, because this is a
+ // primitive collection and 0 takes as much room as any other
+ // value
+ }
+
+
+ /** {@inheritDoc} */
+ public TIntIterator iteratorInternal() {
+ return new TIntArrayIterator( 0 );
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean containsAll( Collection> collection ) {
+ for ( Object element : collection ) {
+ if ( element instanceof Integer ) {
+ int c = ( ( Integer ) element ).intValue();
+ if ( ! contains( c ) ) {
+ return false;
+ }
+ } else {
+ return false;
+ }
+
+ }
+ return true;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean containsAll( TIntCollection collection ) {
+ if ( this == collection ) {
+ return true;
+ }
+ TIntIterator iter = collection.iterator();
+ while ( iter.hasNext() ) {
+ int element = iter.next();
+ if ( ! contains( element ) ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean containsAll( int[] array ) {
+ for ( int i = array.length; i-- > 0; ) {
+ if ( ! contains( array[i] ) ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+// /** {@inheritDoc} */
+// public boolean addAll( Collection extends Integer> collection ) {
+// boolean changed = false;
+// for ( Integer element : collection ) {
+// int e = element.intValue();
+// if ( add( e ) ) {
+// changed = true;
+// }
+// }
+// return changed;
+// }
+
+
+ /** {@inheritDoc} */
+ public boolean addAll( TIntCollection collection ) {
+ boolean changed = false;
+ TIntIterator iter = collection.iterator();
+ while ( iter.hasNext() ) {
+ int element = iter.next();
+ if ( add( element ) ) {
+ changed = true;
+ }
+ }
+ return changed;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean addAll( int[] array ) {
+ boolean changed = false;
+ for ( int element : array ) {
+ if ( add( element ) ) {
+ changed = true;
+ }
+ }
+ return changed;
+ }
+
+
+ /** {@inheritDoc} */
+ @SuppressWarnings({"SuspiciousMethodCalls"})
+ public boolean retainAll( Collection> collection ) {
+ boolean modified = false;
+ TIntIterator iter = iteratorInternal();
+ while ( iter.hasNext() ) {
+ if ( ! collection.contains( Integer.valueOf ( iter.next() ) ) ) {
+ iter.remove();
+ modified = true;
+ }
+ }
+ return modified;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean retainAll( TIntCollection collection ) {
+ if ( this == collection ) {
+ return false;
+ }
+ boolean modified = false;
+ TIntIterator iter = iteratorInternal();
+ while ( iter.hasNext() ) {
+ if ( ! collection.contains( iter.next() ) ) {
+ iter.remove();
+ modified = true;
+ }
+ }
+ return modified;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean retainAll( int[] array ) {
+ boolean changed = false;
+ Arrays.sort( array );
+ int[] data = _data;
+
+ for ( int i = _pos; i-- > 0; ) {
+ if ( Arrays.binarySearch( array, data[i] ) < 0 ) {
+ remove( i, 1 );
+ changed = true;
+ }
+ }
+ return changed;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean removeAll( Collection> collection ) {
+ boolean changed = false;
+ for ( Object element : collection ) {
+ if ( element instanceof Integer ) {
+ int c = ( ( Integer ) element ).intValue();
+ if ( removeValue( c ) ) {
+ changed = true;
+ }
+ }
+ }
+ return changed;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean removeAll( TIntCollection collection ) {
+ if ( collection == this ) {
+ clear();
+ return true;
+ }
+ boolean changed = false;
+ TIntIterator iter = collection.iterator();
+ while ( iter.hasNext() ) {
+ int element = iter.next();
+ if ( removeValue( element ) ) {
+ changed = true;
+ }
+ }
+ return changed;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean removeAll( int[] array ) {
+ boolean changed = false;
+ for ( int i = array.length; i-- > 0; ) {
+ if ( removeValue(array[i]) ) {
+ changed = true;
+ }
+ }
+ return changed;
+ }
+
+
+ /** {@inheritDoc} */
+ public void transformValues( TIntFunction function ) {
+ for ( int i = _pos; i-- > 0; ) {
+ _data[ i ] = function.execute( _data[ i ] );
+ }
+ }
+
+
+ /** {@inheritDoc} */
+ public void reverse() {
+ reverse( 0, _pos );
+ }
+
+
+ /** {@inheritDoc} */
+ public void reverse( int from, int to ) {
+ if ( from == to ) {
+ return; // nothing to do
+ }
+ if ( from > to ) {
+ throw new IllegalArgumentException( "from cannot be greater than to" );
+ }
+ for ( int i = from, j = to - 1; i < j; i++, j-- ) {
+ swap( i, j );
+ }
+ }
+
+
+ /** {@inheritDoc} */
+ public void shuffle( Random rand ) {
+ for ( int i = _pos; i-- > 1; ) {
+ swap( i, rand.nextInt( i ) );
+ }
+ }
+
+
+ /**
+ * Swap the values at offsets i and j.
+ *
+ * @param i an offset into the data array
+ * @param j an offset into the data array
+ */
+ private void swap( int i, int j ) {
+ int tmp = _data[ i ];
+ _data[ i ] = _data[ j ];
+ _data[ j ] = tmp;
+ }
+
+
+ // copying
+
+// /** {@inheritDoc} */
+// public TIntList subList( int begin, int end ) {
+// if ( end < begin ) {
+// throw new IllegalArgumentException( "end index " + end +
+// " greater than begin index " + begin );
+// }
+// if ( begin < 0 ) {
+// throw new IndexOutOfBoundsException( "begin index can not be < 0" );
+// }
+// if ( end > _data.length ) {
+// throw new IndexOutOfBoundsException( "end index < " + _data.length );
+// }
+// TIntArrayListInternal list = new TIntArrayListInternal( end - begin );
+// for ( int i = begin; i < end; i++ ) {
+// list.add( _data[ i ] );
+// }
+// return list;
+// }
+
+
+ /** {@inheritDoc} */
+ public int[] toArrayInternal() {
+ return toArray( 0, _pos );
+ }
+
+
+ /** {@inheritDoc} */
+ public int[] toArray( int offset, int len ) {
+ int[] rv = new int[ len ];
+ toArray( rv, offset, len );
+ return rv;
+ }
+
+
+ /** {@inheritDoc} */
+ public int[] toArray( int[] dest ) {
+ int len = dest.length;
+ if ( dest.length > _pos ) {
+ len = _pos;
+ dest[len] = no_entry_value;
+ }
+ toArray( dest, 0, len );
+ return dest;
+ }
+
+
+ /** {@inheritDoc} */
+ public int[] toArray( int[] dest, int offset, int len ) {
+ if ( len == 0 ) {
+ return dest; // nothing to copy
+ }
+ if ( offset < 0 || offset >= _pos ) {
+ throw new ArrayIndexOutOfBoundsException( offset );
+ }
+ System.arraycopy( _data, offset, dest, 0, len );
+ return dest;
+ }
+
+
+ /** {@inheritDoc} */
+ public int[] toArray( int[] dest, int source_pos, int dest_pos, int len ) {
+ if ( len == 0 ) {
+ return dest; // nothing to copy
+ }
+ if ( source_pos < 0 || source_pos >= _pos ) {
+ throw new ArrayIndexOutOfBoundsException( source_pos );
+ }
+ System.arraycopy( _data, source_pos, dest, dest_pos, len );
+ return dest;
+ }
+
+
+ // comparing
+
+ /** {@inheritDoc} */
+ @Override
+ public boolean equals( Object other ) {
+ if ( other == this ) {
+ return true;
+ }
+ else if ( other instanceof TIntArrayListInternal ) {
+ TIntArrayListInternal that = ( TIntArrayListInternal )other;
+ if ( that.sizeInternal() != this.sizeInternal() ) return false;
+ else {
+ for ( int i = _pos; i-- > 0; ) {
+ if ( this._data[ i ] != that._data[ i ] ) {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+ else return false;
+ }
+
+
+ /** {@inheritDoc} */
+ @Override
+ public int hashCode() {
+ int h = 0;
+ for ( int i = _pos; i-- > 0; ) {
+ h += HashFunctions.hash( _data[ i ] );
+ }
+ return h;
+ }
+
+
+ // procedures
+
+ /** {@inheritDoc} */
+ public boolean forEach( TIntProcedure procedure ) {
+ for ( int i = 0; i < _pos; i++ ) {
+ if ( !procedure.execute( _data[ i ] ) ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean forEachDescending( TIntProcedure procedure ) {
+ for ( int i = _pos; i-- > 0; ) {
+ if ( !procedure.execute( _data[ i ] ) ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ // sorting
+
+ /** {@inheritDoc} */
+ public void sort() {
+ Arrays.sort( _data, 0, _pos );
+ }
+
+
+ /** {@inheritDoc} */
+ public void sort( int fromIndex, int toIndex ) {
+ Arrays.sort( _data, fromIndex, toIndex );
+ }
+
+
+ // filling
+
+ /** {@inheritDoc} */
+ public void fill( int val ) {
+ Arrays.fill( _data, 0, _pos, val );
+ }
+
+
+ /** {@inheritDoc} */
+ public void fill( int fromIndex, int toIndex, int val ) {
+ if ( toIndex > _pos ) {
+ ensureCapacity( toIndex );
+ _pos = toIndex;
+ }
+ Arrays.fill( _data, fromIndex, toIndex, val );
+ }
+
+
+ // searching
+
+ /** {@inheritDoc} */
+ public int binarySearch( int value ) {
+ return binarySearch( value, 0, _pos );
+ }
+
+
+ /** {@inheritDoc} */
+ public int binarySearch(int value, int fromIndex, int toIndex) {
+ if ( fromIndex < 0 ) {
+ throw new ArrayIndexOutOfBoundsException( fromIndex );
+ }
+ if ( toIndex > _pos ) {
+ throw new ArrayIndexOutOfBoundsException( toIndex );
+ }
+
+ int low = fromIndex;
+ int high = toIndex - 1;
+
+ while ( low <= high ) {
+ int mid = ( low + high ) >>> 1;
+ int midVal = _data[ mid ];
+
+ if ( midVal < value ) {
+ low = mid + 1;
+ }
+ else if ( midVal > value ) {
+ high = mid - 1;
+ }
+ else {
+ return mid; // value found
+ }
+ }
+ return -( low + 1 ); // value not found.
+ }
+
+
+ /** {@inheritDoc} */
+ public int indexOf( int value ) {
+ return indexOf( 0, value );
+ }
+
+
+ /** {@inheritDoc} */
+ public int indexOf( int offset, int value ) {
+ for ( int i = offset; i < _pos; i++ ) {
+ if ( _data[ i ] == value ) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+
+ /** {@inheritDoc} */
+ public int lastIndexOf( int value ) {
+ return lastIndexOf( _pos, value );
+ }
+
+
+ /** {@inheritDoc} */
+ public int lastIndexOf( int offset, int value ) {
+ for ( int i = offset; i-- > 0; ) {
+ if ( _data[ i ] == value ) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean contains( int value ) {
+ return lastIndexOf( value ) >= 0;
+ }
+
+
+// /** {@inheritDoc} */
+// public TIntList grep( TIntProcedure condition ) {
+// TIntArrayListInternal list = new TIntArrayListInternal();
+// for ( int i = 0; i < _pos; i++ ) {
+// if ( condition.execute( _data[ i ] ) ) {
+// list.add( _data[ i ] );
+// }
+// }
+// return list;
+// }
+
+
+// /** {@inheritDoc} */
+// public TIntList inverseGrep( TIntProcedure condition ) {
+// TIntArrayListInternal list = new TIntArrayListInternal();
+// for ( int i = 0; i < _pos; i++ ) {
+// if ( !condition.execute( _data[ i ] ) ) {
+// list.add( _data[ i ] );
+// }
+// }
+// return list;
+// }
+
+
+ /** {@inheritDoc} */
+ public int max() {
+ if ( sizeInternal() == 0 ) {
+ throw new IllegalStateException("cannot find maximum of an empty list");
+ }
+ int max = Integer.MIN_VALUE;
+ for ( int i = 0; i < _pos; i++ ) {
+ if ( _data[ i ] > max ) {
+ max = _data[ i ];
+ }
+ }
+ return max;
+ }
+
+
+ /** {@inheritDoc} */
+ public int min() {
+ if ( sizeInternal() == 0 ) {
+ throw new IllegalStateException( "cannot find minimum of an empty list" );
+ }
+ int min = Integer.MAX_VALUE;
+ for ( int i = 0; i < _pos; i++ ) {
+ if ( _data[i] < min ) {
+ min = _data[i];
+ }
+ }
+ return min;
+ }
+
+
+ /** {@inheritDoc} */
+ public int sum() {
+ int sum = 0;
+ for ( int i = 0; i < _pos; i++ ) {
+ sum += _data[ i ];
+ }
+ return sum;
+ }
+
+
+ // stringification
+
+ /** {@inheritDoc} */
+ @Override
+ public String toString() {
+ final StringBuilder buf = new StringBuilder( "{" );
+ for ( int i = 0, end = _pos - 1; i < end; i++ ) {
+ buf.append( _data[ i ] );
+ buf.append( ", " );
+ }
+ if ( sizeInternal() > 0 ) {
+ buf.append( _data[ _pos - 1 ] );
+ }
+ buf.append( "}" );
+ return buf.toString();
+ }
+
+
+ /** TIntArrayList iterator */
+ class TIntArrayIterator implements TIntIterator {
+
+ /** Index of element to be returned by subsequent call to next. */
+ private int cursor = 0;
+
+ /**
+ * Index of element returned by most recent call to next or
+ * previous. Reset to -1 if this element is deleted by a call
+ * to remove.
+ */
+ int lastRet = -1;
+
+
+ TIntArrayIterator( int index ) {
+ cursor = index;
+ }
+
+
+ /** {@inheritDoc} */
+ public boolean hasNext() {
+ return cursor < sizeInternal();
+ }
+
+
+ /** {@inheritDoc} */
+ public int next() {
+ try {
+ int next = getAt( cursor );
+ lastRet = cursor++;
+ return next;
+ } catch ( IndexOutOfBoundsException e ) {
+ throw new NoSuchElementException();
+ }
+ }
+
+
+ /** {@inheritDoc} */
+ public void remove() {
+ if ( lastRet == -1 )
+ throw new IllegalStateException();
+
+ try {
+ TIntArrayListInternal.this.remove( lastRet, 1);
+ if ( lastRet < cursor )
+ cursor--;
+ lastRet = -1;
+ } catch ( IndexOutOfBoundsException e ) {
+ throw new ConcurrentModificationException();
+ }
+ }
+ }
+
+
+ public void writeExternal( ObjectOutput out ) throws IOException {
+ // VERSION
+ out.writeByte( 0 );
+
+ // POSITION
+ out.writeInt( _pos );
+
+ // NO_ENTRY_VALUE
+ out.writeInt( no_entry_value );
+
+ // ENTRIES
+ int len = _data.length;
+ out.writeInt( len );
+ for( int i = 0; i < len; i++ ) {
+ out.writeInt( _data[ i ] );
+ }
+ }
+
+
+ public void readExternal( ObjectInput in )
+ throws IOException, ClassNotFoundException {
+
+ // VERSION
+ in.readByte();
+
+ // POSITION
+ _pos = in.readInt();
+
+ // NO_ENTRY_VALUE
+ no_entry_value = in.readInt();
+
+ // ENTRIES
+ int len = in.readInt();
+ _data = new int[ len ];
+ for( int i = 0; i < len; i++ ) {
+ _data[ i ] = in.readInt();
+ }
+ }
+} // TIntArrayList