Esempio n. 1
0
 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");
 }
Esempio n. 2
0
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;
	}
}
Esempio n. 3
0
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;
        }
      }
    }
  }
}
Esempio n. 4
0
 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);
 }
Esempio n. 5
0
 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);
 }
Esempio n. 6
0
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;
      }
    }
  }
}
Esempio n. 7
0
 forceinline void
 FloatVar::_init(Space& home, FloatNum min, FloatNum max) {
   x = new (home) Float::FloatVarImp(home,FloatVal(min,max));
 }