1use super::{Context, Error, LibISLError, Val, Vec};
5use libc::uintptr_t;
6
7pub struct Mat {
9 pub ptr: uintptr_t,
10 pub should_free_on_drop: bool,
11}
12
13extern "C" {
14
15 fn isl_mat_add_rows(mat: uintptr_t, n: u32) -> uintptr_t;
16
17 fn isl_mat_add_zero_cols(mat: uintptr_t, n: u32) -> uintptr_t;
18
19 fn isl_mat_add_zero_rows(mat: uintptr_t, n: u32) -> uintptr_t;
20
21 fn isl_mat_aff_direct_sum(left: uintptr_t, right: uintptr_t) -> uintptr_t;
22
23 fn isl_mat_alloc(ctx: uintptr_t, n_row: u32, n_col: u32) -> uintptr_t;
24
25 fn isl_mat_col_add(mat: uintptr_t, dst_col: i32, src_col: i32) -> ();
26
27 fn isl_mat_cols(mat: uintptr_t) -> i32;
28
29 fn isl_mat_concat(top: uintptr_t, bot: uintptr_t) -> uintptr_t;
30
31 fn isl_mat_copy(mat: uintptr_t) -> uintptr_t;
32
33 fn isl_mat_diagonal(mat1: uintptr_t, mat2: uintptr_t) -> uintptr_t;
34
35 fn isl_mat_drop_cols(mat: uintptr_t, col: u32, n: u32) -> uintptr_t;
36
37 fn isl_mat_drop_rows(mat: uintptr_t, row: u32, n: u32) -> uintptr_t;
38
39 fn isl_mat_dump(mat: uintptr_t) -> ();
40
41 fn isl_mat_extend(mat: uintptr_t, n_row: u32, n_col: u32) -> uintptr_t;
42
43 fn isl_mat_free(mat: uintptr_t) -> uintptr_t;
44
45 fn isl_mat_from_row_vec(vec: uintptr_t) -> uintptr_t;
46
47 fn isl_mat_get_ctx(mat: uintptr_t) -> uintptr_t;
48
49 fn isl_mat_get_element_val(mat: uintptr_t, row: i32, col: i32) -> uintptr_t;
50
51 fn isl_mat_has_linearly_independent_rows(mat1: uintptr_t, mat2: uintptr_t) -> i32;
52
53 fn isl_mat_identity(ctx: uintptr_t, n_row: u32) -> uintptr_t;
54
55 fn isl_mat_initial_non_zero_cols(mat: uintptr_t) -> i32;
56
57 fn isl_mat_insert_cols(mat: uintptr_t, col: u32, n: u32) -> uintptr_t;
58
59 fn isl_mat_insert_rows(mat: uintptr_t, row: u32, n: u32) -> uintptr_t;
60
61 fn isl_mat_insert_zero_cols(mat: uintptr_t, first: u32, n: u32) -> uintptr_t;
62
63 fn isl_mat_insert_zero_rows(mat: uintptr_t, row: u32, n: u32) -> uintptr_t;
64
65 fn isl_mat_inverse_product(left: uintptr_t, right: uintptr_t) -> uintptr_t;
66
67 fn isl_mat_is_equal(mat1: uintptr_t, mat2: uintptr_t) -> i32;
68
69 fn isl_mat_lin_to_aff(mat: uintptr_t) -> uintptr_t;
70
71 fn isl_mat_move_cols(mat: uintptr_t, dst_col: u32, src_col: u32, n: u32) -> uintptr_t;
72
73 fn isl_mat_normalize(mat: uintptr_t) -> uintptr_t;
74
75 fn isl_mat_normalize_row(mat: uintptr_t, row: i32) -> uintptr_t;
76
77 fn isl_mat_product(left: uintptr_t, right: uintptr_t) -> uintptr_t;
78
79 fn isl_mat_rank(mat: uintptr_t) -> i32;
80
81 fn isl_mat_right_inverse(mat: uintptr_t) -> uintptr_t;
82
83 fn isl_mat_right_kernel(mat: uintptr_t) -> uintptr_t;
84
85 fn isl_mat_row_basis(mat: uintptr_t) -> uintptr_t;
86
87 fn isl_mat_row_basis_extension(mat1: uintptr_t, mat2: uintptr_t) -> uintptr_t;
88
89 fn isl_mat_rows(mat: uintptr_t) -> i32;
90
91 fn isl_mat_set_element_si(mat: uintptr_t, row: i32, col: i32, v: i32) -> uintptr_t;
92
93 fn isl_mat_set_element_val(mat: uintptr_t, row: i32, col: i32, v: uintptr_t) -> uintptr_t;
94
95 fn isl_mat_swap_cols(mat: uintptr_t, i: u32, j: u32) -> uintptr_t;
96
97 fn isl_mat_swap_rows(mat: uintptr_t, i: u32, j: u32) -> uintptr_t;
98
99 fn isl_mat_transpose(mat: uintptr_t) -> uintptr_t;
100
101 fn isl_mat_unimodular_complete(M: uintptr_t, row: i32) -> uintptr_t;
102
103 fn isl_mat_vec_concat(top: uintptr_t, bot: uintptr_t) -> uintptr_t;
104
105 fn isl_mat_vec_inverse_product(mat: uintptr_t, vec: uintptr_t) -> uintptr_t;
106
107 fn isl_mat_vec_product(mat: uintptr_t, vec: uintptr_t) -> uintptr_t;
108
109}
110
111impl Mat {
112 pub fn add_rows(self, n: u32) -> Result<Mat, LibISLError> {
114 let mat = self;
115 let isl_rs_ctx = mat.get_ctx();
116 let mut mat = mat;
117 mat.do_not_free_on_drop();
118 let mat = mat.ptr;
119 let isl_rs_result = unsafe { isl_mat_add_rows(mat, n) };
120 let isl_rs_result = Mat { ptr: isl_rs_result,
121 should_free_on_drop: true };
122 let err = isl_rs_ctx.last_error();
123 if err != Error::None_ {
124 let err_msg = isl_rs_ctx.last_error_msg();
125 isl_rs_ctx.reset_error();
126 return Err(LibISLError::new(err, err_msg));
127 }
128 Ok(isl_rs_result)
129 }
130
131 pub fn add_zero_cols(self, n: u32) -> Result<Mat, LibISLError> {
133 let mat = self;
134 let isl_rs_ctx = mat.get_ctx();
135 let mut mat = mat;
136 mat.do_not_free_on_drop();
137 let mat = mat.ptr;
138 let isl_rs_result = unsafe { isl_mat_add_zero_cols(mat, n) };
139 let isl_rs_result = Mat { ptr: isl_rs_result,
140 should_free_on_drop: true };
141 let err = isl_rs_ctx.last_error();
142 if err != Error::None_ {
143 let err_msg = isl_rs_ctx.last_error_msg();
144 isl_rs_ctx.reset_error();
145 return Err(LibISLError::new(err, err_msg));
146 }
147 Ok(isl_rs_result)
148 }
149
150 pub fn add_zero_rows(self, n: u32) -> Result<Mat, LibISLError> {
152 let mat = self;
153 let isl_rs_ctx = mat.get_ctx();
154 let mut mat = mat;
155 mat.do_not_free_on_drop();
156 let mat = mat.ptr;
157 let isl_rs_result = unsafe { isl_mat_add_zero_rows(mat, n) };
158 let isl_rs_result = Mat { ptr: isl_rs_result,
159 should_free_on_drop: true };
160 let err = isl_rs_ctx.last_error();
161 if err != Error::None_ {
162 let err_msg = isl_rs_ctx.last_error_msg();
163 isl_rs_ctx.reset_error();
164 return Err(LibISLError::new(err, err_msg));
165 }
166 Ok(isl_rs_result)
167 }
168
169 pub fn aff_direct_sum(self, right: Mat) -> Result<Mat, LibISLError> {
171 let left = self;
172 let isl_rs_ctx = left.get_ctx();
173 let mut left = left;
174 left.do_not_free_on_drop();
175 let left = left.ptr;
176 let mut right = right;
177 right.do_not_free_on_drop();
178 let right = right.ptr;
179 let isl_rs_result = unsafe { isl_mat_aff_direct_sum(left, right) };
180 let isl_rs_result = Mat { ptr: isl_rs_result,
181 should_free_on_drop: true };
182 let err = isl_rs_ctx.last_error();
183 if err != Error::None_ {
184 let err_msg = isl_rs_ctx.last_error_msg();
185 isl_rs_ctx.reset_error();
186 return Err(LibISLError::new(err, err_msg));
187 }
188 Ok(isl_rs_result)
189 }
190
191 pub fn alloc(ctx: &Context, n_row: u32, n_col: u32) -> Result<Mat, LibISLError> {
193 let isl_rs_ctx = Context { ptr: ctx.ptr,
194 should_free_on_drop: false };
195 let ctx = ctx.ptr;
196 let isl_rs_result = unsafe { isl_mat_alloc(ctx, n_row, n_col) };
197 let isl_rs_result = Mat { ptr: isl_rs_result,
198 should_free_on_drop: true };
199 let err = isl_rs_ctx.last_error();
200 if err != Error::None_ {
201 let err_msg = isl_rs_ctx.last_error_msg();
202 isl_rs_ctx.reset_error();
203 return Err(LibISLError::new(err, err_msg));
204 }
205 Ok(isl_rs_result)
206 }
207
208 pub fn col_add(&self, dst_col: i32, src_col: i32) -> Result<(), LibISLError> {
210 let mat = self;
211 let isl_rs_ctx = mat.get_ctx();
212 let mat = mat.ptr;
213 let isl_rs_result = unsafe { isl_mat_col_add(mat, dst_col, src_col) };
214 let err = isl_rs_ctx.last_error();
215 if err != Error::None_ {
216 let err_msg = isl_rs_ctx.last_error_msg();
217 isl_rs_ctx.reset_error();
218 return Err(LibISLError::new(err, err_msg));
219 }
220 Ok(isl_rs_result)
221 }
222
223 pub fn cols(&self) -> Result<i32, LibISLError> {
225 let mat = self;
226 let isl_rs_ctx = mat.get_ctx();
227 let mat = mat.ptr;
228 let isl_rs_result = unsafe { isl_mat_cols(mat) };
229 let err = isl_rs_ctx.last_error();
230 if err != Error::None_ {
231 let err_msg = isl_rs_ctx.last_error_msg();
232 isl_rs_ctx.reset_error();
233 return Err(LibISLError::new(err, err_msg));
234 }
235 Ok(isl_rs_result)
236 }
237
238 pub fn concat(self, bot: Mat) -> Result<Mat, LibISLError> {
240 let top = self;
241 let isl_rs_ctx = top.get_ctx();
242 let mut top = top;
243 top.do_not_free_on_drop();
244 let top = top.ptr;
245 let mut bot = bot;
246 bot.do_not_free_on_drop();
247 let bot = bot.ptr;
248 let isl_rs_result = unsafe { isl_mat_concat(top, bot) };
249 let isl_rs_result = Mat { ptr: isl_rs_result,
250 should_free_on_drop: true };
251 let err = isl_rs_ctx.last_error();
252 if err != Error::None_ {
253 let err_msg = isl_rs_ctx.last_error_msg();
254 isl_rs_ctx.reset_error();
255 return Err(LibISLError::new(err, err_msg));
256 }
257 Ok(isl_rs_result)
258 }
259
260 pub fn copy(&self) -> Result<Mat, LibISLError> {
262 let mat = self;
263 let isl_rs_ctx = mat.get_ctx();
264 let mat = mat.ptr;
265 let isl_rs_result = unsafe { isl_mat_copy(mat) };
266 let isl_rs_result = Mat { ptr: isl_rs_result,
267 should_free_on_drop: true };
268 let err = isl_rs_ctx.last_error();
269 if err != Error::None_ {
270 let err_msg = isl_rs_ctx.last_error_msg();
271 isl_rs_ctx.reset_error();
272 return Err(LibISLError::new(err, err_msg));
273 }
274 Ok(isl_rs_result)
275 }
276
277 pub fn diagonal(self, mat2: Mat) -> Result<Mat, LibISLError> {
279 let mat1 = self;
280 let isl_rs_ctx = mat1.get_ctx();
281 let mut mat1 = mat1;
282 mat1.do_not_free_on_drop();
283 let mat1 = mat1.ptr;
284 let mut mat2 = mat2;
285 mat2.do_not_free_on_drop();
286 let mat2 = mat2.ptr;
287 let isl_rs_result = unsafe { isl_mat_diagonal(mat1, mat2) };
288 let isl_rs_result = Mat { ptr: isl_rs_result,
289 should_free_on_drop: true };
290 let err = isl_rs_ctx.last_error();
291 if err != Error::None_ {
292 let err_msg = isl_rs_ctx.last_error_msg();
293 isl_rs_ctx.reset_error();
294 return Err(LibISLError::new(err, err_msg));
295 }
296 Ok(isl_rs_result)
297 }
298
299 pub fn drop_cols(self, col: u32, n: u32) -> Result<Mat, LibISLError> {
301 let mat = self;
302 let isl_rs_ctx = mat.get_ctx();
303 let mut mat = mat;
304 mat.do_not_free_on_drop();
305 let mat = mat.ptr;
306 let isl_rs_result = unsafe { isl_mat_drop_cols(mat, col, n) };
307 let isl_rs_result = Mat { ptr: isl_rs_result,
308 should_free_on_drop: true };
309 let err = isl_rs_ctx.last_error();
310 if err != Error::None_ {
311 let err_msg = isl_rs_ctx.last_error_msg();
312 isl_rs_ctx.reset_error();
313 return Err(LibISLError::new(err, err_msg));
314 }
315 Ok(isl_rs_result)
316 }
317
318 pub fn drop_rows(self, row: u32, n: u32) -> Result<Mat, LibISLError> {
320 let mat = self;
321 let isl_rs_ctx = mat.get_ctx();
322 let mut mat = mat;
323 mat.do_not_free_on_drop();
324 let mat = mat.ptr;
325 let isl_rs_result = unsafe { isl_mat_drop_rows(mat, row, n) };
326 let isl_rs_result = Mat { ptr: isl_rs_result,
327 should_free_on_drop: true };
328 let err = isl_rs_ctx.last_error();
329 if err != Error::None_ {
330 let err_msg = isl_rs_ctx.last_error_msg();
331 isl_rs_ctx.reset_error();
332 return Err(LibISLError::new(err, err_msg));
333 }
334 Ok(isl_rs_result)
335 }
336
337 pub fn dump(&self) -> Result<(), LibISLError> {
339 let mat = self;
340 let isl_rs_ctx = mat.get_ctx();
341 let mat = mat.ptr;
342 let isl_rs_result = unsafe { isl_mat_dump(mat) };
343 let err = isl_rs_ctx.last_error();
344 if err != Error::None_ {
345 let err_msg = isl_rs_ctx.last_error_msg();
346 isl_rs_ctx.reset_error();
347 return Err(LibISLError::new(err, err_msg));
348 }
349 Ok(isl_rs_result)
350 }
351
352 pub fn extend(self, n_row: u32, n_col: u32) -> Result<Mat, LibISLError> {
354 let mat = self;
355 let isl_rs_ctx = mat.get_ctx();
356 let mut mat = mat;
357 mat.do_not_free_on_drop();
358 let mat = mat.ptr;
359 let isl_rs_result = unsafe { isl_mat_extend(mat, n_row, n_col) };
360 let isl_rs_result = Mat { ptr: isl_rs_result,
361 should_free_on_drop: true };
362 let err = isl_rs_ctx.last_error();
363 if err != Error::None_ {
364 let err_msg = isl_rs_ctx.last_error_msg();
365 isl_rs_ctx.reset_error();
366 return Err(LibISLError::new(err, err_msg));
367 }
368 Ok(isl_rs_result)
369 }
370
371 pub fn free(self) -> Result<Mat, LibISLError> {
373 let mat = self;
374 let isl_rs_ctx = mat.get_ctx();
375 let mut mat = mat;
376 mat.do_not_free_on_drop();
377 let mat = mat.ptr;
378 let isl_rs_result = unsafe { isl_mat_free(mat) };
379 let isl_rs_result = Mat { ptr: isl_rs_result,
380 should_free_on_drop: true };
381 let err = isl_rs_ctx.last_error();
382 if err != Error::None_ {
383 let err_msg = isl_rs_ctx.last_error_msg();
384 isl_rs_ctx.reset_error();
385 return Err(LibISLError::new(err, err_msg));
386 }
387 Ok(isl_rs_result)
388 }
389
390 pub fn from_row_vec(vec: Vec) -> Result<Mat, LibISLError> {
392 let isl_rs_ctx = vec.get_ctx();
393 let mut vec = vec;
394 vec.do_not_free_on_drop();
395 let vec = vec.ptr;
396 let isl_rs_result = unsafe { isl_mat_from_row_vec(vec) };
397 let isl_rs_result = Mat { ptr: isl_rs_result,
398 should_free_on_drop: true };
399 let err = isl_rs_ctx.last_error();
400 if err != Error::None_ {
401 let err_msg = isl_rs_ctx.last_error_msg();
402 isl_rs_ctx.reset_error();
403 return Err(LibISLError::new(err, err_msg));
404 }
405 Ok(isl_rs_result)
406 }
407
408 pub fn get_ctx(&self) -> Context {
410 let mat = self;
411 let mat = mat.ptr;
412 let isl_rs_result = unsafe { isl_mat_get_ctx(mat) };
413 let isl_rs_result = Context { ptr: isl_rs_result,
414 should_free_on_drop: false };
415 isl_rs_result
416 }
417
418 pub fn get_element_val(&self, row: i32, col: i32) -> Result<Val, LibISLError> {
420 let mat = self;
421 let isl_rs_ctx = mat.get_ctx();
422 let mat = mat.ptr;
423 let isl_rs_result = unsafe { isl_mat_get_element_val(mat, row, col) };
424 let isl_rs_result = Val { ptr: isl_rs_result,
425 should_free_on_drop: true };
426 let err = isl_rs_ctx.last_error();
427 if err != Error::None_ {
428 let err_msg = isl_rs_ctx.last_error_msg();
429 isl_rs_ctx.reset_error();
430 return Err(LibISLError::new(err, err_msg));
431 }
432 Ok(isl_rs_result)
433 }
434
435 pub fn has_linearly_independent_rows(&self, mat2: &Mat) -> Result<bool, LibISLError> {
437 let mat1 = self;
438 let isl_rs_ctx = mat1.get_ctx();
439 let mat1 = mat1.ptr;
440 let mat2 = mat2.ptr;
441 let isl_rs_result = unsafe { isl_mat_has_linearly_independent_rows(mat1, mat2) };
442 let isl_rs_result = match isl_rs_result {
443 0 => false,
444 1 => true,
445 _ => {
446 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
447 }
448 };
449 let err = isl_rs_ctx.last_error();
450 if err != Error::None_ {
451 let err_msg = isl_rs_ctx.last_error_msg();
452 isl_rs_ctx.reset_error();
453 return Err(LibISLError::new(err, err_msg));
454 }
455 Ok(isl_rs_result)
456 }
457
458 pub fn identity(ctx: &Context, n_row: u32) -> Result<Mat, LibISLError> {
460 let isl_rs_ctx = Context { ptr: ctx.ptr,
461 should_free_on_drop: false };
462 let ctx = ctx.ptr;
463 let isl_rs_result = unsafe { isl_mat_identity(ctx, n_row) };
464 let isl_rs_result = Mat { ptr: isl_rs_result,
465 should_free_on_drop: true };
466 let err = isl_rs_ctx.last_error();
467 if err != Error::None_ {
468 let err_msg = isl_rs_ctx.last_error_msg();
469 isl_rs_ctx.reset_error();
470 return Err(LibISLError::new(err, err_msg));
471 }
472 Ok(isl_rs_result)
473 }
474
475 pub fn initial_non_zero_cols(&self) -> Result<i32, LibISLError> {
477 let mat = self;
478 let isl_rs_ctx = mat.get_ctx();
479 let mat = mat.ptr;
480 let isl_rs_result = unsafe { isl_mat_initial_non_zero_cols(mat) };
481 let err = isl_rs_ctx.last_error();
482 if err != Error::None_ {
483 let err_msg = isl_rs_ctx.last_error_msg();
484 isl_rs_ctx.reset_error();
485 return Err(LibISLError::new(err, err_msg));
486 }
487 Ok(isl_rs_result)
488 }
489
490 pub fn insert_cols(self, col: u32, n: u32) -> Result<Mat, LibISLError> {
492 let mat = self;
493 let isl_rs_ctx = mat.get_ctx();
494 let mut mat = mat;
495 mat.do_not_free_on_drop();
496 let mat = mat.ptr;
497 let isl_rs_result = unsafe { isl_mat_insert_cols(mat, col, n) };
498 let isl_rs_result = Mat { ptr: isl_rs_result,
499 should_free_on_drop: true };
500 let err = isl_rs_ctx.last_error();
501 if err != Error::None_ {
502 let err_msg = isl_rs_ctx.last_error_msg();
503 isl_rs_ctx.reset_error();
504 return Err(LibISLError::new(err, err_msg));
505 }
506 Ok(isl_rs_result)
507 }
508
509 pub fn insert_rows(self, row: u32, n: u32) -> Result<Mat, LibISLError> {
511 let mat = self;
512 let isl_rs_ctx = mat.get_ctx();
513 let mut mat = mat;
514 mat.do_not_free_on_drop();
515 let mat = mat.ptr;
516 let isl_rs_result = unsafe { isl_mat_insert_rows(mat, row, n) };
517 let isl_rs_result = Mat { ptr: isl_rs_result,
518 should_free_on_drop: true };
519 let err = isl_rs_ctx.last_error();
520 if err != Error::None_ {
521 let err_msg = isl_rs_ctx.last_error_msg();
522 isl_rs_ctx.reset_error();
523 return Err(LibISLError::new(err, err_msg));
524 }
525 Ok(isl_rs_result)
526 }
527
528 pub fn insert_zero_cols(self, first: u32, n: u32) -> Result<Mat, LibISLError> {
530 let mat = self;
531 let isl_rs_ctx = mat.get_ctx();
532 let mut mat = mat;
533 mat.do_not_free_on_drop();
534 let mat = mat.ptr;
535 let isl_rs_result = unsafe { isl_mat_insert_zero_cols(mat, first, n) };
536 let isl_rs_result = Mat { ptr: isl_rs_result,
537 should_free_on_drop: true };
538 let err = isl_rs_ctx.last_error();
539 if err != Error::None_ {
540 let err_msg = isl_rs_ctx.last_error_msg();
541 isl_rs_ctx.reset_error();
542 return Err(LibISLError::new(err, err_msg));
543 }
544 Ok(isl_rs_result)
545 }
546
547 pub fn insert_zero_rows(self, row: u32, n: u32) -> Result<Mat, LibISLError> {
549 let mat = self;
550 let isl_rs_ctx = mat.get_ctx();
551 let mut mat = mat;
552 mat.do_not_free_on_drop();
553 let mat = mat.ptr;
554 let isl_rs_result = unsafe { isl_mat_insert_zero_rows(mat, row, n) };
555 let isl_rs_result = Mat { ptr: isl_rs_result,
556 should_free_on_drop: true };
557 let err = isl_rs_ctx.last_error();
558 if err != Error::None_ {
559 let err_msg = isl_rs_ctx.last_error_msg();
560 isl_rs_ctx.reset_error();
561 return Err(LibISLError::new(err, err_msg));
562 }
563 Ok(isl_rs_result)
564 }
565
566 pub fn inverse_product(self, right: Mat) -> Result<Mat, LibISLError> {
568 let left = self;
569 let isl_rs_ctx = left.get_ctx();
570 let mut left = left;
571 left.do_not_free_on_drop();
572 let left = left.ptr;
573 let mut right = right;
574 right.do_not_free_on_drop();
575 let right = right.ptr;
576 let isl_rs_result = unsafe { isl_mat_inverse_product(left, right) };
577 let isl_rs_result = Mat { ptr: isl_rs_result,
578 should_free_on_drop: true };
579 let err = isl_rs_ctx.last_error();
580 if err != Error::None_ {
581 let err_msg = isl_rs_ctx.last_error_msg();
582 isl_rs_ctx.reset_error();
583 return Err(LibISLError::new(err, err_msg));
584 }
585 Ok(isl_rs_result)
586 }
587
588 pub fn is_equal(&self, mat2: &Mat) -> Result<bool, LibISLError> {
590 let mat1 = self;
591 let isl_rs_ctx = mat1.get_ctx();
592 let mat1 = mat1.ptr;
593 let mat2 = mat2.ptr;
594 let isl_rs_result = unsafe { isl_mat_is_equal(mat1, mat2) };
595 let isl_rs_result = match isl_rs_result {
596 0 => false,
597 1 => true,
598 _ => {
599 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
600 }
601 };
602 let err = isl_rs_ctx.last_error();
603 if err != Error::None_ {
604 let err_msg = isl_rs_ctx.last_error_msg();
605 isl_rs_ctx.reset_error();
606 return Err(LibISLError::new(err, err_msg));
607 }
608 Ok(isl_rs_result)
609 }
610
611 pub fn lin_to_aff(self) -> Result<Mat, LibISLError> {
613 let mat = self;
614 let isl_rs_ctx = mat.get_ctx();
615 let mut mat = mat;
616 mat.do_not_free_on_drop();
617 let mat = mat.ptr;
618 let isl_rs_result = unsafe { isl_mat_lin_to_aff(mat) };
619 let isl_rs_result = Mat { ptr: isl_rs_result,
620 should_free_on_drop: true };
621 let err = isl_rs_ctx.last_error();
622 if err != Error::None_ {
623 let err_msg = isl_rs_ctx.last_error_msg();
624 isl_rs_ctx.reset_error();
625 return Err(LibISLError::new(err, err_msg));
626 }
627 Ok(isl_rs_result)
628 }
629
630 pub fn move_cols(self, dst_col: u32, src_col: u32, n: u32) -> Result<Mat, LibISLError> {
632 let mat = self;
633 let isl_rs_ctx = mat.get_ctx();
634 let mut mat = mat;
635 mat.do_not_free_on_drop();
636 let mat = mat.ptr;
637 let isl_rs_result = unsafe { isl_mat_move_cols(mat, dst_col, src_col, n) };
638 let isl_rs_result = Mat { ptr: isl_rs_result,
639 should_free_on_drop: true };
640 let err = isl_rs_ctx.last_error();
641 if err != Error::None_ {
642 let err_msg = isl_rs_ctx.last_error_msg();
643 isl_rs_ctx.reset_error();
644 return Err(LibISLError::new(err, err_msg));
645 }
646 Ok(isl_rs_result)
647 }
648
649 pub fn normalize(self) -> Result<Mat, LibISLError> {
651 let mat = self;
652 let isl_rs_ctx = mat.get_ctx();
653 let mut mat = mat;
654 mat.do_not_free_on_drop();
655 let mat = mat.ptr;
656 let isl_rs_result = unsafe { isl_mat_normalize(mat) };
657 let isl_rs_result = Mat { ptr: isl_rs_result,
658 should_free_on_drop: true };
659 let err = isl_rs_ctx.last_error();
660 if err != Error::None_ {
661 let err_msg = isl_rs_ctx.last_error_msg();
662 isl_rs_ctx.reset_error();
663 return Err(LibISLError::new(err, err_msg));
664 }
665 Ok(isl_rs_result)
666 }
667
668 pub fn normalize_row(self, row: i32) -> Result<Mat, LibISLError> {
670 let mat = self;
671 let isl_rs_ctx = mat.get_ctx();
672 let mut mat = mat;
673 mat.do_not_free_on_drop();
674 let mat = mat.ptr;
675 let isl_rs_result = unsafe { isl_mat_normalize_row(mat, row) };
676 let isl_rs_result = Mat { ptr: isl_rs_result,
677 should_free_on_drop: true };
678 let err = isl_rs_ctx.last_error();
679 if err != Error::None_ {
680 let err_msg = isl_rs_ctx.last_error_msg();
681 isl_rs_ctx.reset_error();
682 return Err(LibISLError::new(err, err_msg));
683 }
684 Ok(isl_rs_result)
685 }
686
687 pub fn product(self, right: Mat) -> Result<Mat, LibISLError> {
689 let left = self;
690 let isl_rs_ctx = left.get_ctx();
691 let mut left = left;
692 left.do_not_free_on_drop();
693 let left = left.ptr;
694 let mut right = right;
695 right.do_not_free_on_drop();
696 let right = right.ptr;
697 let isl_rs_result = unsafe { isl_mat_product(left, right) };
698 let isl_rs_result = Mat { ptr: isl_rs_result,
699 should_free_on_drop: true };
700 let err = isl_rs_ctx.last_error();
701 if err != Error::None_ {
702 let err_msg = isl_rs_ctx.last_error_msg();
703 isl_rs_ctx.reset_error();
704 return Err(LibISLError::new(err, err_msg));
705 }
706 Ok(isl_rs_result)
707 }
708
709 pub fn rank(&self) -> Result<i32, LibISLError> {
711 let mat = self;
712 let isl_rs_ctx = mat.get_ctx();
713 let mat = mat.ptr;
714 let isl_rs_result = unsafe { isl_mat_rank(mat) };
715 let err = isl_rs_ctx.last_error();
716 if err != Error::None_ {
717 let err_msg = isl_rs_ctx.last_error_msg();
718 isl_rs_ctx.reset_error();
719 return Err(LibISLError::new(err, err_msg));
720 }
721 Ok(isl_rs_result)
722 }
723
724 pub fn right_inverse(self) -> Result<Mat, LibISLError> {
726 let mat = self;
727 let isl_rs_ctx = mat.get_ctx();
728 let mut mat = mat;
729 mat.do_not_free_on_drop();
730 let mat = mat.ptr;
731 let isl_rs_result = unsafe { isl_mat_right_inverse(mat) };
732 let isl_rs_result = Mat { ptr: isl_rs_result,
733 should_free_on_drop: true };
734 let err = isl_rs_ctx.last_error();
735 if err != Error::None_ {
736 let err_msg = isl_rs_ctx.last_error_msg();
737 isl_rs_ctx.reset_error();
738 return Err(LibISLError::new(err, err_msg));
739 }
740 Ok(isl_rs_result)
741 }
742
743 pub fn right_kernel(self) -> Result<Mat, LibISLError> {
745 let mat = self;
746 let isl_rs_ctx = mat.get_ctx();
747 let mut mat = mat;
748 mat.do_not_free_on_drop();
749 let mat = mat.ptr;
750 let isl_rs_result = unsafe { isl_mat_right_kernel(mat) };
751 let isl_rs_result = Mat { ptr: isl_rs_result,
752 should_free_on_drop: true };
753 let err = isl_rs_ctx.last_error();
754 if err != Error::None_ {
755 let err_msg = isl_rs_ctx.last_error_msg();
756 isl_rs_ctx.reset_error();
757 return Err(LibISLError::new(err, err_msg));
758 }
759 Ok(isl_rs_result)
760 }
761
762 pub fn row_basis(self) -> Result<Mat, LibISLError> {
764 let mat = self;
765 let isl_rs_ctx = mat.get_ctx();
766 let mut mat = mat;
767 mat.do_not_free_on_drop();
768 let mat = mat.ptr;
769 let isl_rs_result = unsafe { isl_mat_row_basis(mat) };
770 let isl_rs_result = Mat { ptr: isl_rs_result,
771 should_free_on_drop: true };
772 let err = isl_rs_ctx.last_error();
773 if err != Error::None_ {
774 let err_msg = isl_rs_ctx.last_error_msg();
775 isl_rs_ctx.reset_error();
776 return Err(LibISLError::new(err, err_msg));
777 }
778 Ok(isl_rs_result)
779 }
780
781 pub fn row_basis_extension(self, mat2: Mat) -> Result<Mat, LibISLError> {
783 let mat1 = self;
784 let isl_rs_ctx = mat1.get_ctx();
785 let mut mat1 = mat1;
786 mat1.do_not_free_on_drop();
787 let mat1 = mat1.ptr;
788 let mut mat2 = mat2;
789 mat2.do_not_free_on_drop();
790 let mat2 = mat2.ptr;
791 let isl_rs_result = unsafe { isl_mat_row_basis_extension(mat1, mat2) };
792 let isl_rs_result = Mat { ptr: isl_rs_result,
793 should_free_on_drop: true };
794 let err = isl_rs_ctx.last_error();
795 if err != Error::None_ {
796 let err_msg = isl_rs_ctx.last_error_msg();
797 isl_rs_ctx.reset_error();
798 return Err(LibISLError::new(err, err_msg));
799 }
800 Ok(isl_rs_result)
801 }
802
803 pub fn rows(&self) -> Result<i32, LibISLError> {
805 let mat = self;
806 let isl_rs_ctx = mat.get_ctx();
807 let mat = mat.ptr;
808 let isl_rs_result = unsafe { isl_mat_rows(mat) };
809 let err = isl_rs_ctx.last_error();
810 if err != Error::None_ {
811 let err_msg = isl_rs_ctx.last_error_msg();
812 isl_rs_ctx.reset_error();
813 return Err(LibISLError::new(err, err_msg));
814 }
815 Ok(isl_rs_result)
816 }
817
818 pub fn set_element_si(self, row: i32, col: i32, v: i32) -> Result<Mat, LibISLError> {
820 let mat = self;
821 let isl_rs_ctx = mat.get_ctx();
822 let mut mat = mat;
823 mat.do_not_free_on_drop();
824 let mat = mat.ptr;
825 let isl_rs_result = unsafe { isl_mat_set_element_si(mat, row, col, v) };
826 let isl_rs_result = Mat { ptr: isl_rs_result,
827 should_free_on_drop: true };
828 let err = isl_rs_ctx.last_error();
829 if err != Error::None_ {
830 let err_msg = isl_rs_ctx.last_error_msg();
831 isl_rs_ctx.reset_error();
832 return Err(LibISLError::new(err, err_msg));
833 }
834 Ok(isl_rs_result)
835 }
836
837 pub fn set_element_val(self, row: i32, col: i32, v: Val) -> Result<Mat, LibISLError> {
839 let mat = self;
840 let isl_rs_ctx = mat.get_ctx();
841 let mut mat = mat;
842 mat.do_not_free_on_drop();
843 let mat = mat.ptr;
844 let mut v = v;
845 v.do_not_free_on_drop();
846 let v = v.ptr;
847 let isl_rs_result = unsafe { isl_mat_set_element_val(mat, row, col, v) };
848 let isl_rs_result = Mat { ptr: isl_rs_result,
849 should_free_on_drop: true };
850 let err = isl_rs_ctx.last_error();
851 if err != Error::None_ {
852 let err_msg = isl_rs_ctx.last_error_msg();
853 isl_rs_ctx.reset_error();
854 return Err(LibISLError::new(err, err_msg));
855 }
856 Ok(isl_rs_result)
857 }
858
859 pub fn swap_cols(self, i: u32, j: u32) -> Result<Mat, LibISLError> {
861 let mat = self;
862 let isl_rs_ctx = mat.get_ctx();
863 let mut mat = mat;
864 mat.do_not_free_on_drop();
865 let mat = mat.ptr;
866 let isl_rs_result = unsafe { isl_mat_swap_cols(mat, i, j) };
867 let isl_rs_result = Mat { ptr: isl_rs_result,
868 should_free_on_drop: true };
869 let err = isl_rs_ctx.last_error();
870 if err != Error::None_ {
871 let err_msg = isl_rs_ctx.last_error_msg();
872 isl_rs_ctx.reset_error();
873 return Err(LibISLError::new(err, err_msg));
874 }
875 Ok(isl_rs_result)
876 }
877
878 pub fn swap_rows(self, i: u32, j: u32) -> Result<Mat, LibISLError> {
880 let mat = self;
881 let isl_rs_ctx = mat.get_ctx();
882 let mut mat = mat;
883 mat.do_not_free_on_drop();
884 let mat = mat.ptr;
885 let isl_rs_result = unsafe { isl_mat_swap_rows(mat, i, j) };
886 let isl_rs_result = Mat { ptr: isl_rs_result,
887 should_free_on_drop: true };
888 let err = isl_rs_ctx.last_error();
889 if err != Error::None_ {
890 let err_msg = isl_rs_ctx.last_error_msg();
891 isl_rs_ctx.reset_error();
892 return Err(LibISLError::new(err, err_msg));
893 }
894 Ok(isl_rs_result)
895 }
896
897 pub fn transpose(self) -> Result<Mat, LibISLError> {
899 let mat = self;
900 let isl_rs_ctx = mat.get_ctx();
901 let mut mat = mat;
902 mat.do_not_free_on_drop();
903 let mat = mat.ptr;
904 let isl_rs_result = unsafe { isl_mat_transpose(mat) };
905 let isl_rs_result = Mat { ptr: isl_rs_result,
906 should_free_on_drop: true };
907 let err = isl_rs_ctx.last_error();
908 if err != Error::None_ {
909 let err_msg = isl_rs_ctx.last_error_msg();
910 isl_rs_ctx.reset_error();
911 return Err(LibISLError::new(err, err_msg));
912 }
913 Ok(isl_rs_result)
914 }
915
916 pub fn unimodular_complete(self, row: i32) -> Result<Mat, LibISLError> {
918 let M = self;
919 let isl_rs_ctx = M.get_ctx();
920 let mut M = M;
921 M.do_not_free_on_drop();
922 let M = M.ptr;
923 let isl_rs_result = unsafe { isl_mat_unimodular_complete(M, row) };
924 let isl_rs_result = Mat { ptr: isl_rs_result,
925 should_free_on_drop: true };
926 let err = isl_rs_ctx.last_error();
927 if err != Error::None_ {
928 let err_msg = isl_rs_ctx.last_error_msg();
929 isl_rs_ctx.reset_error();
930 return Err(LibISLError::new(err, err_msg));
931 }
932 Ok(isl_rs_result)
933 }
934
935 pub fn vec_concat(self, bot: Vec) -> Result<Mat, LibISLError> {
937 let top = self;
938 let isl_rs_ctx = top.get_ctx();
939 let mut top = top;
940 top.do_not_free_on_drop();
941 let top = top.ptr;
942 let mut bot = bot;
943 bot.do_not_free_on_drop();
944 let bot = bot.ptr;
945 let isl_rs_result = unsafe { isl_mat_vec_concat(top, bot) };
946 let isl_rs_result = Mat { ptr: isl_rs_result,
947 should_free_on_drop: true };
948 let err = isl_rs_ctx.last_error();
949 if err != Error::None_ {
950 let err_msg = isl_rs_ctx.last_error_msg();
951 isl_rs_ctx.reset_error();
952 return Err(LibISLError::new(err, err_msg));
953 }
954 Ok(isl_rs_result)
955 }
956
957 pub fn vec_inverse_product(self, vec: Vec) -> Result<Vec, LibISLError> {
959 let mat = self;
960 let isl_rs_ctx = mat.get_ctx();
961 let mut mat = mat;
962 mat.do_not_free_on_drop();
963 let mat = mat.ptr;
964 let mut vec = vec;
965 vec.do_not_free_on_drop();
966 let vec = vec.ptr;
967 let isl_rs_result = unsafe { isl_mat_vec_inverse_product(mat, vec) };
968 let isl_rs_result = Vec { ptr: isl_rs_result,
969 should_free_on_drop: true };
970 let err = isl_rs_ctx.last_error();
971 if err != Error::None_ {
972 let err_msg = isl_rs_ctx.last_error_msg();
973 isl_rs_ctx.reset_error();
974 return Err(LibISLError::new(err, err_msg));
975 }
976 Ok(isl_rs_result)
977 }
978
979 pub fn vec_product(self, vec: Vec) -> Result<Vec, LibISLError> {
981 let mat = self;
982 let isl_rs_ctx = mat.get_ctx();
983 let mut mat = mat;
984 mat.do_not_free_on_drop();
985 let mat = mat.ptr;
986 let mut vec = vec;
987 vec.do_not_free_on_drop();
988 let vec = vec.ptr;
989 let isl_rs_result = unsafe { isl_mat_vec_product(mat, vec) };
990 let isl_rs_result = Vec { ptr: isl_rs_result,
991 should_free_on_drop: true };
992 let err = isl_rs_ctx.last_error();
993 if err != Error::None_ {
994 let err_msg = isl_rs_ctx.last_error_msg();
995 isl_rs_ctx.reset_error();
996 return Err(LibISLError::new(err, err_msg));
997 }
998 Ok(isl_rs_result)
999 }
1000
1001 pub fn do_not_free_on_drop(&mut self) {
1003 self.should_free_on_drop = false;
1004 }
1005}
1006
1007impl Drop for Mat {
1008 fn drop(&mut self) {
1009 if self.should_free_on_drop {
1010 unsafe {
1011 isl_mat_free(self.ptr);
1012 }
1013 }
1014 }
1015}