aboutsummaryrefslogtreecommitdiff
path: root/src/obj/point.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/obj/point.c')
-rw-r--r--src/obj/point.c51
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