diff options
Diffstat (limited to 'tests/copy_parameter.c')
-rw-r--r-- | tests/copy_parameter.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/tests/copy_parameter.c b/tests/copy_parameter.c new file mode 100644 index 0000000..4c1ff37 --- /dev/null +++ b/tests/copy_parameter.c @@ -0,0 +1,122 @@ +/* copy_parameter.c -- Copy of an input parameter into a parameter reused for + output. + +Copyright (C) 2012, 2013 INRIA + +This file is part of GNU MPC. + +GNU MPC is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program. If not, see http://www.gnu.org/licenses/ . +*/ + +#include "mpc-tests.h" + +int +copy_parameter (mpc_fun_param_t *params, int index_dest, int index_src) +{ + mpfr_prec_t pre1, pim1; + mpfr_prec_t pre2, pim2; + int index_ref; + + if (params->T[index_src] != params->T[index_dest]) + { + fprintf (stderr, "copy_parameter: types of parameters don't match.\n"); + exit (1); + } + + switch (params->T[index_src]) + { + case NATIVE_INT: + tpl_copy_int (¶ms->P[index_dest].i, ¶ms->P[index_src].i); + return 0; + case NATIVE_UL: + tpl_copy_ui (¶ms->P[index_dest].ui, ¶ms->P[index_src].ui); + return 0; + case NATIVE_L: + tpl_copy_si (¶ms->P[index_dest].si, ¶ms->P[index_src].si); + return 0; + case NATIVE_D: + tpl_copy_d (¶ms->P[index_dest].d, ¶ms->P[index_src].d); + return 0; + + case NATIVE_LD: + /* TODO */ + fprintf (stderr, "copy_parameter: type not implemented.\n"); + exit (1); + break; + + case NATIVE_DC: + case NATIVE_LDC: +#ifdef _Complex_I + /* TODO */ + fprintf (stderr, "copy_parameter: type not implemented.\n"); + exit (1); +#endif + break; + + case NATIVE_IM: + case NATIVE_UIM: +#ifdef _MPC_H_HAVE_INTMAX_T + /* TODO */ + fprintf (stderr, "copy_parameter: type not implemented.\n"); + exit (1); +#endif + break; + + case GMP_Z: + mpz_set (params->P[index_dest].mpz, params->P[index_src].mpz); + return 0; + case GMP_Q: + mpq_set (params->P[index_dest].mpq, params->P[index_src].mpq); + return 0; + case GMP_F: + mpf_set (params->P[index_dest].mpf, params->P[index_src].mpf); + return 0; + + case MPFR: + /* need same precision between source, destination, and reference */ + pre1 = mpfr_get_prec (params->P[index_dest].mpfr); + pre2 = mpfr_get_prec (params->P[index_src].mpfr); + index_ref = index_dest + params->nbout + params->nbin; + if (pre1 != pre2 + || pre1 != mpfr_get_prec (params->P[index_ref].mpfr)) + return -1; + + tpl_copy_mpfr (params->P[index_dest].mpfr, params->P[index_src].mpfr); + return 0; + + case MPC: + mpc_get_prec2 (&pre1, &pim1, params->P[index_dest].mpc); + /* check same precision between source and destination */ + mpc_get_prec2 (&pre2, &pim2, params->P[index_src].mpc); + if (pre1 != pre2 || pim1 != pim2) + return -1; + /* check same precision between source and reference */ + index_ref = index_dest + params->nbout + params->nbin; + mpc_get_prec2 (&pre2, &pim2, params->P[index_ref].mpc); + if (pre1 != pre2 || pim1 != pim2) + return -1; + + tpl_copy_mpc (params->P[index_dest].mpc, params->P[index_src].mpc); + return 0; + + case NATIVE_STRING: + case MPFR_INEX: case MPFR_RND: + case MPC_INEX: case MPC_RND: + /* no supported copy */ + break; + } + + fprintf (stderr, "copy_parameter: unsupported type.\n"); + exit (1); +} |