Viewing file: copy_parameter.c (3.61 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* copy_parameter.c -- Copy of an input parameter into a parameter reused for output.
Copyright (C) 2012, 2013, 2014 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: case MPCC_INEX: /* no supported copy */ break; }
fprintf (stderr, "copy_parameter: unsupported type.\n"); exit (1); }
|