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 );
}

@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
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() );
}

@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 String stringValue()
Expand All @@ -159,43 +80,24 @@ public String prettyPrint()
return format( "'%s'", value() );
}

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

return start;
}

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

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

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

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

@Override
String value()
{
Expand Down
Expand Up @@ -44,4 +44,108 @@ public int 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
{
//0111 1111, used for removing HIGH BIT from byte
private static final int HIGH_BIT_MASK = 127;
//0100 000, used for detecting non-continuation bytes, e.g. 10xx xxxx
private static final int NON_CONTINUATION_BIT_MASK = 64;
/** Used for removing the high order bit from byte. */
private static final int HIGH_BIT_MASK = 0b0111_1111;
/** Used for detecting non-continuation bytes. For example {@code 0b10xx_xxxx}. */
private static final int NON_CONTINUATION_BIT_MASK = 0b0100_0000;

private volatile String value;
private final byte[] bytes;
Expand All @@ -56,7 +56,7 @@ public <E extends Exception> void writeTo( ValueWriter<E> writer ) throws E
@Override
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 );
}
Expand All @@ -77,8 +77,7 @@ String value()
s = value;
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 endIndex = trimRightIndex();
if (startIndex > endIndex)
{
return StringValue.EMTPY;
}

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

Expand Down

0 comments on commit 34ce6b4

Please sign in to comment.