From f75446e573fb7d06be668b1dcdeb418f89b81af1 Mon Sep 17 00:00:00 2001 From: J08nY Date: Wed, 28 Mar 2018 19:09:06 +0200 Subject: Introduce and use OBJ macro. --- src/obj/curve.c | 15 +------------ src/obj/curve.h | 21 ++---------------- src/obj/obj.h | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ src/obj/point.c | 43 ++----------------------------------- src/obj/point.h | 63 +++--------------------------------------------------- src/obj/subgroup.c | 46 +++------------------------------------ src/obj/subgroup.h | 63 +++--------------------------------------------------- 7 files changed, 72 insertions(+), 237 deletions(-) create mode 100644 src/obj/obj.h (limited to 'src/obj') 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. @@ -20,13 +17,6 @@ curve_t *curve_new(void); */ 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 @@ -35,13 +25,6 @@ curve_t *curve_new_copy(const curve_t *src); */ 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) /** * @@ -18,13 +16,6 @@ point_t *point_new(void); */ 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 @@ -33,60 +24,12 @@ point_t *point_new_copy(const point_t *src); */ 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 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 @@ -18,13 +16,6 @@ subgroup_t *subgroup_new(void); */ 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 @@ -33,13 +24,6 @@ subgroup_t *subgroup_new_copy(const subgroup_t *src); */ 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 @@ -52,47 +36,6 @@ void subgroup_free(subgroup_t **subgroup); */ 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 -- cgit v1.3.1