public static ERational RandomERational(RandomGenerator rand) { EInteger bigintA = RandomEInteger(rand); EInteger bigintB = RandomEInteger(rand); if (bigintB.isZero()) { bigintB = EInteger.FromInt32(1); } return ERational.Create(bigintA, bigintB); }
/** wait for howlong, for one more message to be available */ public static boolean wait_timeout(EProc proc, EObject howlong) throws Pausable { try { proc.check_exit(); if (ipclog.isLoggable(Level.FINE)) ipclog.fine("WAIT| " + proc + " waits for messages for " + howlong + " ms"); if (howlong == am_infinity) { proc.mbox.untilHasMessages(proc.midx + 1); proc.check_exit(); if (ipclog.isLoggable(Level.FINE)) ipclog.fine("WAIT| " + proc + " wakes up on message"); return true; } else { long now = System.currentTimeMillis(); if (proc.midx == 0 || proc.timeout_start == 0L) { proc.timeout_start = now; } EInteger ei; if ((ei = howlong.testInteger()) == null) throw new ErlangError(EAtom.intern("timeout_value")); long end = proc.timeout_start + ei.longValue(); long left = end - now; if (left < 0) { return false; } if (!proc.in_receive) { Task.sleep(left); return false; } else { if (ipclog.isLoggable(Level.FINE)) ipclog.fine( "WAIT| " + proc + " waiting for " + left + "ms for msg #" + (proc.midx + 1)); boolean res = proc.mbox.untilHasMessages(proc.midx + 1, left); proc.check_exit(); if (ipclog.isLoggable(Level.FINE)) ipclog.fine("WAIT| " + proc + " wakes up " + (res ? "on message" : "after timeout")); return res; } } } finally { proc.in_receive = false; } }
@BIF public static EObject start_timer(EObject time, final EObject rcv, final EObject msg) { // check arguments EInteger when = time.testInteger(); final EInternalPID rcv_pid = rcv.testInternalPID(); EAtom rcv_atom = rcv.testAtom(); if (when == null || gt(when, max_send_time) || lt(when, zero) || (rcv_pid == null && rcv_atom == null)) { throw ERT.badarg(time, rcv, msg); } ETimerTask send_task = new ETimerTask(rcv_pid) { @Override public void on_timeout() throws Pausable { ETuple3 timeout_msg = new ETuple3(); timeout_msg.elem1 = am_timeout; timeout_msg.elem2 = this.ref; timeout_msg.elem3 = msg; EHandle p; if ((p = rcv.testHandle()) != null) { p.sendb(timeout_msg); return; } p = register.get(rcv); if (p != null) { p.sendb(timeout_msg); } } }; send_task.schedule(when.longValue()); return send_task.ref; }
@BIF public static EObject send_after( final EProc proc, EObject time, final EObject rcv, final EObject msg) { // check arguments EInteger when = time.testInteger(); final EInternalPID rcv_pid = rcv.testInternalPID(); EAtom rcv_atom = rcv.testAtom(); if (when == null || gt(when, max_send_time) || lt(when, zero) || (rcv_pid == null && rcv_atom == null)) { throw ERT.badarg(time, rcv, msg); } ETimerTask send_task = new ETimerTask(rcv_pid) { @Override public void on_timeout() throws Pausable { EHandle p; if ((p = rcv.testHandle()) != null) { p.send(proc.self_handle(), msg); return; } p = register.get(rcv); if (p != null) { p.send(proc.self_handle(), msg); } } }; send_task.schedule(when.longValue()); return send_task.ref; }
public static EInteger RandomSmallIntegral(RandomGenerator r) { int count = r.UniformInt(20) + 1; StringBuilder sb = new StringBuilder(); if (r.UniformInt(2) == 0) { sb.append('-'); } for (int i = 0; i < count; ++i) { if (i == 0) { sb.append((char) ('1' + r.UniformInt(9))); } else { sb.append((char) ('0' + r.UniformInt(10))); } } return EInteger.FromString(sb.toString()); }
public static EFloat RandomEFloat(RandomGenerator r) { if (r.UniformInt(100) == 0) { int x = r.UniformInt(3); if (x == 0) { return EFloat.PositiveInfinity; } if (x == 1) { return EFloat.NegativeInfinity; } if (x == 2) { return EFloat.NaN; } } return EFloat.Create(RandomEInteger(r), EInteger.FromInt64(r.UniformInt(400) - 200)); }
public static EInteger RandomEInteger(RandomGenerator r) { int selection = r.UniformInt(100); if (selection < 40) { StringAndBigInt sabi = StringAndBigInt.Generate(r, 16); return sabi.getBigIntValue(); } if (selection < 50) { StringAndBigInt sabi = StringAndBigInt.Generate(r, 2 + r.UniformInt(35)); return sabi.getBigIntValue(); } else { int count = r.UniformInt(400) + 1; byte[] bytes = new byte[count]; for (int i = 0; i < count; ++i) { bytes[i] = (byte) ((int) r.UniformInt(256)); } return EInteger.FromBytes(bytes, true); } }
public static double unboxToDouble(EInteger i) { return i.doubleValue(); }
public static int unboxToInt(EInteger i) { return i.intValue(); }
public static final boolean lt(EInteger v1, EInteger v2) { return v1.erlangCompareTo(v2) < 0; }
/** * Read an arbitrary Erlang term from the stream. * * @return the Erlang term. * @exception IOException if the stream does not contain a known Erlang type at the next position. */ public EObject read_any() throws IOException { // calls one of the above functions, depending on o final int tag = peek1skip_version(); switch (tag) { case EExternal.smallIntTag: case EExternal.intTag: case EExternal.smallBigTag: case EExternal.largeBigTag: return EInteger.read(this); case EExternal.atomCacheRef: case EExternal.atomTag: case EExternal.smallAtomTag: return EAtom.read(this); case EExternal.floatTag: case EExternal.newFloatTag: return EDouble.read(this); case EExternal.refTag: case EExternal.newRefTag: return ERef.read(this); case EExternal.portTag: return EPort.read(this); case EExternal.pidTag: return EPID.read(this); case EExternal.stringTag: return EString.read(this); case EExternal.listTag: case EExternal.nilTag: if ((flags & DECODE_INT_LISTS_AS_STRINGS) != 0) { final int savePos = getPos(); try { return EString.read(this); } catch (final IOException e) { } setPos(savePos); } return EList.read(this); case EExternal.smallTupleTag: case EExternal.largeTupleTag: return ETuple.read(this); case EExternal.binTag: return EBinary.read(this); case EExternal.bitBinTag: return EBitString.read(this); case EExternal.compressedTag: return read_compressed(); case EExternal.newFunTag: case EExternal.funTag: return EFun.read(this); case EExternal.externalFunTag: return read_external_fun(); default: throw new IOException("Unknown data type: " + tag + " at position " + getPos()); } }