module proj;

nothrow @nogc extern(C):

import types;
import glob_opts;


void project(OSQPWorkspace *work, c_float *z) {
  c_int i, m;

  m = work.data.m;

  for (i = 0; i < m; i++) {
    z[i] = c_min(c_max(z[i],
                       work.data.l[i]), // Between lower
                 work.data.u[i]);       // and upper bounds
  }
}

void project_normalcone(OSQPWorkspace *work, c_float *z, c_float *y) {
  c_int i, m;

  // NB: Use z_prev as temporary vector

  m = work.data.m;

  for (i = 0; i < m; i++) {
    work.z_prev[i] = z[i] + y[i];
    z[i]            = c_min(c_max(work.z_prev[i], work.data.l[i]),
                            work.data.u[i]);
    y[i] = work.z_prev[i] - z[i];
  }
}