diff options
Diffstat (limited to 'src/obj/point.c')
| -rw-r--r-- | src/obj/point.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/obj/point.c b/src/obj/point.c new file mode 100644 index 0000000..2b709dd --- /dev/null +++ b/src/obj/point.c @@ -0,0 +1,51 @@ + +#include "point.h" + +OBJ(point, point_t, point_copy, point_clone) +OBJS(point, point_t, point_copy, point_clone) + +point_t *point_copy(const point_t *src, point_t *dest) { + if (src->point) dest->point = gcopy(src->point); + if (src->order) dest->order = gcopy(src->order); + if (src->cofactor) dest->cofactor = gcopy(src->cofactor); + return dest; +} + +point_t *point_clone(const point_t *src, point_t *dest) { + if (src->point) dest->point = gclone(src->point); + if (src->order) dest->order = gclone(src->order); + if (src->cofactor) dest->cofactor = gclone(src->cofactor); + return dest; +} + +void point_free(point_t **point) { + if (*point) { + if ((*point)->point && isclone((*point)->point)) { + gunclone((*point)->point); + } + if ((*point)->order && isclone((*point)->order)) { + gunclone((*point)->order); + } + if ((*point)->cofactor && isclone((*point)->cofactor)) { + gunclone((*point)->cofactor); + } + try_free(*point); + *point = NULL; + } +} + +void points_free(point_t ***points) { + if (*points) { + try_free(*points); + *points = NULL; + } +} + +void points_free_deep(point_t ***points, unsigned long npoints) { + if (*points) { + for (unsigned long i = 0; i < npoints; ++i) { + point_free(&(*points)[i]); + } + points_free(points); + } +}
\ No newline at end of file |
