Пример #1
0
static Value ripe_fftw_plan2d_new(Value x, Value y, Value v_sign)
{
  Value v_self = obj_new(klass_FftwPlan2D);
  FftwPlan2D* self = obj_c_data(v_self);

  self->x = val_to_int64(x);
  self->y = val_to_int64(y);
  if (self->x < 1 or self->y < 1){
    exc_raise("invalid dimensions of Fftw.Plan2D (%" PRId64"x%" PRId64")",
              self->x, self->y);
  }
  self->in = (fftw_complex*) fftw_malloc(
                               sizeof(fftw_complex) * self->x * self->y
                             );
  self->out = (fftw_complex*) fftw_malloc(
                                sizeof(fftw_complex) * self->x * self->y
                              );
  
  int64 sign = val_to_int64(v_sign);
  if (sign != FFTW_FORWARD and sign != FFTW_BACKWARD){
    exc_raise("invalid flag for FFT (passed %" PRId64")", sign);
  }

  self->plan = fftw_plan_dft_2d(self->x, self->y, self->in, self->out,
                                sign, FFTW_ESTIMATE);
  return v_self;
}
Пример #2
0
void* func_get_ptr(Value v_func, int16 num_params)
{
  obj_verify(v_func, klass_func);
  Func* c_data = obj_c_data(v_func);
  if (c_data->num_params != num_params){
    exc_raise("func_get_ptr() mismatch (Function has %"PRIu16
              " but called with %"PRIu16")", c_data->num_params,
              num_params);
  }
  return (void*) c_data->func0;
}
Пример #3
0
// Map Ripe index to C array index (or throw an exception if it isn't valid.
int64 util_index(const char* klass_name, int64 idx, int64 size)
{
  if (idx > 0){
    if (idx > size) goto invalid_idx;
    return idx - 1;
  }
  if (idx == 0) goto invalid_idx;
  if (idx < -size) goto invalid_idx;
  return size + idx;
invalid_idx:
  exc_raise("invalid index %"PRId64" in %s of size %"PRId64,
            idx, klass_name, size);
}