PyObject *py_ped_alignment_align_up(PyObject *s, PyObject *args) { PyObject *in_geom = NULL; PedAlignment *align = NULL; PedGeometry *out_geom = NULL; PedSector sector, ret; if (!PyArg_ParseTuple(args, "O!L", &_ped_Geometry_Type_obj, &in_geom, §or)) { return NULL; } align = _ped_Alignment2PedAlignment(s); if (align == NULL) { return NULL; } out_geom = _ped_Geometry2PedGeometry(in_geom); if (out_geom == NULL) { return NULL; } ret = ped_alignment_align_up(align, out_geom, sector); ped_alignment_destroy(align); if (ret == -1) { PyErr_SetString(PyExc_ArithmeticError, "Could not align up to sector"); return NULL; } return PyLong_FromLong(ret); }
/* * Return the region within which the start must lie * in order to satisfy a constriant. It takes into account * constraint->start_range, constraint->min_size and constraint->max_size. * All sectors in this range that also satisfy alignment requirements have * an end, such that the (start, end) satisfy the constraint. */ static PedGeometry* _constraint_get_canonical_start_range (const PedConstraint* constraint) { PedSector first_end_soln; PedSector last_end_soln; PedSector min_start; PedSector max_start; PedGeometry start_min_max_range; if (constraint->min_size > constraint->max_size) return NULL; first_end_soln = ped_alignment_align_down ( constraint->end_align, constraint->end_range, constraint->end_range->start); last_end_soln = ped_alignment_align_up ( constraint->end_align, constraint->end_range, constraint->end_range->end); if (first_end_soln == -1 || last_end_soln == -1 || first_end_soln > last_end_soln || last_end_soln < constraint->min_size) return NULL; min_start = first_end_soln - constraint->max_size + 1; if (min_start < 0) min_start = 0; max_start = last_end_soln - constraint->min_size + 1; if (max_start < 0) return NULL; ped_geometry_init ( &start_min_max_range, constraint->start_range->dev, min_start, max_start - min_start + 1); return ped_geometry_intersect (&start_min_max_range, constraint->start_range); }