Skip to content

Commit

Permalink
Removed default implementations from StringValue
Browse files Browse the repository at this point in the history
  • Loading branch information
pontusmelke committed Nov 2, 2017
1 parent 4c2ce75 commit 34ce6b4
Show file tree
Hide file tree
Showing 5 changed files with 218 additions and 133 deletions.
Expand Up @@ -49,63 +49,6 @@ public boolean equals( String x )
return value().equals( x ); return value().equals( x );
} }


@Override
public int computeHash()
{
//NOTE that we are basing the hash code on code points instead of char[] values.
String value = value();
if ( value.isEmpty() )
{
return 0;
}
int h = 1;
final int length = value.length();
for ( int offset = 0; offset < length; )
{
final int codePoint = value.codePointAt( offset );
h = 31 * h + codePoint;
offset += Character.charCount( codePoint );
}
return h;
}

@Override
public TextValue substring( int start, int end )
{
int s = Math.min( start, length() );
int e = Math.min( end, length() );
String value = value();
int codePointStart = value.offsetByCodePoints( 0, s );
int codePointEnd = value.offsetByCodePoints( 0, e );

return Values.stringValue( value.substring( codePointStart, codePointEnd ) );
}

@Override
public TextValue trim()
{
String value = value();
int start = ltrimIndex( value );
int end = rtrimIndex( value );
return Values.stringValue( value.substring( start, Math.max( end, start ) ) );
}

@Override
public TextValue ltrim()
{
String value = value();
int start = ltrimIndex( value );
return Values.stringValue( value.substring( start, value.length() ) );
}

@Override
public TextValue rtrim()
{
String value = value();
int end = rtrimIndex( value );
return Values.stringValue( value.substring( 0, end ) );
}

@Override @Override
public <E extends Exception> void writeTo( ValueWriter<E> writer ) throws E public <E extends Exception> void writeTo( ValueWriter<E> writer ) throws E
{ {
Expand All @@ -124,28 +67,6 @@ public String toString()
return format( "String(\"%s\")", value() ); return format( "String(\"%s\")", value() );
} }


@Override
public int compareTo( TextValue other )
{
String thisString = value();
String thatString = other.stringValue();
int len1 = thisString.length();
int len2 = thatString.length();
int lim = Math.min( len1, len2 );

int k = 0;
while ( k < lim )
{
int c1 = thisString.codePointAt( k );
int c2 = thatString.codePointAt( k );
if ( c1 != c2 )
{
return c1 - c2;
}
k += Character.charCount( c1 );
}
return length() - other.length();
}


@Override @Override
public String stringValue() public String stringValue()
Expand All @@ -159,43 +80,24 @@ public String prettyPrint()
return format( "'%s'", value() ); return format( "'%s'", value() );
} }


private int ltrimIndex( String value ) static TextValue EMTPY = new StringValue()
{ {
int start = 0, length = value.length(); @Override
while ( start < length ) protected int computeHash()
{ {
int codePoint = value.codePointAt( start ); return 0;
if ( !Character.isWhitespace( codePoint ) )
{
break;
}
start += Character.charCount( codePoint );
} }


return start; @Override
} public int length()

private int rtrimIndex( String value )
{
int end = value.length();
while ( end > 0 )
{ {
int codePoint = value.codePointBefore( end ); return 0;
if ( !Character.isWhitespace( codePoint ) )
{
break;
}
end--;
} }
return end;
}


static TextValue EMTPY = new StringValue()
{
@Override @Override
public int length() public TextValue substring( int start, int end )
{ {
return 0; return this;
} }


@Override @Override
Expand All @@ -216,6 +118,12 @@ public TextValue rtrim()
return this; return this;
} }


@Override
public int compareTo( TextValue other )
{
return Integer.compare( 0, other.length() );
}

@Override @Override
String value() String value()
{ {
Expand Down
Expand Up @@ -44,4 +44,108 @@ public int length()
{ {
return value.codePointCount( 0, value.length() ); return value.codePointCount( 0, value.length() );
} }

@Override
public int computeHash()
{
//NOTE that we are basing the hash code on code points instead of char[] values.
if ( value.isEmpty() )
{
return 0;
}
int h = 1, length = value.length();
for ( int offset = 0, codePoint; offset < length; offset += Character.charCount( codePoint ) )
{
codePoint = value.codePointAt( offset );
h = 31 * h + codePoint;
}
return h;
}

@Override
public int compareTo( TextValue other )
{
String thisString = value;
String thatString = other.stringValue();
int len1 = thisString.length();
int len2 = thatString.length();
int lim = Math.min( len1, len2 );

int k = 0;
while ( k < lim )
{
int c1 = thisString.codePointAt( k );
int c2 = thatString.codePointAt( k );
if ( c1 != c2 )
{
return c1 - c2;
}
k += Character.charCount( c1 );
}
return length() - other.length();
}

@Override
public TextValue substring( int start, int end )
{
int s = Math.min( start, length() );
int e = Math.min( end, length() );
int codePointStart = value.offsetByCodePoints( 0, s );
int codePointEnd = value.offsetByCodePoints( 0, e );

return Values.stringValue( value.substring( codePointStart, codePointEnd ) );
}

@Override
public TextValue trim()
{
int start = ltrimIndex( value );
int end = rtrimIndex( value );
return Values.stringValue( value.substring( start, Math.max( end, start ) ) );
}

@Override
public TextValue ltrim()
{
int start = ltrimIndex( value );
return Values.stringValue( value.substring( start, value.length() ) );
}

@Override
public TextValue rtrim()
{
int end = rtrimIndex( value );
return Values.stringValue( value.substring( 0, end ) );
}

private int ltrimIndex( String value )
{
int start = 0, length = value.length();
while ( start < length )
{
int codePoint = value.codePointAt( start );
if ( !Character.isWhitespace( codePoint ) )
{
break;
}
start += Character.charCount( codePoint );
}

return start;
}

private int rtrimIndex( String value )
{
int end = value.length();
while ( end > 0 )
{
int codePoint = value.codePointBefore( end );
if ( !Character.isWhitespace( codePoint ) )
{
break;
}
end--;
}
return end;
}
} }
Expand Up @@ -29,10 +29,10 @@
*/ */
public final class UTF8StringValue extends StringValue public final class UTF8StringValue extends StringValue
{ {
//0111 1111, used for removing HIGH BIT from byte /** Used for removing the high order bit from byte. */
private static final int HIGH_BIT_MASK = 127; private static final int HIGH_BIT_MASK = 0b0111_1111;
//0100 000, used for detecting non-continuation bytes, e.g. 10xx xxxx /** Used for detecting non-continuation bytes. For example {@code 0b10xx_xxxx}. */
private static final int NON_CONTINUATION_BIT_MASK = 64; private static final int NON_CONTINUATION_BIT_MASK = 0b0100_0000;


private volatile String value; private volatile String value;
private final byte[] bytes; private final byte[] bytes;
Expand All @@ -56,7 +56,7 @@ public <E extends Exception> void writeTo( ValueWriter<E> writer ) throws E
@Override @Override
public boolean equals( Value value ) public boolean equals( Value value )
{ {
if ( value instanceof org.neo4j.values.storable.UTF8StringValue ) if ( value instanceof UTF8StringValue )
{ {
return Arrays.equals( bytes, ((org.neo4j.values.storable.UTF8StringValue) value).bytes ); return Arrays.equals( bytes, ((org.neo4j.values.storable.UTF8StringValue) value).bytes );
} }
Expand All @@ -77,8 +77,7 @@ String value()
s = value; s = value;
if ( s == null ) if ( s == null )
{ {
s = value = new String( bytes, offset, length, StandardCharsets.UTF_8 ); value = s = new String( bytes, offset, length, StandardCharsets.UTF_8 );

} }
} }
} }
Expand Down Expand Up @@ -212,15 +211,54 @@ public TextValue trim()


int startIndex = trimLeftIndex(); int startIndex = trimLeftIndex();
int endIndex = trimRightIndex(); int endIndex = trimRightIndex();
if (startIndex > endIndex)
{
return StringValue.EMTPY;
}

return new UTF8StringValue( values, startIndex, Math.max( endIndex + 1 - startIndex, 0 ) ); return new UTF8StringValue( values, startIndex, Math.max( endIndex + 1 - startIndex, 0 ) );
} }


@Override
public TextValue ltrim()
{
byte[] values = bytes;
if ( values.length == 0 || length == 0 )
{
return this;
}

int startIndex = trimLeftIndex();
if (startIndex >= values.length)
{
return StringValue.EMTPY;
}
return new UTF8StringValue( values, startIndex, values.length - startIndex );
}

@Override
public TextValue rtrim()
{
byte[] values = bytes;
if ( values.length == 0 || length == 0 )
{
return this;
}

int endIndex = trimRightIndex();
if (endIndex < 0)
{
return StringValue.EMTPY;
}
return new UTF8StringValue( values, offset, endIndex + 1 - offset);
}

@Override @Override
public int compareTo( TextValue other ) public int compareTo( TextValue other )
{ {
if ( !(other instanceof UTF8StringValue) ) if ( !(other instanceof UTF8StringValue) )
{ {
return super.compareTo( other ); return -other.compareTo( this );
} }
UTF8StringValue otherUTF8 = (UTF8StringValue) other; UTF8StringValue otherUTF8 = (UTF8StringValue) other;
int len1 = bytes.length; int len1 = bytes.length;
Expand Down Expand Up @@ -365,7 +403,7 @@ private int trimRightIndex()
int codePoint = codePoint( (byte) (b << bytesNeeded), index, bytesNeeded ); int codePoint = codePoint( (byte) (b << bytesNeeded), index, bytesNeeded );
if ( !Character.isWhitespace( codePoint ) ) if ( !Character.isWhitespace( codePoint ) )
{ {
return Math.min( index + bytesNeeded - 1, length - 1 ); return Math.min( index + bytesNeeded - 1, bytes.length - 1 );
} }
index--; index--;


Expand Down

0 comments on commit 34ce6b4

Please sign in to comment.