aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2018-03-28 19:09:06 +0200
committerJ08nY2018-03-28 19:09:06 +0200
commitf75446e573fb7d06be668b1dcdeb418f89b81af1 (patch)
tree36d30b5caf5970dfbb8eaf4f3da3577a97d22ff0
parent2f4a68259dec833c77a9598f9c1a5da547e9324d (diff)
downloadecgen-f75446e573fb7d06be668b1dcdeb418f89b81af1.tar.gz
ecgen-f75446e573fb7d06be668b1dcdeb418f89b81af1.tar.zst
ecgen-f75446e573fb7d06be668b1dcdeb418f89b81af1.zip
-rw-r--r--src/obj/curve.c15
-rw-r--r--src/obj/curve.h21
-rw-r--r--src/obj/obj.h58
-rw-r--r--src/obj/point.c43
-rw-r--r--src/obj/point.h63
-rw-r--r--src/obj/subgroup.c46
-rw-r--r--src/obj/subgroup.h63
7 files changed, 72 insertions, 237 deletions
diff --git a/src/obj/curve.c b/src/obj/curve.c
index 8d54f50..4821442 100644
--- a/src/obj/curve.c
+++ b/src/obj/curve.c
@@ -1,12 +1,9 @@
#include "curve.h"
#include "gen/seed.h"
-#include "math/subgroup.h"
-#include "misc/types.h"
#include "obj/subgroup.h"
-#include "util/memory.h"
-curve_t *curve_new(void) { return try_calloc(sizeof(curve_t)); }
+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);
@@ -22,11 +19,6 @@ curve_t *curve_copy(const curve_t *src, curve_t *dest) {
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_new_clone(src->seed);
if (src->field) dest->field = gclone(src->field);
@@ -41,11 +33,6 @@ curve_t *curve_clone(const curve_t *src, curve_t *dest) {
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);
diff --git a/src/obj/curve.h b/src/obj/curve.h
index 5d8886b..99284f4 100644
--- a/src/obj/curve.h
+++ b/src/obj/curve.h
@@ -3,12 +3,9 @@
#define ECGEN_OBJ_CURVE_H
#include "misc/types.h"
+#include "obj.h"
-/**
- * Allocates and zeros out a new curve_t object.
- * @return new curve
- */
-curve_t *curve_new(void);
+OBJ_H(curve, curve_t)
/**
* Copies parameters from src curve to dest curve, allocates space for points.
@@ -23,26 +20,12 @@ curve_t *curve_copy(const curve_t *src, curve_t *dest);
/**
*
* @param src
- * @return
- */
-curve_t *curve_new_copy(const curve_t *src);
-
-/**
- *
- * @param src
* @param dest
* @return
*/
curve_t *curve_clone(const curve_t *src, curve_t *dest);
/**
- *
- * @param src
- * @return
- */
-curve_t *curve_new_clone(const curve_t *src);
-
-/**
* Free a curve_t along with it's seed_t and point_ts.
* @param curve to free
*/
diff --git a/src/obj/obj.h b/src/obj/obj.h
new file mode 100644
index 0000000..5a7f9ab
--- /dev/null
+++ b/src/obj/obj.h
@@ -0,0 +1,58 @@
+
+#ifndef ECGEN_OBJ_H
+#define ECGEN_OBJ_H
+
+#include "misc/types.h"
+#include "util/memory.h"
+
+#define OBJ(obj_name, obj_type, copy_func, clone_func) \
+ obj_type *obj_name##_new() { return try_calloc(sizeof(obj_type)); } \
+ obj_type *obj_name##_new_copy(const obj_type *src) { \
+ obj_type *result = obj_name##_new(); \
+ return copy_func(src, result); \
+ } \
+ obj_type *obj_name##_new_clone(const obj_type *src) { \
+ obj_type *result = obj_name##_new(); \
+ return clone_func(src, result); \
+ }
+
+#define OBJS(obj_name, obj_type, copy_func, clone_func) \
+ obj_type **obj_name##s_new(size_t num) { \
+ return try_calloc(num * sizeof(obj_type)); \
+ } \
+ obj_type **obj_name##s_copy(obj_type **const src, obj_type **dest, \
+ size_t num) { \
+ for (size_t i = 0; i < num; ++i) { \
+ dest[i] = obj_name##_new_copy(src[i]); \
+ } \
+ return dest; \
+ } \
+ obj_type **obj_name##s_clone(obj_type **const src, obj_type **dest, \
+ size_t num) { \
+ for (size_t i = 0; i < num; ++i) { \
+ dest[i] = obj_name##_new_clone(src[i]); \
+ } \
+ return dest; \
+ } \
+ obj_type **obj_name##s_new_copy(obj_type **const src, size_t num) { \
+ obj_type **result = obj_name##s_new(num); \
+ return obj_name##s_copy(src, result, num); \
+ } \
+ obj_type **obj_name##s_new_clone(obj_type **const src, size_t num) { \
+ obj_type **result = obj_name##s_new(num); \
+ return obj_name##s_clone(src, result, num); \
+ }
+
+#define OBJ_H(obj_name, obj_type) \
+ obj_type *obj_name##_new(); \
+ obj_type *obj_name##_new_copy(const obj_type *src); \
+ obj_type *obj_name##_new_clone(const obj_type *src);
+
+#define OBJS_H(obj_name, obj_type) \
+ obj_type **obj_name##s_new(size_t num); \
+ obj_type **obj_name##s_copy(obj_type **src, obj_type **dest, size_t num); \
+ obj_type **obj_name##s_clone(obj_type **src, obj_type **dest, size_t num); \
+ obj_type **obj_name##s_new_copy(obj_type **src, size_t num); \
+ obj_type **obj_name##s_new_clone(obj_type **src, size_t num);
+
+#endif // ECGEN_OBJ_H
diff --git a/src/obj/point.c b/src/obj/point.c
index 9c9b37d..2b709dd 100644
--- a/src/obj/point.c
+++ b/src/obj/point.c
@@ -1,9 +1,8 @@
#include "point.h"
-#include "misc/types.h"
-#include "util/memory.h"
-point_t *point_new(void) { return try_calloc(sizeof(point_t)); }
+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);
@@ -12,11 +11,6 @@ point_t *point_copy(const point_t *src, point_t *dest) {
return dest;
}
-point_t *point_new_copy(const point_t *src) {
- point_t *result = point_new();
- return point_copy(src, result);
-}
-
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);
@@ -24,11 +18,6 @@ point_t *point_clone(const point_t *src, point_t *dest) {
return dest;
}
-point_t *point_new_clone(const point_t *src) {
- point_t *result = point_new();
- return point_clone(src, result);
-}
-
void point_free(point_t **point) {
if (*point) {
if ((*point)->point && isclone((*point)->point)) {
@@ -45,34 +34,6 @@ void point_free(point_t **point) {
}
}
-point_t **points_new(unsigned long num) {
- return try_calloc(num * sizeof(point_t *));
-}
-
-point_t **points_copy(point_t **const src, point_t **dest, unsigned long num) {
- for (unsigned long i = 0; i < num; ++i) {
- dest[i] = point_new_copy(src[i]);
- }
- return dest;
-}
-
-point_t **points_new_copy(point_t **const src, unsigned long num) {
- point_t **result = points_new(num);
- return points_copy(src, result, num);
-}
-
-point_t **points_clone(point_t **const src, point_t **dest, unsigned long num) {
- for (unsigned long i = 0; i < num; ++i) {
- dest[i] = point_new_clone(src[i]);
- }
- return dest;
-}
-
-point_t **points_new_clone(point_t **const src, unsigned long num) {
- point_t **result = points_new(num);
- return points_clone(src, result, num);
-}
-
void points_free(point_t ***points) {
if (*points) {
try_free(*points);
diff --git a/src/obj/point.h b/src/obj/point.h
index d6aa55e..619f0e2 100644
--- a/src/obj/point.h
+++ b/src/obj/point.h
@@ -3,12 +3,10 @@
#define ECGEN_OBJ_POINT_H
#include "misc/types.h"
+#include "obj.h"
-/**
- *
- * @return
- */
-point_t *point_new(void);
+OBJ_H(point, point_t)
+OBJS_H(point, point_t)
/**
*
@@ -21,13 +19,6 @@ point_t *point_copy(const point_t *src, point_t *dest);
/**
*
* @param src
- * @return
- */
-point_t *point_new_copy(const point_t *src);
-
-/**
- *
- * @param src
* @param dest
* @return
*/
@@ -35,60 +26,12 @@ point_t *point_clone(const point_t *src, point_t *dest);
/**
*
- * @param src
- * @return
- */
-point_t *point_new_clone(const point_t *src);
-
-/**
- *
* @param point
*/
void point_free(point_t **point);
/**
*
- * @param num
- * @return
- */
-point_t **points_new(unsigned long num);
-
-/**
- *
- * @param src
- * @param dest
- * @param num
- * @return
- */
-point_t **points_copy(point_t **src, point_t **dest, unsigned long num);
-
-/**
- *
- * @param src
- * @param num
- * @return
- */
-point_t **points_new_copy(point_t **src, unsigned long num);
-
-/**
- *
- * @param src
- * @param dest
- * @param num
- * @return
- */
-point_t **points_clone(point_t **src, point_t **dest, unsigned long num);
-
-/**
- *
- * @param src
- * @param num
- * @return
- */
-point_t **points_new_clone(point_t **src, unsigned long num);
-
-/**
- *
* @param point
*/
void points_free(point_t ***point);
diff --git a/src/obj/subgroup.c b/src/obj/subgroup.c
index 732e0a9..5e6d6e6 100644
--- a/src/obj/subgroup.c
+++ b/src/obj/subgroup.c
@@ -1,9 +1,9 @@
#include "subgroup.h"
#include "point.h"
-#include "util/memory.h"
-subgroup_t *subgroup_new(void) { return try_calloc(sizeof(subgroup_t)); }
+OBJ(subgroup, subgroup_t, subgroup_copy, subgroup_clone)
+OBJS(subgroup, subgroup_t, subgroup_copy, subgroup_clone)
subgroup_t *subgroup_copy(const subgroup_t *src, subgroup_t *dst) {
if (src->generator) dst->generator = point_new_copy(src->generator);
@@ -14,11 +14,6 @@ subgroup_t *subgroup_copy(const subgroup_t *src, subgroup_t *dst) {
return dst;
}
-subgroup_t *subgroup_new_copy(const subgroup_t *src) {
- subgroup_t *result = subgroup_new();
- return subgroup_copy(src, result);
-}
-
subgroup_t *subgroup_clone(const subgroup_t *src, subgroup_t *dst) {
if (src->generator) dst->generator = point_new_clone(src->generator);
if (src->points) {
@@ -28,11 +23,6 @@ subgroup_t *subgroup_clone(const subgroup_t *src, subgroup_t *dst) {
return dst;
}
-subgroup_t *subgroup_new_clone(const subgroup_t *src) {
- subgroup_t *result = subgroup_new();
- return subgroup_clone(src, result);
-}
-
void subgroup_free(subgroup_t **subgroup) {
if (*subgroup) {
if ((*subgroup)->generator) {
@@ -50,36 +40,6 @@ void subgroup_free_deep(subgroup_t **subgroup) {
}
}
-subgroup_t **subgroups_new(size_t num) {
- return try_calloc(num * sizeof(subgroup_t *));
-}
-
-subgroup_t **subgroups_copy(subgroup_t **const src, subgroup_t **dest,
- size_t num) {
- for (size_t i = 0; i < num; ++i) {
- dest[i] = subgroup_new_copy(src[i]);
- }
- return dest;
-}
-
-subgroup_t **subgroups_new_copy(subgroup_t **const src, size_t num) {
- subgroup_t **result = subgroups_new(num);
- return subgroups_copy(src, result, num);
-}
-
-subgroup_t **subgroups_clone(subgroup_t **const src, subgroup_t **dest,
- size_t num) {
- for (size_t i = 0; i < num; ++i) {
- dest[i] = subgroup_new_clone(src[i]);
- }
- return dest;
-}
-
-subgroup_t **subgroups_new_clone(subgroup_t **const src, size_t num) {
- subgroup_t **result = subgroups_new(num);
- return subgroups_clone(src, result, num);
-}
-
void subgroups_free(subgroup_t ***subgroups) {
if (*subgroups) {
try_free(*subgroups);
@@ -90,7 +50,7 @@ void subgroups_free(subgroup_t ***subgroups) {
void subgroups_free_deep(subgroup_t ***subgroups, size_t num) {
if (*subgroups) {
for (size_t i = 0; i < num; ++i) {
- subgroup_free(&(*subgroups)[i]);
+ subgroup_free_deep(&(*subgroups)[i]);
}
subgroups_free(subgroups);
}
diff --git a/src/obj/subgroup.h b/src/obj/subgroup.h
index 8c56f9c..fd1a117 100644
--- a/src/obj/subgroup.h
+++ b/src/obj/subgroup.h
@@ -3,12 +3,10 @@
#define ECGEN_OBJ_SUBGROUP_H
#include "misc/types.h"
+#include "obj.h"
-/**
- * @brief
- * @return
- */
-subgroup_t *subgroup_new(void);
+OBJ_H(subgroup, subgroup_t)
+OBJS_H(subgroup, subgroup_t)
/**
* @brief
@@ -21,13 +19,6 @@ subgroup_t *subgroup_copy(const subgroup_t *src, subgroup_t *dst);
/**
* @brief
* @param src
- * @return
- */
-subgroup_t *subgroup_new_copy(const subgroup_t *src);
-
-/**
- * @brief
- * @param src
* @param dst
* @return
*/
@@ -35,13 +26,6 @@ subgroup_t *subgroup_clone(const subgroup_t *src, subgroup_t *dst);
/**
* @brief
- * @param src
- * @return
- */
-subgroup_t *subgroup_new_clone(const subgroup_t *src);
-
-/**
- * @brief
* @param subgroup
*/
void subgroup_free(subgroup_t **subgroup);
@@ -54,47 +38,6 @@ void subgroup_free_deep(subgroup_t **subgroup);
/**
* @brief
- * @param num
- * @return
- */
-subgroup_t **subgroups_new(size_t num);
-
-/**
- *
- * @param src
- * @param dest
- * @param num
- * @return
- */
-subgroup_t **subgroups_copy(subgroup_t **src, subgroup_t **dest, size_t num);
-
-/**
- *
- * @param src
- * @param num
- * @return
- */
-subgroup_t **subgroups_new_copy(subgroup_t **src, size_t num);
-
-/**
- *
- * @param src
- * @param dest
- * @param num
- * @return
- */
-subgroup_t **subgroups_clone(subgroup_t **src, subgroup_t **dest, size_t num);
-
-/**
- *
- * @param src
- * @param num
- * @return
- */
-subgroup_t **subgroups_new_clone(subgroup_t **src, size_t num);
-
-/**
- * @brief
* @param subgroups
*/
void subgroups_free(subgroup_t ***subgroups);