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 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
125 }
126 Ok(isl_rs_result)
127 }
128
129 pub fn add_zero_cols(self, n: u32) -> Result<Mat, LibISLError> {
131 let mat = self;
132 let isl_rs_ctx = mat.get_ctx();
133 let mut mat = mat;
134 mat.do_not_free_on_drop();
135 let mat = mat.ptr;
136 let isl_rs_result = unsafe { isl_mat_add_zero_cols(mat, n) };
137 let isl_rs_result = Mat { ptr: isl_rs_result,
138 should_free_on_drop: true };
139 let err = isl_rs_ctx.last_error();
140 if err != Error::None_ {
141 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
142 }
143 Ok(isl_rs_result)
144 }
145
146 pub fn add_zero_rows(self, n: u32) -> Result<Mat, LibISLError> {
148 let mat = self;
149 let isl_rs_ctx = mat.get_ctx();
150 let mut mat = mat;
151 mat.do_not_free_on_drop();
152 let mat = mat.ptr;
153 let isl_rs_result = unsafe { isl_mat_add_zero_rows(mat, n) };
154 let isl_rs_result = Mat { ptr: isl_rs_result,
155 should_free_on_drop: true };
156 let err = isl_rs_ctx.last_error();
157 if err != Error::None_ {
158 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
159 }
160 Ok(isl_rs_result)
161 }
162
163 pub fn aff_direct_sum(self, right: Mat) -> Result<Mat, LibISLError> {
165 let left = self;
166 let isl_rs_ctx = left.get_ctx();
167 let mut left = left;
168 left.do_not_free_on_drop();
169 let left = left.ptr;
170 let mut right = right;
171 right.do_not_free_on_drop();
172 let right = right.ptr;
173 let isl_rs_result = unsafe { isl_mat_aff_direct_sum(left, right) };
174 let isl_rs_result = Mat { ptr: isl_rs_result,
175 should_free_on_drop: true };
176 let err = isl_rs_ctx.last_error();
177 if err != Error::None_ {
178 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
179 }
180 Ok(isl_rs_result)
181 }
182
183 pub fn alloc(ctx: &Context, n_row: u32, n_col: u32) -> Result<Mat, LibISLError> {
185 let isl_rs_ctx = Context { ptr: ctx.ptr,
186 should_free_on_drop: false };
187 let ctx = ctx.ptr;
188 let isl_rs_result = unsafe { isl_mat_alloc(ctx, n_row, n_col) };
189 let isl_rs_result = Mat { ptr: isl_rs_result,
190 should_free_on_drop: true };
191 let err = isl_rs_ctx.last_error();
192 if err != Error::None_ {
193 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
194 }
195 Ok(isl_rs_result)
196 }
197
198 pub fn col_add(&self, dst_col: i32, src_col: i32) -> Result<(), LibISLError> {
200 let mat = self;
201 let isl_rs_ctx = mat.get_ctx();
202 let mat = mat.ptr;
203 let isl_rs_result = unsafe { isl_mat_col_add(mat, dst_col, src_col) };
204 let err = isl_rs_ctx.last_error();
205 if err != Error::None_ {
206 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
207 }
208 Ok(isl_rs_result)
209 }
210
211 pub fn cols(&self) -> Result<i32, LibISLError> {
213 let mat = self;
214 let isl_rs_ctx = mat.get_ctx();
215 let mat = mat.ptr;
216 let isl_rs_result = unsafe { isl_mat_cols(mat) };
217 let err = isl_rs_ctx.last_error();
218 if err != Error::None_ {
219 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
220 }
221 Ok(isl_rs_result)
222 }
223
224 pub fn concat(self, bot: Mat) -> Result<Mat, LibISLError> {
226 let top = self;
227 let isl_rs_ctx = top.get_ctx();
228 let mut top = top;
229 top.do_not_free_on_drop();
230 let top = top.ptr;
231 let mut bot = bot;
232 bot.do_not_free_on_drop();
233 let bot = bot.ptr;
234 let isl_rs_result = unsafe { isl_mat_concat(top, bot) };
235 let isl_rs_result = Mat { ptr: isl_rs_result,
236 should_free_on_drop: true };
237 let err = isl_rs_ctx.last_error();
238 if err != Error::None_ {
239 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
240 }
241 Ok(isl_rs_result)
242 }
243
244 pub fn copy(&self) -> Result<Mat, LibISLError> {
246 let mat = self;
247 let isl_rs_ctx = mat.get_ctx();
248 let mat = mat.ptr;
249 let isl_rs_result = unsafe { isl_mat_copy(mat) };
250 let isl_rs_result = Mat { ptr: isl_rs_result,
251 should_free_on_drop: true };
252 let err = isl_rs_ctx.last_error();
253 if err != Error::None_ {
254 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
255 }
256 Ok(isl_rs_result)
257 }
258
259 pub fn diagonal(self, mat2: Mat) -> Result<Mat, LibISLError> {
261 let mat1 = self;
262 let isl_rs_ctx = mat1.get_ctx();
263 let mut mat1 = mat1;
264 mat1.do_not_free_on_drop();
265 let mat1 = mat1.ptr;
266 let mut mat2 = mat2;
267 mat2.do_not_free_on_drop();
268 let mat2 = mat2.ptr;
269 let isl_rs_result = unsafe { isl_mat_diagonal(mat1, mat2) };
270 let isl_rs_result = Mat { ptr: isl_rs_result,
271 should_free_on_drop: true };
272 let err = isl_rs_ctx.last_error();
273 if err != Error::None_ {
274 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
275 }
276 Ok(isl_rs_result)
277 }
278
279 pub fn drop_cols(self, col: u32, n: u32) -> Result<Mat, LibISLError> {
281 let mat = self;
282 let isl_rs_ctx = mat.get_ctx();
283 let mut mat = mat;
284 mat.do_not_free_on_drop();
285 let mat = mat.ptr;
286 let isl_rs_result = unsafe { isl_mat_drop_cols(mat, col, n) };
287 let isl_rs_result = Mat { ptr: isl_rs_result,
288 should_free_on_drop: true };
289 let err = isl_rs_ctx.last_error();
290 if err != Error::None_ {
291 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
292 }
293 Ok(isl_rs_result)
294 }
295
296 pub fn drop_rows(self, row: u32, n: u32) -> Result<Mat, LibISLError> {
298 let mat = self;
299 let isl_rs_ctx = mat.get_ctx();
300 let mut mat = mat;
301 mat.do_not_free_on_drop();
302 let mat = mat.ptr;
303 let isl_rs_result = unsafe { isl_mat_drop_rows(mat, row, n) };
304 let isl_rs_result = Mat { ptr: isl_rs_result,
305 should_free_on_drop: true };
306 let err = isl_rs_ctx.last_error();
307 if err != Error::None_ {
308 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
309 }
310 Ok(isl_rs_result)
311 }
312
313 pub fn dump(&self) -> Result<(), LibISLError> {
315 let mat = self;
316 let isl_rs_ctx = mat.get_ctx();
317 let mat = mat.ptr;
318 let isl_rs_result = unsafe { isl_mat_dump(mat) };
319 let err = isl_rs_ctx.last_error();
320 if err != Error::None_ {
321 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
322 }
323 Ok(isl_rs_result)
324 }
325
326 pub fn extend(self, n_row: u32, n_col: u32) -> Result<Mat, LibISLError> {
328 let mat = self;
329 let isl_rs_ctx = mat.get_ctx();
330 let mut mat = mat;
331 mat.do_not_free_on_drop();
332 let mat = mat.ptr;
333 let isl_rs_result = unsafe { isl_mat_extend(mat, n_row, n_col) };
334 let isl_rs_result = Mat { ptr: isl_rs_result,
335 should_free_on_drop: true };
336 let err = isl_rs_ctx.last_error();
337 if err != Error::None_ {
338 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
339 }
340 Ok(isl_rs_result)
341 }
342
343 pub fn free(self) -> Result<Mat, LibISLError> {
345 let mat = self;
346 let isl_rs_ctx = mat.get_ctx();
347 let mut mat = mat;
348 mat.do_not_free_on_drop();
349 let mat = mat.ptr;
350 let isl_rs_result = unsafe { isl_mat_free(mat) };
351 let isl_rs_result = Mat { ptr: isl_rs_result,
352 should_free_on_drop: true };
353 let err = isl_rs_ctx.last_error();
354 if err != Error::None_ {
355 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
356 }
357 Ok(isl_rs_result)
358 }
359
360 pub fn from_row_vec(vec: Vec) -> Result<Mat, LibISLError> {
362 let isl_rs_ctx = vec.get_ctx();
363 let mut vec = vec;
364 vec.do_not_free_on_drop();
365 let vec = vec.ptr;
366 let isl_rs_result = unsafe { isl_mat_from_row_vec(vec) };
367 let isl_rs_result = Mat { ptr: isl_rs_result,
368 should_free_on_drop: true };
369 let err = isl_rs_ctx.last_error();
370 if err != Error::None_ {
371 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
372 }
373 Ok(isl_rs_result)
374 }
375
376 pub fn get_ctx(&self) -> Context {
378 let mat = self;
379 let mat = mat.ptr;
380 let isl_rs_result = unsafe { isl_mat_get_ctx(mat) };
381 let isl_rs_result = Context { ptr: isl_rs_result,
382 should_free_on_drop: false };
383 isl_rs_result
384 }
385
386 pub fn get_element_val(&self, row: i32, col: i32) -> Result<Val, LibISLError> {
388 let mat = self;
389 let isl_rs_ctx = mat.get_ctx();
390 let mat = mat.ptr;
391 let isl_rs_result = unsafe { isl_mat_get_element_val(mat, row, col) };
392 let isl_rs_result = Val { ptr: isl_rs_result,
393 should_free_on_drop: true };
394 let err = isl_rs_ctx.last_error();
395 if err != Error::None_ {
396 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
397 }
398 Ok(isl_rs_result)
399 }
400
401 pub fn has_linearly_independent_rows(&self, mat2: &Mat) -> Result<bool, LibISLError> {
403 let mat1 = self;
404 let isl_rs_ctx = mat1.get_ctx();
405 let mat1 = mat1.ptr;
406 let mat2 = mat2.ptr;
407 let isl_rs_result = unsafe { isl_mat_has_linearly_independent_rows(mat1, mat2) };
408 let isl_rs_result = match isl_rs_result {
409 0 => false,
410 1 => true,
411 _ => panic!("Got isl_bool = -1"),
412 };
413 let err = isl_rs_ctx.last_error();
414 if err != Error::None_ {
415 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
416 }
417 Ok(isl_rs_result)
418 }
419
420 pub fn identity(ctx: &Context, n_row: u32) -> Result<Mat, LibISLError> {
422 let isl_rs_ctx = Context { ptr: ctx.ptr,
423 should_free_on_drop: false };
424 let ctx = ctx.ptr;
425 let isl_rs_result = unsafe { isl_mat_identity(ctx, n_row) };
426 let isl_rs_result = Mat { ptr: isl_rs_result,
427 should_free_on_drop: true };
428 let err = isl_rs_ctx.last_error();
429 if err != Error::None_ {
430 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
431 }
432 Ok(isl_rs_result)
433 }
434
435 pub fn initial_non_zero_cols(&self) -> Result<i32, LibISLError> {
437 let mat = self;
438 let isl_rs_ctx = mat.get_ctx();
439 let mat = mat.ptr;
440 let isl_rs_result = unsafe { isl_mat_initial_non_zero_cols(mat) };
441 let err = isl_rs_ctx.last_error();
442 if err != Error::None_ {
443 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
444 }
445 Ok(isl_rs_result)
446 }
447
448 pub fn insert_cols(self, col: u32, n: u32) -> Result<Mat, LibISLError> {
450 let mat = self;
451 let isl_rs_ctx = mat.get_ctx();
452 let mut mat = mat;
453 mat.do_not_free_on_drop();
454 let mat = mat.ptr;
455 let isl_rs_result = unsafe { isl_mat_insert_cols(mat, col, n) };
456 let isl_rs_result = Mat { ptr: isl_rs_result,
457 should_free_on_drop: true };
458 let err = isl_rs_ctx.last_error();
459 if err != Error::None_ {
460 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
461 }
462 Ok(isl_rs_result)
463 }
464
465 pub fn insert_rows(self, row: u32, n: u32) -> Result<Mat, LibISLError> {
467 let mat = self;
468 let isl_rs_ctx = mat.get_ctx();
469 let mut mat = mat;
470 mat.do_not_free_on_drop();
471 let mat = mat.ptr;
472 let isl_rs_result = unsafe { isl_mat_insert_rows(mat, row, n) };
473 let isl_rs_result = Mat { ptr: isl_rs_result,
474 should_free_on_drop: true };
475 let err = isl_rs_ctx.last_error();
476 if err != Error::None_ {
477 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
478 }
479 Ok(isl_rs_result)
480 }
481
482 pub fn insert_zero_cols(self, first: u32, n: u32) -> Result<Mat, LibISLError> {
484 let mat = self;
485 let isl_rs_ctx = mat.get_ctx();
486 let mut mat = mat;
487 mat.do_not_free_on_drop();
488 let mat = mat.ptr;
489 let isl_rs_result = unsafe { isl_mat_insert_zero_cols(mat, first, n) };
490 let isl_rs_result = Mat { ptr: isl_rs_result,
491 should_free_on_drop: true };
492 let err = isl_rs_ctx.last_error();
493 if err != Error::None_ {
494 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
495 }
496 Ok(isl_rs_result)
497 }
498
499 pub fn insert_zero_rows(self, row: u32, n: u32) -> Result<Mat, LibISLError> {
501 let mat = self;
502 let isl_rs_ctx = mat.get_ctx();
503 let mut mat = mat;
504 mat.do_not_free_on_drop();
505 let mat = mat.ptr;
506 let isl_rs_result = unsafe { isl_mat_insert_zero_rows(mat, row, n) };
507 let isl_rs_result = Mat { ptr: isl_rs_result,
508 should_free_on_drop: true };
509 let err = isl_rs_ctx.last_error();
510 if err != Error::None_ {
511 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
512 }
513 Ok(isl_rs_result)
514 }
515
516 pub fn inverse_product(self, right: Mat) -> Result<Mat, LibISLError> {
518 let left = self;
519 let isl_rs_ctx = left.get_ctx();
520 let mut left = left;
521 left.do_not_free_on_drop();
522 let left = left.ptr;
523 let mut right = right;
524 right.do_not_free_on_drop();
525 let right = right.ptr;
526 let isl_rs_result = unsafe { isl_mat_inverse_product(left, right) };
527 let isl_rs_result = Mat { ptr: isl_rs_result,
528 should_free_on_drop: true };
529 let err = isl_rs_ctx.last_error();
530 if err != Error::None_ {
531 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
532 }
533 Ok(isl_rs_result)
534 }
535
536 pub fn is_equal(&self, mat2: &Mat) -> Result<bool, LibISLError> {
538 let mat1 = self;
539 let isl_rs_ctx = mat1.get_ctx();
540 let mat1 = mat1.ptr;
541 let mat2 = mat2.ptr;
542 let isl_rs_result = unsafe { isl_mat_is_equal(mat1, mat2) };
543 let isl_rs_result = match isl_rs_result {
544 0 => false,
545 1 => true,
546 _ => panic!("Got isl_bool = -1"),
547 };
548 let err = isl_rs_ctx.last_error();
549 if err != Error::None_ {
550 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
551 }
552 Ok(isl_rs_result)
553 }
554
555 pub fn lin_to_aff(self) -> Result<Mat, LibISLError> {
557 let mat = self;
558 let isl_rs_ctx = mat.get_ctx();
559 let mut mat = mat;
560 mat.do_not_free_on_drop();
561 let mat = mat.ptr;
562 let isl_rs_result = unsafe { isl_mat_lin_to_aff(mat) };
563 let isl_rs_result = Mat { ptr: isl_rs_result,
564 should_free_on_drop: true };
565 let err = isl_rs_ctx.last_error();
566 if err != Error::None_ {
567 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
568 }
569 Ok(isl_rs_result)
570 }
571
572 pub fn move_cols(self, dst_col: u32, src_col: u32, n: u32) -> Result<Mat, LibISLError> {
574 let mat = self;
575 let isl_rs_ctx = mat.get_ctx();
576 let mut mat = mat;
577 mat.do_not_free_on_drop();
578 let mat = mat.ptr;
579 let isl_rs_result = unsafe { isl_mat_move_cols(mat, dst_col, src_col, n) };
580 let isl_rs_result = Mat { ptr: isl_rs_result,
581 should_free_on_drop: true };
582 let err = isl_rs_ctx.last_error();
583 if err != Error::None_ {
584 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
585 }
586 Ok(isl_rs_result)
587 }
588
589 pub fn normalize(self) -> Result<Mat, LibISLError> {
591 let mat = self;
592 let isl_rs_ctx = mat.get_ctx();
593 let mut mat = mat;
594 mat.do_not_free_on_drop();
595 let mat = mat.ptr;
596 let isl_rs_result = unsafe { isl_mat_normalize(mat) };
597 let isl_rs_result = Mat { ptr: isl_rs_result,
598 should_free_on_drop: true };
599 let err = isl_rs_ctx.last_error();
600 if err != Error::None_ {
601 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
602 }
603 Ok(isl_rs_result)
604 }
605
606 pub fn normalize_row(self, row: i32) -> Result<Mat, LibISLError> {
608 let mat = self;
609 let isl_rs_ctx = mat.get_ctx();
610 let mut mat = mat;
611 mat.do_not_free_on_drop();
612 let mat = mat.ptr;
613 let isl_rs_result = unsafe { isl_mat_normalize_row(mat, row) };
614 let isl_rs_result = Mat { ptr: isl_rs_result,
615 should_free_on_drop: true };
616 let err = isl_rs_ctx.last_error();
617 if err != Error::None_ {
618 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
619 }
620 Ok(isl_rs_result)
621 }
622
623 pub fn product(self, right: Mat) -> Result<Mat, LibISLError> {
625 let left = self;
626 let isl_rs_ctx = left.get_ctx();
627 let mut left = left;
628 left.do_not_free_on_drop();
629 let left = left.ptr;
630 let mut right = right;
631 right.do_not_free_on_drop();
632 let right = right.ptr;
633 let isl_rs_result = unsafe { isl_mat_product(left, right) };
634 let isl_rs_result = Mat { ptr: isl_rs_result,
635 should_free_on_drop: true };
636 let err = isl_rs_ctx.last_error();
637 if err != Error::None_ {
638 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
639 }
640 Ok(isl_rs_result)
641 }
642
643 pub fn rank(&self) -> Result<i32, LibISLError> {
645 let mat = self;
646 let isl_rs_ctx = mat.get_ctx();
647 let mat = mat.ptr;
648 let isl_rs_result = unsafe { isl_mat_rank(mat) };
649 let err = isl_rs_ctx.last_error();
650 if err != Error::None_ {
651 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
652 }
653 Ok(isl_rs_result)
654 }
655
656 pub fn right_inverse(self) -> Result<Mat, LibISLError> {
658 let mat = self;
659 let isl_rs_ctx = mat.get_ctx();
660 let mut mat = mat;
661 mat.do_not_free_on_drop();
662 let mat = mat.ptr;
663 let isl_rs_result = unsafe { isl_mat_right_inverse(mat) };
664 let isl_rs_result = Mat { ptr: isl_rs_result,
665 should_free_on_drop: true };
666 let err = isl_rs_ctx.last_error();
667 if err != Error::None_ {
668 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
669 }
670 Ok(isl_rs_result)
671 }
672
673 pub fn right_kernel(self) -> Result<Mat, LibISLError> {
675 let mat = self;
676 let isl_rs_ctx = mat.get_ctx();
677 let mut mat = mat;
678 mat.do_not_free_on_drop();
679 let mat = mat.ptr;
680 let isl_rs_result = unsafe { isl_mat_right_kernel(mat) };
681 let isl_rs_result = Mat { ptr: isl_rs_result,
682 should_free_on_drop: true };
683 let err = isl_rs_ctx.last_error();
684 if err != Error::None_ {
685 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
686 }
687 Ok(isl_rs_result)
688 }
689
690 pub fn row_basis(self) -> Result<Mat, LibISLError> {
692 let mat = self;
693 let isl_rs_ctx = mat.get_ctx();
694 let mut mat = mat;
695 mat.do_not_free_on_drop();
696 let mat = mat.ptr;
697 let isl_rs_result = unsafe { isl_mat_row_basis(mat) };
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 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
703 }
704 Ok(isl_rs_result)
705 }
706
707 pub fn row_basis_extension(self, mat2: Mat) -> Result<Mat, LibISLError> {
709 let mat1 = self;
710 let isl_rs_ctx = mat1.get_ctx();
711 let mut mat1 = mat1;
712 mat1.do_not_free_on_drop();
713 let mat1 = mat1.ptr;
714 let mut mat2 = mat2;
715 mat2.do_not_free_on_drop();
716 let mat2 = mat2.ptr;
717 let isl_rs_result = unsafe { isl_mat_row_basis_extension(mat1, mat2) };
718 let isl_rs_result = Mat { ptr: isl_rs_result,
719 should_free_on_drop: true };
720 let err = isl_rs_ctx.last_error();
721 if err != Error::None_ {
722 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
723 }
724 Ok(isl_rs_result)
725 }
726
727 pub fn rows(&self) -> Result<i32, LibISLError> {
729 let mat = self;
730 let isl_rs_ctx = mat.get_ctx();
731 let mat = mat.ptr;
732 let isl_rs_result = unsafe { isl_mat_rows(mat) };
733 let err = isl_rs_ctx.last_error();
734 if err != Error::None_ {
735 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
736 }
737 Ok(isl_rs_result)
738 }
739
740 pub fn set_element_si(self, row: i32, col: i32, v: i32) -> Result<Mat, LibISLError> {
742 let mat = self;
743 let isl_rs_ctx = mat.get_ctx();
744 let mut mat = mat;
745 mat.do_not_free_on_drop();
746 let mat = mat.ptr;
747 let isl_rs_result = unsafe { isl_mat_set_element_si(mat, row, col, v) };
748 let isl_rs_result = Mat { ptr: isl_rs_result,
749 should_free_on_drop: true };
750 let err = isl_rs_ctx.last_error();
751 if err != Error::None_ {
752 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
753 }
754 Ok(isl_rs_result)
755 }
756
757 pub fn set_element_val(self, row: i32, col: i32, v: Val) -> Result<Mat, LibISLError> {
759 let mat = self;
760 let isl_rs_ctx = mat.get_ctx();
761 let mut mat = mat;
762 mat.do_not_free_on_drop();
763 let mat = mat.ptr;
764 let mut v = v;
765 v.do_not_free_on_drop();
766 let v = v.ptr;
767 let isl_rs_result = unsafe { isl_mat_set_element_val(mat, row, col, v) };
768 let isl_rs_result = Mat { ptr: isl_rs_result,
769 should_free_on_drop: true };
770 let err = isl_rs_ctx.last_error();
771 if err != Error::None_ {
772 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
773 }
774 Ok(isl_rs_result)
775 }
776
777 pub fn swap_cols(self, i: u32, j: u32) -> Result<Mat, LibISLError> {
779 let mat = self;
780 let isl_rs_ctx = mat.get_ctx();
781 let mut mat = mat;
782 mat.do_not_free_on_drop();
783 let mat = mat.ptr;
784 let isl_rs_result = unsafe { isl_mat_swap_cols(mat, i, j) };
785 let isl_rs_result = Mat { ptr: isl_rs_result,
786 should_free_on_drop: true };
787 let err = isl_rs_ctx.last_error();
788 if err != Error::None_ {
789 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
790 }
791 Ok(isl_rs_result)
792 }
793
794 pub fn swap_rows(self, i: u32, j: u32) -> Result<Mat, LibISLError> {
796 let mat = self;
797 let isl_rs_ctx = mat.get_ctx();
798 let mut mat = mat;
799 mat.do_not_free_on_drop();
800 let mat = mat.ptr;
801 let isl_rs_result = unsafe { isl_mat_swap_rows(mat, i, j) };
802 let isl_rs_result = Mat { ptr: isl_rs_result,
803 should_free_on_drop: true };
804 let err = isl_rs_ctx.last_error();
805 if err != Error::None_ {
806 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
807 }
808 Ok(isl_rs_result)
809 }
810
811 pub fn transpose(self) -> Result<Mat, LibISLError> {
813 let mat = self;
814 let isl_rs_ctx = mat.get_ctx();
815 let mut mat = mat;
816 mat.do_not_free_on_drop();
817 let mat = mat.ptr;
818 let isl_rs_result = unsafe { isl_mat_transpose(mat) };
819 let isl_rs_result = Mat { ptr: isl_rs_result,
820 should_free_on_drop: true };
821 let err = isl_rs_ctx.last_error();
822 if err != Error::None_ {
823 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
824 }
825 Ok(isl_rs_result)
826 }
827
828 pub fn unimodular_complete(self, row: i32) -> Result<Mat, LibISLError> {
830 let M = self;
831 let isl_rs_ctx = M.get_ctx();
832 let mut M = M;
833 M.do_not_free_on_drop();
834 let M = M.ptr;
835 let isl_rs_result = unsafe { isl_mat_unimodular_complete(M, row) };
836 let isl_rs_result = Mat { ptr: isl_rs_result,
837 should_free_on_drop: true };
838 let err = isl_rs_ctx.last_error();
839 if err != Error::None_ {
840 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
841 }
842 Ok(isl_rs_result)
843 }
844
845 pub fn vec_concat(self, bot: Vec) -> Result<Mat, LibISLError> {
847 let top = self;
848 let isl_rs_ctx = top.get_ctx();
849 let mut top = top;
850 top.do_not_free_on_drop();
851 let top = top.ptr;
852 let mut bot = bot;
853 bot.do_not_free_on_drop();
854 let bot = bot.ptr;
855 let isl_rs_result = unsafe { isl_mat_vec_concat(top, bot) };
856 let isl_rs_result = Mat { ptr: isl_rs_result,
857 should_free_on_drop: true };
858 let err = isl_rs_ctx.last_error();
859 if err != Error::None_ {
860 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
861 }
862 Ok(isl_rs_result)
863 }
864
865 pub fn vec_inverse_product(self, vec: Vec) -> Result<Vec, LibISLError> {
867 let mat = self;
868 let isl_rs_ctx = mat.get_ctx();
869 let mut mat = mat;
870 mat.do_not_free_on_drop();
871 let mat = mat.ptr;
872 let mut vec = vec;
873 vec.do_not_free_on_drop();
874 let vec = vec.ptr;
875 let isl_rs_result = unsafe { isl_mat_vec_inverse_product(mat, vec) };
876 let isl_rs_result = Vec { ptr: isl_rs_result,
877 should_free_on_drop: true };
878 let err = isl_rs_ctx.last_error();
879 if err != Error::None_ {
880 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
881 }
882 Ok(isl_rs_result)
883 }
884
885 pub fn vec_product(self, vec: Vec) -> Result<Vec, LibISLError> {
887 let mat = self;
888 let isl_rs_ctx = mat.get_ctx();
889 let mut mat = mat;
890 mat.do_not_free_on_drop();
891 let mat = mat.ptr;
892 let mut vec = vec;
893 vec.do_not_free_on_drop();
894 let vec = vec.ptr;
895 let isl_rs_result = unsafe { isl_mat_vec_product(mat, vec) };
896 let isl_rs_result = Vec { ptr: isl_rs_result,
897 should_free_on_drop: true };
898 let err = isl_rs_ctx.last_error();
899 if err != Error::None_ {
900 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
901 }
902 Ok(isl_rs_result)
903 }
904
905 pub fn do_not_free_on_drop(&mut self) {
907 self.should_free_on_drop = false;
908 }
909}
910
911impl Drop for Mat {
912 fn drop(&mut self) {
913 if self.should_free_on_drop {
914 unsafe {
915 isl_mat_free(self.ptr);
916 }
917 }
918 }
919}