Blame isl-0.14/imath/gmp_compat.h

Packit fb9d21
/*
Packit fb9d21
  Name:     gmp_compat.h
Packit fb9d21
  Purpose:  Provide GMP compatiable routines for imath library
Packit fb9d21
  Author:   David Peixotto
Packit fb9d21
Packit fb9d21
  Copyright (c) 2012 Qualcomm Innovation Center, Inc. All rights reserved.
Packit fb9d21
Packit fb9d21
  Permission is hereby granted, free of charge, to any person obtaining a copy
Packit fb9d21
  of this software and associated documentation files (the "Software"), to deal
Packit fb9d21
  in the Software without restriction, including without limitation the rights
Packit fb9d21
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Packit fb9d21
  copies of the Software, and to permit persons to whom the Software is
Packit fb9d21
  furnished to do so, subject to the following conditions:
Packit fb9d21
Packit fb9d21
  The above copyright notice and this permission notice shall be included in
Packit fb9d21
  all copies or substantial portions of the Software.
Packit fb9d21
Packit fb9d21
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit fb9d21
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit fb9d21
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit fb9d21
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Packit fb9d21
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Packit fb9d21
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Packit fb9d21
  SOFTWARE.
Packit fb9d21
 */
Packit fb9d21
Packit fb9d21
#ifndef IMATH_GMP_COMPAT_H_
Packit fb9d21
#define IMATH_GMP_COMPAT_H_
Packit fb9d21
#include "imath.h"
Packit fb9d21
#include "imrat.h"
Packit fb9d21
#include <stddef.h>
Packit fb9d21
Packit fb9d21
#define GMPZAPI(fun) impz_ ## fun
Packit fb9d21
#define GMPQAPI(fun) impq_ ## fun
Packit fb9d21
Packit fb9d21
#ifdef __cplusplus
Packit fb9d21
extern "C" {
Packit fb9d21
#endif
Packit fb9d21
/*************************************************************************
Packit fb9d21
 *
Packit fb9d21
 * Functions with direct translations
Packit fb9d21
 *
Packit fb9d21
 *************************************************************************/
Packit fb9d21
/* gmp: mpq_clear */
Packit fb9d21
void GMPQAPI(clear)(mp_rat x);
Packit fb9d21
Packit fb9d21
/* gmp: mpq_cmp */
Packit fb9d21
int GMPQAPI(cmp)(mp_rat op1, mp_rat op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpq_init */
Packit fb9d21
void GMPQAPI(init)(mp_rat x);
Packit fb9d21
Packit fb9d21
/* gmp: mpq_mul */
Packit fb9d21
void GMPQAPI(mul)(mp_rat product, mp_rat multiplier, mp_rat multiplicand);
Packit fb9d21
Packit fb9d21
/* gmp: mpq_set */
Packit fb9d21
void GMPQAPI(set)(mp_rat rop, mp_rat op);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_abs */
Packit fb9d21
void GMPZAPI(abs)(mp_int rop, mp_int op);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_add */
Packit fb9d21
void GMPZAPI(add)(mp_int rop, mp_int op1, mp_int op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_clear */
Packit fb9d21
void GMPZAPI(clear)(mp_int x);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_cmp_si */
Packit fb9d21
int GMPZAPI(cmp_si)(mp_int op1, long op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_cmpabs */
Packit fb9d21
int GMPZAPI(cmpabs)(mp_int op1, mp_int op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_cmp */
Packit fb9d21
int GMPZAPI(cmp)(mp_int op1, mp_int op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_init */
Packit fb9d21
void GMPZAPI(init)(mp_int x);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_mul */
Packit fb9d21
void GMPZAPI(mul)(mp_int rop, mp_int op1, mp_int op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_neg */
Packit fb9d21
void GMPZAPI(neg)(mp_int rop, mp_int op);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_set_si */
Packit fb9d21
void GMPZAPI(set_si)(mp_int rop, long op);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_set */
Packit fb9d21
void GMPZAPI(set)(mp_int rop, mp_int op);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_sub */
Packit fb9d21
void GMPZAPI(sub)(mp_int rop, mp_int op1, mp_int op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_swap */
Packit fb9d21
void GMPZAPI(swap)(mp_int rop1, mp_int rop2);
Packit fb9d21
Packit fb9d21
/* gmp: mpq_sgn */
Packit fb9d21
int GMPQAPI(sgn)(mp_rat op);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_sgn */
Packit fb9d21
int GMPZAPI(sgn)(mp_int op);
Packit fb9d21
Packit fb9d21
/* gmp: mpq_set_ui */
Packit fb9d21
void GMPQAPI(set_ui)(mp_rat rop, unsigned long op1, unsigned long op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_set_ui */
Packit fb9d21
void GMPZAPI(set_ui)(mp_int rop, unsigned long op);
Packit fb9d21
Packit fb9d21
/* gmp: mpq_den_ref */
Packit fb9d21
mp_int GMPQAPI(denref)(mp_rat op);
Packit fb9d21
Packit fb9d21
/* gmp: mpq_num_ref */
Packit fb9d21
mp_int GMPQAPI(numref)(mp_rat op);
Packit fb9d21
Packit fb9d21
/* gmp: mpq_canonicalize */
Packit fb9d21
void GMPQAPI(canonicalize)(mp_rat op);
Packit fb9d21
Packit fb9d21
/*************************************************************************
Packit fb9d21
 *
Packit fb9d21
 * Functions that can be implemented as a combination of imath functions
Packit fb9d21
 *
Packit fb9d21
 *************************************************************************/
Packit fb9d21
/* gmp: mpz_addmul */
Packit fb9d21
void GMPZAPI(addmul)(mp_int rop, mp_int op1, mp_int op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_divexact */
Packit fb9d21
void GMPZAPI(divexact)(mp_int q, mp_int n, mp_int d);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_divisible_p */
Packit fb9d21
int GMPZAPI(divisible_p)(mp_int n, mp_int d);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_submul */
Packit fb9d21
void GMPZAPI(submul)(mp_int rop, mp_int op1, mp_int op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_add_ui */
Packit fb9d21
void GMPZAPI(add_ui)(mp_int rop, mp_int op1, unsigned long op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_divexact_ui */
Packit fb9d21
void GMPZAPI(divexact_ui)(mp_int q, mp_int n, unsigned long d);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_mul_ui */
Packit fb9d21
void GMPZAPI(mul_ui)(mp_int rop, mp_int op1, unsigned long op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_pow_ui */
Packit fb9d21
void GMPZAPI(pow_ui)(mp_int rop, mp_int base, unsigned long exp);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_sub_ui */
Packit fb9d21
void GMPZAPI(sub_ui)(mp_int rop, mp_int op1, unsigned long op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_fdiv_q_ui */
Packit fb9d21
unsigned long GMPZAPI(fdiv_q_ui)(mp_int q, mp_int n, unsigned long d);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_sizeinbase */
Packit fb9d21
size_t GMPZAPI(sizeinbase)(mp_int op, int base);
Packit fb9d21
Packit fb9d21
/*************************************************************************
Packit fb9d21
 *
Packit fb9d21
 * Functions with different behavior in corner cases
Packit fb9d21
 *
Packit fb9d21
 *************************************************************************/
Packit fb9d21
/* gmp: mpz_gcd */
Packit fb9d21
/* gmp: When op1 = 0 and op2 = 0, return 0.*/
Packit fb9d21
void GMPZAPI(gcd)(mp_int rop, mp_int op1, mp_int op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_get_str */
Packit fb9d21
/* gmp: If str is NULL then allocate space using the default allocator. */
Packit fb9d21
char* GMPZAPI(get_str)(char *str, int radix, mp_int op);
Packit fb9d21
Packit fb9d21
/* gmp: mpq_get_str */
Packit fb9d21
/* gmp: If str is NULL then allocate space using the default allocator. */
Packit fb9d21
/* gmp: If value is a whole number do not print denomenator. */
Packit fb9d21
/* TODO: Need to handle 0 values better. GMP prints 0/4 instead of 0.*/
Packit fb9d21
char* GMPQAPI(get_str)(char *str, int radix, mp_rat op);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_set_str */
Packit fb9d21
/* gmp: Allow and ignore spaces in string. */
Packit fb9d21
int GMPZAPI(set_str)(mp_int rop, char *str, int base);
Packit fb9d21
Packit fb9d21
/* gmp: mpq_set_str */
Packit fb9d21
int GMPQAPI(set_str)(mp_rat rop, char *str, int base);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_get_ui */
Packit fb9d21
/* gmp: Return least significant bits if value is too big for a long. */
Packit fb9d21
unsigned long GMPZAPI(get_ui)(mp_int op);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_get_si */
Packit fb9d21
/* gmp: Return least significant bits if value is too bit for a long. */
Packit fb9d21
/* gmp: If value is too big for long, return the least significant
Packit fb9d21
        (8*sizeof(long)-1) bits from the op and set the sign bit according to
Packit fb9d21
        the sign of the op. */
Packit fb9d21
long GMPZAPI(get_si)(mp_int op);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_lcm */
Packit fb9d21
/* gmp: When op1 = 0 or op2 = 0, return 0.*/
Packit fb9d21
/* gmp: The resutl of lcm(a,b) is always positive. */
Packit fb9d21
void GMPZAPI(lcm)(mp_int rop, mp_int op1, mp_int op2);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_mul_2exp */
Packit fb9d21
/* gmp: allow big values for op2 when op1 == 0 */
Packit fb9d21
void GMPZAPI(mul_2exp)(mp_int rop, mp_int op1, unsigned long op2);
Packit fb9d21
Packit fb9d21
/*************************************************************************
Packit fb9d21
 *
Packit fb9d21
 * Functions needing expanded functionality
Packit fb9d21
 *
Packit fb9d21
 *************************************************************************/
Packit fb9d21
/* gmp: mpz_cdiv_q */
Packit fb9d21
void GMPZAPI(cdiv_q)(mp_int q, mp_int n, mp_int d);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_fdiv_q */
Packit fb9d21
void GMPZAPI(fdiv_q)(mp_int q, mp_int n, mp_int d);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_fdiv_r */
Packit fb9d21
void GMPZAPI(fdiv_r)(mp_int r, mp_int n, mp_int d);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_tdiv_q */
Packit fb9d21
void GMPZAPI(tdiv_q)(mp_int q, mp_int n, mp_int d);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_export */
Packit fb9d21
void* GMPZAPI(export)(void *rop, size_t *countp, int order, size_t size, int endian, size_t nails, mp_int op);
Packit fb9d21
Packit fb9d21
/* gmp: mpz_import */
Packit fb9d21
void GMPZAPI(import)(mp_int rop, size_t count, int order, size_t size, int endian, size_t nails, const void* op);
Packit fb9d21
Packit fb9d21
#ifdef __cplusplus
Packit fb9d21
}
Packit fb9d21
#endif
Packit fb9d21
#endif /* end IMATH_GMP_COMPAT_H_ */