Home | History | Annotate | Download | only in isl
      1 /*
      2  * Copyright 2008-2009 Katholieke Universiteit Leuven
      3  *
      4  * Use of this software is governed by the MIT license
      5  *
      6  * Written by Sven Verdoolaege, K.U.Leuven, Departement
      7  * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
      8  */
      9 
     10 #ifndef ISL_INT_H
     11 #define ISL_INT_H
     12 
     13 #include <isl/hash.h>
     14 #include <string.h>
     15 #include <gmp.h>
     16 #if defined(__cplusplus)
     17 #include <iostream>
     18 #endif
     19 
     20 #if defined(__cplusplus)
     21 extern "C" {
     22 #endif
     23 
     24 #ifndef mp_get_memory_functions
     25 void mp_get_memory_functions(
     26 		void *(**alloc_func_ptr) (size_t),
     27 		void *(**realloc_func_ptr) (void *, size_t, size_t),
     28 		void (**free_func_ptr) (void *, size_t));
     29 #endif
     30 
     31 /* isl_int is the basic integer type.  It currently always corresponds
     32  * to a gmp mpz_t, but in the future, different types such as long long
     33  * or cln::cl_I will be supported.
     34  */
     35 typedef mpz_t	isl_int;
     36 
     37 #define isl_int_init(i)		mpz_init(i)
     38 #define isl_int_clear(i)	mpz_clear(i)
     39 
     40 #define isl_int_set(r,i)	mpz_set(r,i)
     41 #define isl_int_set_gmp(r,i)	mpz_set(r,i)
     42 #define isl_int_set_si(r,i)	mpz_set_si(r,i)
     43 #define isl_int_set_ui(r,i)	mpz_set_ui(r,i)
     44 #define isl_int_get_gmp(i,g)	mpz_set(g,i)
     45 #define isl_int_get_si(r)	mpz_get_si(r)
     46 #define isl_int_get_ui(r)	mpz_get_ui(r)
     47 #define isl_int_get_d(r)	mpz_get_d(r)
     48 #define isl_int_get_str(r)	mpz_get_str(0, 10, r)
     49 typedef void (*isl_int_print_gmp_free_t)(void *, size_t);
     50 #define isl_int_free_str(s)					\
     51 	do {								\
     52 		isl_int_print_gmp_free_t gmp_free;			\
     53 		mp_get_memory_functions(NULL, NULL, &gmp_free);		\
     54 		(*gmp_free)(s, strlen(s) + 1);				\
     55 	} while (0)
     56 #define isl_int_abs(r,i)	mpz_abs(r,i)
     57 #define isl_int_neg(r,i)	mpz_neg(r,i)
     58 #define isl_int_swap(i,j)	mpz_swap(i,j)
     59 #define isl_int_swap_or_set(i,j)	mpz_swap(i,j)
     60 #define isl_int_add_ui(r,i,j)	mpz_add_ui(r,i,j)
     61 #define isl_int_sub_ui(r,i,j)	mpz_sub_ui(r,i,j)
     62 
     63 #define isl_int_add(r,i,j)	mpz_add(r,i,j)
     64 #define isl_int_sub(r,i,j)	mpz_sub(r,i,j)
     65 #define isl_int_mul(r,i,j)	mpz_mul(r,i,j)
     66 #define isl_int_mul_2exp(r,i,j)	mpz_mul_2exp(r,i,j)
     67 #define isl_int_mul_ui(r,i,j)	mpz_mul_ui(r,i,j)
     68 #define isl_int_pow_ui(r,i,j)	mpz_pow_ui(r,i,j)
     69 #define isl_int_addmul(r,i,j)	mpz_addmul(r,i,j)
     70 #define isl_int_submul(r,i,j)	mpz_submul(r,i,j)
     71 
     72 #define isl_int_gcd(r,i,j)	mpz_gcd(r,i,j)
     73 #define isl_int_lcm(r,i,j)	mpz_lcm(r,i,j)
     74 #define isl_int_divexact(r,i,j)	mpz_divexact(r,i,j)
     75 #define isl_int_divexact_ui(r,i,j)	mpz_divexact_ui(r,i,j)
     76 #define isl_int_tdiv_q(r,i,j)	mpz_tdiv_q(r,i,j)
     77 #define isl_int_cdiv_q(r,i,j)	mpz_cdiv_q(r,i,j)
     78 #define isl_int_fdiv_q(r,i,j)	mpz_fdiv_q(r,i,j)
     79 #define isl_int_fdiv_r(r,i,j)	mpz_fdiv_r(r,i,j)
     80 #define isl_int_fdiv_q_ui(r,i,j)	mpz_fdiv_q_ui(r,i,j)
     81 
     82 #define isl_int_read(r,s)	mpz_set_str(r,s,10)
     83 #define isl_int_print(out,i,width)					\
     84 	do {								\
     85 		char *s;						\
     86 		s = mpz_get_str(0, 10, i);				\
     87 		fprintf(out, "%*s", width, s);				\
     88 		isl_int_free_str(s);                                        \
     89 	} while (0)
     90 
     91 #define isl_int_sgn(i)		mpz_sgn(i)
     92 #define isl_int_cmp(i,j)	mpz_cmp(i,j)
     93 #define isl_int_cmp_si(i,si)	mpz_cmp_si(i,si)
     94 #define isl_int_eq(i,j)		(mpz_cmp(i,j) == 0)
     95 #define isl_int_ne(i,j)		(mpz_cmp(i,j) != 0)
     96 #define isl_int_lt(i,j)		(mpz_cmp(i,j) < 0)
     97 #define isl_int_le(i,j)		(mpz_cmp(i,j) <= 0)
     98 #define isl_int_gt(i,j)		(mpz_cmp(i,j) > 0)
     99 #define isl_int_ge(i,j)		(mpz_cmp(i,j) >= 0)
    100 #define isl_int_abs_eq(i,j)	(mpz_cmpabs(i,j) == 0)
    101 #define isl_int_abs_ne(i,j)	(mpz_cmpabs(i,j) != 0)
    102 #define isl_int_abs_lt(i,j)	(mpz_cmpabs(i,j) < 0)
    103 #define isl_int_abs_gt(i,j)	(mpz_cmpabs(i,j) > 0)
    104 #define isl_int_abs_ge(i,j)	(mpz_cmpabs(i,j) >= 0)
    105 
    106 
    107 #define isl_int_is_zero(i)	(isl_int_sgn(i) == 0)
    108 #define isl_int_is_one(i)	(isl_int_cmp_si(i,1) == 0)
    109 #define isl_int_is_negone(i)	(isl_int_cmp_si(i,-1) == 0)
    110 #define isl_int_is_pos(i)	(isl_int_sgn(i) > 0)
    111 #define isl_int_is_neg(i)	(isl_int_sgn(i) < 0)
    112 #define isl_int_is_nonpos(i)	(isl_int_sgn(i) <= 0)
    113 #define isl_int_is_nonneg(i)	(isl_int_sgn(i) >= 0)
    114 #define isl_int_is_divisible_by(i,j)	mpz_divisible_p(i,j)
    115 
    116 uint32_t isl_gmp_hash(mpz_t v, uint32_t hash);
    117 #define isl_int_hash(v,h)	isl_gmp_hash(v,h)
    118 
    119 #if defined(__cplusplus)
    120 }
    121 #endif
    122 
    123 #if defined(__cplusplus)
    124 extern "C" { typedef void (*isl_gmp_free_t)(void *, size_t); }
    125 
    126 static inline std::ostream &operator<<(std::ostream &os, isl_int i)
    127 {
    128 	char *s;
    129 	s = mpz_get_str(0, 10, i);
    130 	os << s;
    131 	isl_int_free_str(s);
    132 	return os;
    133 }
    134 #endif
    135 
    136 #endif
    137