diff options
Diffstat (limited to 'src/math/curve.c')
| -rw-r--r-- | src/math/curve.c | 68 |
1 files changed, 56 insertions, 12 deletions
diff --git a/src/math/curve.c b/src/math/curve.c index 7b74556..0d4cd12 100644 --- a/src/math/curve.c +++ b/src/math/curve.c @@ -18,7 +18,7 @@ curve_t *curve_new(void) { return curve; } -curve_t *curve_copy(curve_t *src, curve_t *dest) { +curve_t *curve_copy(const curve_t *src, curve_t *dest) { if (src->seed) dest->seed = seed_copy(src->seed, dest->seed); if (src->field) dest->field = gcopy(src->field); if (src->a) dest->a = gcopy(src->a); @@ -26,25 +26,69 @@ curve_t *curve_copy(curve_t *src, curve_t *dest) { if (src->curve) dest->curve = gcopy(src->curve); if (src->order) dest->order = gcopy(src->order); if (src->generators) { - dest->generators = points_new(src->ngens); - dest->generators = - points_copy(src->generators, dest->generators, src->ngens); + dest->generators = points_new_copy(src->generators, src->ngens); dest->ngens = src->ngens; } if (src->points) { - dest->points = points_new(src->npoints); - dest->points = points_copy(src->points, dest->points, src->npoints); + dest->points = points_new_copy(src->points, src->npoints); dest->npoints = src->npoints; } return dest; } +curve_t *curve_new_copy(const curve_t *src) { + curve_t *result = curve_new(); + return curve_copy(src, result); +} + +curve_t *curve_clone(const curve_t *src, curve_t *dest) { + if (src->seed) dest->seed = seed_clone(src->seed, dest->seed); + if (src->field) dest->field = gclone(src->field); + if (src->a) dest->a = gclone(src->a); + if (src->b) dest->b = gclone(src->b); + if (src->curve) dest->curve = gclone(src->curve); + if (src->order) dest->order = gclone(src->order); + if (src->generators) { + dest->generators = points_new_clone(src->generators, src->ngens); + dest->ngens = src->ngens; + } + if (src->points) { + dest->points = points_new_clone(src->points, src->npoints); + dest->npoints = src->npoints; + } + return dest; +} + +curve_t *curve_new_clone(const curve_t *src) { + curve_t *result = curve_new(); + return curve_clone(src, result); +} + void curve_free(curve_t **curve) { if (*curve) { seed_free(&(*curve)->seed); + if ((*curve)->curve) { + // TODO, this is possibly dangerous... obj_free((*curve)->curve); + if (isclone((*curve)->curve)) { + gunclone((*curve)->curve); + } + } + + if ((*curve)->field && isclone((*curve)->field)) { + gunclone((*curve)->field); + } + if ((*curve)->a && isclone((*curve)->a)) { + gunclone((*curve)->a); + } + if ((*curve)->b && isclone((*curve)->b)) { + gunclone((*curve)->b); } + if ((*curve)->order && isclone((*curve)->order)) { + gunclone((*curve)->order); + } + points_free_deep(&(*curve)->generators, (*curve)->ngens); points_free_deep(&(*curve)->points, (*curve)->npoints); pari_free(*curve); @@ -52,7 +96,7 @@ void curve_free(curve_t **curve) { } } -int curve_any(curve_t *curve, config_t *cfg, arg_t *args) { +int curve_any(curve_t *curve, const config_t *cfg, arg_t *args) { pari_sp ltop = avma; GEN v = gen_0; switch (typ(curve->field)) { @@ -75,7 +119,7 @@ int curve_any(curve_t *curve, config_t *cfg, arg_t *args) { return 1; } -int curve_nonzero(curve_t *curve, config_t *cfg, arg_t *args) { +int curve_nonzero(curve_t *curve, const config_t *cfg, arg_t *args) { pari_sp ltop = avma; curve_any(curve, cfg, args); if (gequal0(ell_get_disc(curve->curve))) { @@ -86,17 +130,17 @@ int curve_nonzero(curve_t *curve, config_t *cfg, arg_t *args) { } } -static int curve_seed_fp(curve_t *curve, config_t *cfg, arg_t *args) { +static int curve_seed_fp(curve_t *curve, const config_t *cfg, arg_t *args) { // TODO implement return INT_MIN; } -static int curve_seed_f2m(curve_t *curve, config_t *cfg, arg_t *args) { +static int curve_seed_f2m(curve_t *curve, const config_t *cfg, arg_t *args) { // TODO implement return INT_MIN; } -int curve_seed(curve_t *curve, config_t *cfg, arg_t *args) { +int curve_seed(curve_t *curve, const config_t *cfg, arg_t *args) { switch (typ(curve->field)) { case t_INT: return curve_seed_fp(curve, cfg, args); @@ -108,7 +152,7 @@ int curve_seed(curve_t *curve, config_t *cfg, arg_t *args) { } } -GEN curve_params(curve_t *curve) { +GEN curve_params(const curve_t *curve) { pari_sp ltop = avma; GEN result = field_params(curve->field); |
