FloatVar::FloatVar(Space& home, FloatNum min, FloatNum max) : VarImpVar<Float::FloatVarImp>(new (home) Float::FloatVarImp(home,FloatVal(min,max))) { Float::Limits::check(min,"FloatVar::FloatVar"); Float::Limits::check(max,"FloatVar::FloatVar"); if (min > max) throw Float::VariableEmptyDomain("FloatVar::FloatVar"); }
void CJSONWriter::Val(const CFSVar &Var) { switch (Var.GetType()) { case CFSVar::VAR_EMPTY: NullVal(); break; case CFSVar::VAR_INT: IntVal(Var.GetInt()); break; case CFSVar::VAR_FLOAT: FloatVal(Var.GetFloat()); break; case CFSVar::VAR_BOOL: BoolVal(Var.GetBool()); break; case CFSVar::VAR_STRING: StringVal(Var.GetAString()); break; case CFSVar::VAR_MAP: ObjectStart(); for (INTPTR ip=0; ip<Var.GetSize(); ip++) { CFSAString szKey=Var.GetKey(ip); Key(szKey); Val(Var[szKey]); } ObjectEnd(); break; case CFSVar::VAR_ARRAY: ArrayStart(); for (INTPTR ip=0; ip<Var.GetSize(); ip++) { Val(Var[ip]); } ArrayEnd(); break; } }
retCode g__sleep(processPo P, ptrPo a) { ptrI x = deRefI(&a[1]); if (isvar(x)) return liberror(P, "sleep", eINSUFARG); else { objPo A1 = objV(x); if (!IsFloat(A1)) return liberror(P, "sleep", eNUMNEEDD); else { double f = FloatVal(A1); struct timeval now; double seconds; double fraction = modf(f, &seconds); gettimeofday(&now, NULL); if (seconds < now.tv_sec || (seconds == now.tv_sec && (fraction * 1000000) < now.tv_usec)) return Ok; else { struct timespec tm; tm.tv_sec = (long) seconds; tm.tv_nsec = (long) (fraction * NANO); /* Convert microseconds to nanoseconds */ tm.tv_sec = (long) seconds - now.tv_sec; tm.tv_nsec = (long) (fraction * NANO) - now.tv_usec * 1000; /* Convert microseconds to nanoseconds */ if (tm.tv_nsec > NANO) { tm.tv_nsec -= NANO; tm.tv_sec++; } else if (tm.tv_nsec < 0) { tm.tv_nsec += NANO; tm.tv_sec--; } switchProcessState(P, wait_timer); if (nanosleep(&tm, NULL) != 0) { setProcessRunnable(P); switch (errno) { case EINTR: return liberror(P, "sleep", eINTRUPT); case EINVAL: case ENOSYS: default: return liberror(P, "sleep", eINVAL); } } else { setProcessRunnable(P); return Ok; } } } } }
forceinline ModEvent FloatVarImp::lq(Space& home, const FloatVal& n) { if (n.max() >= dom.max()) return ME_FLOAT_NONE; if (n.max() < dom.min()) return ME_FLOAT_FAILED; FloatDelta d(n.min(),dom.max()); ModEvent me = ME_FLOAT_BND; dom = intersect(dom,FloatVal(dom.min(),n.min())); if (assigned()) me = ME_FLOAT_VAL; GECODE_ASSUME((me == ME_FLOAT_VAL) | (me == ME_FLOAT_BND)); return notify(home,me,d); }
forceinline ModEvent FloatVarImp::gq(Space& home, FloatNum n) { if (n > dom.max()) return ME_FLOAT_FAILED; if ((n <= dom.min()) || assigned()) return ME_FLOAT_NONE; FloatDelta d(dom.min(),n); ModEvent me = ME_FLOAT_BND; dom = intersect(dom,FloatVal(n,dom.max())); if (assigned()) me = ME_FLOAT_VAL; GECODE_ASSUME((me == ME_FLOAT_VAL) | (me == ME_FLOAT_BND)); return notify(home,me,d); }
retCode g__delay(processPo P, ptrPo a) { ptrI x = deRefI(&a[1]); if (isvar(x)) return liberror(P, "delay", eINSUFARG); else { objPo A1 = objV(x); if (!IsFloat(A1)) return liberror(P, "delay", eNUMNEEDD); else { struct timespec tm; double seconds; double fraction = modf(FloatVal(A1), &seconds); #define NANO (1000000000) tm.tv_sec = (long) seconds; tm.tv_nsec = (long) (fraction * NANO); /* Convert microseconds to nanoseconds */ switchProcessState(P, wait_timer); if (nanosleep(&tm, NULL) != 0) { setProcessRunnable(P); switch (errno) { case EINTR: return liberror(P, "delay", eINTRUPT); case EINVAL: case ENOSYS: default: return liberror(P, "delay", eINVAL); } } else { setProcessRunnable(P); return Ok; } } } }
forceinline void FloatVar::_init(Space& home, FloatNum min, FloatNum max) { x = new (home) Float::FloatVarImp(home,FloatVal(min,max)); }