aboutsummaryrefslogtreecommitdiff
path: root/src/obj/curve.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/obj/curve.c')
-rw-r--r--src/obj/curve.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/obj/curve.c b/src/obj/curve.c
new file mode 100644
index 0000000..4821442
--- /dev/null
+++ b/src/obj/curve.c
@@ -0,0 +1,65 @@
+
+#include "curve.h"
+#include "gen/seed.h"
+#include "obj/subgroup.h"
+
+OBJ(curve, curve_t, curve_copy, curve_clone)
+
+curve_t *curve_copy(const curve_t *src, curve_t *dest) {
+ if (src->seed) dest->seed = seed_new_copy(src->seed);
+ if (src->field) dest->field = gcopy(src->field);
+ if (src->a) dest->a = gcopy(src->a);
+ if (src->b) dest->b = gcopy(src->b);
+ if (src->curve) dest->curve = gcopy(src->curve);
+ if (src->order) dest->order = gcopy(src->order);
+ if (src->generators) {
+ dest->generators = subgroups_new_copy(src->generators, src->ngens);
+ dest->ngens = src->ngens;
+ }
+ return dest;
+}
+
+curve_t *curve_clone(const curve_t *src, curve_t *dest) {
+ if (src->seed) dest->seed = seed_new_clone(src->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 = subgroups_new_clone(src->generators, src->ngens);
+ dest->ngens = src->ngens;
+ }
+ return dest;
+}
+
+void curve_free(curve_t **curve) {
+ if (*curve) {
+ seed_free(&(*curve)->seed);
+ subgroups_free_deep(&(*curve)->generators, (*curve)->ngens);
+
+ 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);
+ }
+
+ try_free(*curve);
+ *curve = NULL;
+ }
+} \ No newline at end of file