@Override public AnyValue value( int offset ) { return inner.value( offset + from ); }
public AnyValue last() { int size = size(); if ( size == 0 ) { throw new NoSuchElementException( "last of empty list" ); } return value( size - 1 ); }
private AnyValue[] randomAccessAsArray() { int size = size(); AnyValue[] values = new AnyValue[size]; for ( int i = 0; i < values.length; i++ ) { values[i] = value( i ); } return values; }
@Override public AnyValue value( int offset ) { return inner.value( size() - 1 - offset ); } }
public AnyValue head() { int size = size(); if ( size == 0 ) { throw new NoSuchElementException( "head of empty list" ); } return value( 0 ); }
@Override public AnyValue next() { if ( !hasNext() ) { throw new NoSuchElementException(); } return value( count++ ); } };
@Override public int size() { if ( size < 0 ) { int s = 0; for ( int i = 0; i < inner.size(); i++ ) { if ( inner.value( i ) != NO_VALUE ) { s++; } } size = s; } return size; }
@Override public AnyValue value( int offset ) { for ( ListValue list : lists ) { int size = list.size(); if ( offset < size ) { return list.value( offset ); } offset -= size; } throw new IndexOutOfBoundsException(); } }
@Override public AnyValue value( int offset ) { int size = base.size(); if ( offset < size ) { return base.value( offset ); } else if ( offset < size + appended.length ) { return appended[offset - size]; } else { throw new IndexOutOfBoundsException( offset + " is outside range " + size ); } }
@Override public AnyValue value( int offset ) { int actualOffset = 0; int size = inner.size(); for ( int i = 0; i < size; i++ ) { AnyValue value = inner.value( i ); if ( value != NO_VALUE ) { if ( actualOffset == offset ) { return value; } actualOffset++; } } throw new IndexOutOfBoundsException(); }
@Override public AnyValue value( int offset ) { int size = base.size(); if ( offset < prepended.length ) { return prepended[offset]; } else if ( offset < size + prepended.length ) { return base.value( offset - prepended.length ); } else { throw new IndexOutOfBoundsException( offset + " is outside range " + size ); } }
private int randomAccessCompareTo( Comparator<AnyValue> comparator, ListValue otherList ) { int x = Integer.compare( this.length(), otherList.length() ); if ( x == 0 ) { for ( int i = 0; i < length(); i++ ) { x = comparator.compare( this.value( i ), otherList.value( i ) ); if ( x != 0 ) { return x; } } } return x; }
private int randomAccessComputeHash() { int hashCode = 1; int size = size(); for ( int i = 0; i < size; i++ ) { hashCode = 31 * hashCode + value( i ).hashCode(); } return hashCode; }
private void computeNext() { if ( index >= inner.size() ) { next = null; } else { while ( true ) { if ( index >= inner.size() ) { next = null; return; } AnyValue candidate = inner.value( index++ ); if ( candidate != NO_VALUE ) { next = candidate; return; } } } } }
@Test void shouldHandleCollection() { // Given Collection<Integer> collection = Arrays.asList( 1, 2, 3 ); // When AnyValue of = ValueUtils.of( collection ); // Then assertThat( of, instanceOf( ListValue.class ) ); ListValue listValue = (ListValue) of; assertThat( listValue.value( 0 ), equalTo( intValue( 1 ) ) ); assertThat( listValue.value( 1 ), equalTo( intValue( 2 ) ) ); assertThat( listValue.value( 2 ), equalTo( intValue( 3 ) ) ); assertThat( listValue.size(), equalTo( 3 ) ); }
@Test void shouldHandleIterator() { // Given Iterator<Integer> iterator = Arrays.asList( 1, 2, 3 ).iterator(); // When AnyValue of = ValueUtils.of( iterator ); // Then assertThat( of, instanceOf( ListValue.class ) ); ListValue listValue = (ListValue) of; assertThat( listValue.value( 0 ), equalTo( intValue( 1 ) ) ); assertThat( listValue.value( 1 ), equalTo( intValue( 2 ) ) ); assertThat( listValue.value( 2 ), equalTo( intValue( 3 ) ) ); assertThat( listValue.size(), equalTo( 3 ) ); }
@Test void shouldHandleIterable() { // Given Iterable<Integer> collection = Arrays.asList( 1, 2, 3 ); // When AnyValue of = ValueUtils.of( collection ); // Then assertThat( of, instanceOf( ListValue.class ) ); ListValue listValue = (ListValue) of; assertThat( listValue.value( 0 ), equalTo( intValue( 1 ) ) ); assertThat( listValue.value( 1 ), equalTo( intValue( 2 ) ) ); assertThat( listValue.value( 2 ), equalTo( intValue( 3 ) ) ); assertThat( listValue.size(), equalTo( 3 ) ); } }
private <E extends Exception> void randomAccessWriteTo( AnyValueWriter<E> writer ) throws E { writer.beginList( size() ); for ( int i = 0; i < size(); i++ ) { value( i ).writeTo( writer ); } writer.endList(); }
private int randomAccessComputeHash() { int hashCode = 1; int size = size(); for ( int i = 0; i < size; i++ ) { hashCode = 31 * hashCode + value( i ).hashCode(); } return hashCode; }