Skip to content

Commit 2e0fe7c

Browse files
committed
Faster printing for Long values
1 parent 2ce770f commit 2e0fe7c

File tree

5 files changed

+45
-3
lines changed

5 files changed

+45
-3
lines changed

convex-core/src/main/java/convex/core/data/Address.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public int encodeRaw(byte[] bs, int pos) {
206206
@Override
207207
public boolean print(BlobBuilder sb, long limit) {
208208
sb.append("#");
209-
sb.append(Long.toString(value));
209+
sb.appendLongString(value);
210210
return sb.check(limit);
211211
}
212212

convex-core/src/main/java/convex/core/data/Strings.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ public class Strings {
6262

6363
public static final StringShort PRINT_EXCEEDED = StringShort.create(Constants.PRINT_EXCEEDED_STRING);
6464

65+
public static final StringShort LONG_MIN_VALUE = StringShort.create("-9223372036854775808");
66+
6567

6668
/**
6769
* Reads a String from a Blob encoding.

convex-core/src/main/java/convex/core/data/prim/CVMLong.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public static CVMLong read(byte tag, Blob blob, int offset) throws BadFormatExce
151151

152152
@Override
153153
public boolean print(BlobBuilder bb, long limit) {
154-
bb.append(toCVMString(20));
154+
bb.appendLongString(value);
155155
return bb.check(limit);
156156
}
157157

convex-core/src/main/java/convex/core/data/util/BlobBuilder.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,33 @@ public void append(String string) {
169169
append(Strings.create(string));
170170
}
171171

172+
/**
173+
* Appends a long value as a UTF-8 string
174+
* @param value
175+
*/
176+
public void appendLongString(long value) {
177+
if (value==Long.MIN_VALUE) {
178+
append(Strings.LONG_MIN_VALUE);
179+
return;
180+
}
181+
if (value<0) {
182+
append('-');
183+
value=-value;
184+
};
185+
int n=Utils.longStringSize(value);
186+
if (n==1) {
187+
append((byte)('0'+value));
188+
return;
189+
}
190+
191+
byte[] bs=new byte[n];
192+
for (int i=0; i<n; i++) {
193+
bs[n-i-1]=(byte)('0'+(value%10));
194+
value/=10;
195+
}
196+
append(bs);
197+
}
198+
172199
public BlobBuilder append(byte b) {
173200
int spare=spare();
174201
if (spare<1) throw new Panic("BlobBuilder should always have spare bytes but was: "+spare);

convex-core/src/main/java/convex/core/util/Utils.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -878,7 +878,20 @@ public static void print(StringBuilder sb,Object v) {
878878
}
879879
}
880880

881-
881+
public static int longStringSize(long x) {
882+
int d = 1;
883+
if (x >= 0) {
884+
d = 0;
885+
x = -x;
886+
}
887+
long p = -10;
888+
for (int i = 1; i < 19; i++) {
889+
if (x > p)
890+
return i + d;
891+
p = 10 * p;
892+
}
893+
return 19 + d;
894+
}
882895

883896
/**
884897
* Filters the array, returning an array containing only the elements where the

0 commit comments

Comments
 (0)