Skip to content

Commit 503bd27

Browse files
committed
Complete implem with unsigned integers.
1 parent 3af5e1e commit 503bd27

File tree

2 files changed

+102
-48
lines changed

2 files changed

+102
-48
lines changed

src/library/scala/UInts.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,9 @@ package scala
33
class UByte(val underlying: Byte) extends AnyVal
44
class UShort(val underlying: Short) extends AnyVal
55
class UInt(val underlying: Int) extends AnyVal
6-
class ULong(val underlying: Long) extends AnyVal
6+
7+
class ULong(val underlying: Long) extends AnyVal {
8+
final def toDouble: Double =
9+
if (underlying >= 0) underlying.toDouble
10+
else 18446744073709551616.0 - underlying.toDouble // TODO Verify precision
11+
}

src/library/scala/runtime/BoxesRunTime.java

Lines changed: 96 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -199,82 +199,131 @@ public static boolean equalsNumChar(java.lang.Number xn, java.lang.Character yc)
199199
return equalsNumObject(xn, yc);
200200
}
201201

202-
public static boolean equalsUNumObject(Object x, Object y) {
202+
private static boolean equalsUNumObject(Object x, Object y) {
203203
if (x instanceof scala.UInt) {
204204
if (y instanceof scala.UInt)
205205
return ((scala.UInt)x).underlying() == ((scala.UInt)y).underlying();
206-
return slowEqualsUNumObject(x, y);
206+
return slowEqualsUNumObject(x, ((scala.UInt)x).underlying() & 0xffffffffL, y);
207207
}
208208

209209
if (x instanceof scala.ULong) {
210210
if (y instanceof scala.ULong)
211211
return ((scala.ULong)x).underlying() == ((scala.ULong)y).underlying();
212-
return slowEqualsUNumObject(x, y);
212+
return slowEqualsUNumObject(x, ((scala.ULong)x).underlying(), y);
213213
}
214214

215215
if (x instanceof scala.UByte) {
216216
if (y instanceof scala.UByte)
217217
return ((scala.UByte)x).underlying() == ((scala.UByte)y).underlying();
218-
return slowEqualsUNumObject(x, y);
218+
return slowEqualsUNumObject(x, ((scala.UByte)x).underlying() & 0xffL, y);
219219
}
220220

221-
if (x instanceof scala.UShort) {
222-
if (y instanceof scala.UShort)
223-
return ((scala.UShort)x).underlying() == ((scala.UShort)y).underlying();
224-
return slowEqualsUNumObject(x, y);
225-
}
226-
227-
if (y instanceof scala.math.ScalaNumber)
228-
return y.equals(x);
229-
230-
return x.equals(y);
221+
// assert x instanceof scala.UShort;
222+
if (y instanceof scala.UShort)
223+
return ((scala.UShort)x).underlying() == ((scala.UShort)y).underlying();
224+
return slowEqualsUNumObject(x, ((scala.UShort)x).underlying() & 0xffffL, y);
231225
}
232226

233227
private static boolean slowEqualsLongObject(Object x, long xn, Object y) {
234-
if (y instanceof java.lang.Byte)
235-
return ((java.lang.Byte)y).byteValue() == xn;
236-
if (y instanceof java.lang.Short)
237-
return ((java.lang.Short)y).shortValue() == xn;
238-
if (y instanceof java.lang.Integer)
239-
return ((java.lang.Integer)y).intValue() == xn;
240-
if (y instanceof java.lang.Long)
241-
return ((java.lang.Long)y).longValue() == xn;
242-
if (y instanceof java.lang.Float)
243-
return ((java.lang.Float)y).floatValue() == xn;
244-
if (y instanceof java.lang.Double)
245-
return ((java.lang.Double)y).doubleValue() == xn;
246-
if (y instanceof java.lang.Character)
247-
return ((long)((java.lang.Character)y).charValue()) == xn;
228+
if (y instanceof java.lang.Number) {
229+
if (y instanceof java.lang.Byte)
230+
return ((java.lang.Byte)y).byteValue() == xn;
231+
if (y instanceof java.lang.Short)
232+
return ((java.lang.Short)y).shortValue() == xn;
233+
if (y instanceof java.lang.Integer)
234+
return ((java.lang.Integer)y).intValue() == xn;
235+
if (y instanceof java.lang.Long)
236+
return ((java.lang.Long)y).longValue() == xn;
237+
if (y instanceof java.lang.Float)
238+
return ((java.lang.Float)y).floatValue() == xn;
239+
if (y instanceof java.lang.Double)
240+
return ((java.lang.Double)y).doubleValue() == xn;
241+
if (y instanceof java.lang.Character)
242+
return ((long)((java.lang.Character)y).charValue()) == xn;
248243

249-
if (y instanceof scala.math.ScalaNumber)
250-
return y.equals(x);
244+
if (y instanceof scala.math.ScalaNumber)
245+
return y.equals(x);
246+
}
247+
248+
if (y instanceof scala.UInt)
249+
return (((scala.UInt)y).underlying() & 0xffffffffL) == xn;
250+
if (y instanceof scala.ULong)
251+
return xn >= 0 && ((scala.ULong)y).underlying() == xn;
252+
if (y instanceof scala.UByte)
253+
return (((scala.UByte)y).underlying() & 0xffL) == xn;
254+
if (y instanceof scala.UShort)
255+
return (((scala.UShort)y).underlying() & 0xffffL) == xn;
251256

252257
return false;
253258
}
254259

255260
private static boolean slowEqualsDoubleObject(Object x, double xn, Object y) {
256-
if (y instanceof java.lang.Byte)
257-
return ((java.lang.Byte)y).byteValue() == xn;
258-
if (y instanceof java.lang.Short)
259-
return ((java.lang.Short)y).shortValue() == xn;
260-
if (y instanceof java.lang.Integer)
261-
return ((java.lang.Integer)y).intValue() == xn;
262-
if (y instanceof java.lang.Long)
263-
return ((java.lang.Long)y).longValue() == xn;
264-
if (y instanceof java.lang.Float)
265-
return ((java.lang.Float)y).floatValue() == xn;
266-
if (y instanceof java.lang.Double)
267-
return ((java.lang.Double)y).doubleValue() == xn;
268-
if (y instanceof java.lang.Character)
269-
return ((int)((java.lang.Character)y).charValue()) == xn;
261+
if (y instanceof java.lang.Number) {
262+
if (y instanceof java.lang.Byte)
263+
return ((java.lang.Byte)y).byteValue() == xn;
264+
if (y instanceof java.lang.Short)
265+
return ((java.lang.Short)y).shortValue() == xn;
266+
if (y instanceof java.lang.Integer)
267+
return ((java.lang.Integer)y).intValue() == xn;
268+
if (y instanceof java.lang.Long)
269+
return ((java.lang.Long)y).longValue() == xn;
270+
if (y instanceof java.lang.Float)
271+
return ((java.lang.Float)y).floatValue() == xn;
272+
if (y instanceof java.lang.Double)
273+
return ((java.lang.Double)y).doubleValue() == xn;
274+
if (y instanceof java.lang.Character)
275+
return ((int)((java.lang.Character)y).charValue()) == xn;
270276

271-
if (y instanceof scala.math.ScalaNumber)
272-
return y.equals(x);
277+
if (y instanceof scala.math.ScalaNumber)
278+
return y.equals(x);
279+
}
280+
281+
if (y instanceof scala.UInt)
282+
return (((scala.UInt)y).underlying() & 0xffffffffL) == xn;
283+
if (y instanceof scala.ULong)
284+
return ((scala.ULong)y).toDouble() == xn;
285+
if (y instanceof scala.UByte)
286+
return (((scala.UByte)y).underlying() & 0xffL) == xn;
287+
if (y instanceof scala.UShort)
288+
return (((scala.UShort)y).underlying() & 0xffffL) == xn;
273289

274290
return false;
275291
}
276292

277-
private static boolean slowEqualsUNumObject(Object x, Object y) {
293+
private static boolean slowEqualsUNumObject(Object x, long uxn, Object y) {
294+
if (y instanceof java.lang.Number) {
295+
if (y instanceof scala.math.ScalaNumber)
296+
return y.equals(x);
297+
if (uxn < 0)
298+
return false;
299+
300+
if (y instanceof java.lang.Byte)
301+
return ((java.lang.Byte)y).byteValue() == uxn;
302+
if (y instanceof java.lang.Short)
303+
return ((java.lang.Short)y).shortValue() == uxn;
304+
if (y instanceof java.lang.Integer)
305+
return ((java.lang.Integer)y).intValue() == uxn;
306+
if (y instanceof java.lang.Long)
307+
return ((java.lang.Long)y).longValue() == uxn;
308+
if (y instanceof java.lang.Float)
309+
return ((java.lang.Float)y).floatValue() == uxn;
310+
if (y instanceof java.lang.Double)
311+
return ((java.lang.Double)y).doubleValue() == uxn;
312+
if (y instanceof java.lang.Character)
313+
return ((long)((java.lang.Character)y).charValue()) == uxn;
314+
315+
return false;
316+
}
317+
318+
if (y instanceof scala.UInt)
319+
return (((scala.UInt)y).underlying() & 0xffffffffL) == uxn;
320+
if (y instanceof scala.ULong)
321+
return ((scala.ULong)y).underlying() == uxn;
322+
if (y instanceof scala.UByte)
323+
return (((scala.UByte)y).underlying() & 0xffL) == uxn;
324+
if (y instanceof scala.UShort)
325+
return (((scala.UShort)y).underlying() & 0xffffL) == uxn;
326+
278327
return false;
279328
}
280329

0 commit comments

Comments
 (0)