|
| 1 | +/*! @file generic_def.h |
| 2 | + @brief |
| 3 | + Contains Macros that are used for defining psuedo data template functions |
| 4 | +*/ |
| 5 | +#pragma once |
| 6 | + |
| 7 | +#include "typedefs.h" |
| 8 | +#include "memory_manager.h" |
| 9 | + |
| 10 | +/// Template Compare function for default data types |
| 11 | +#define CMPR(T, NAME) e_cmpr NAME(t_gen x, t_gen y)\ |
| 12 | + { \ |
| 13 | + e_cmpr ret = eEQUAL;\ |
| 14 | + T tmp = (*((T*)(x))) - (*((T*)(y)));\ |
| 15 | + if (tmp < 0) \ |
| 16 | + ret = eLESS;\ |
| 17 | + else if (tmp > 0)\ |
| 18 | + ret = eGREAT;\ |
| 19 | + return ret;\ |
| 20 | + } |
| 21 | + |
| 22 | + |
| 23 | +/// Template Assign memory function for default data types |
| 24 | +#define ASSGN(T, NAME) t_gen NAME(T y) \ |
| 25 | + {\ |
| 26 | + t_gen x = get_mem(1, sizeof(T));\ |
| 27 | + *((T*)x) = y;\ |
| 28 | + return x;\ |
| 29 | + } |
| 30 | + |
| 31 | + |
| 32 | +/// Template Swap function for default data types |
| 33 | +#define SWAP(T, NAME) void NAME(t_gen x, t_gen y) \ |
| 34 | + {\ |
| 35 | + T tmp = *((T*)x);\ |
| 36 | + *((T*)x) = *((T*)y);\ |
| 37 | + *((T*)y) = tmp;\ |
| 38 | + } |
| 39 | + |
| 40 | +/// Defines format specfier depending on type of data |
| 41 | +/// used for implementing generic print |
| 42 | +/// Note: Requires C11 compiler since it use _Generic |
| 43 | +#define FMT_SPF(T) _Generic((T),\ |
| 44 | + char: "%c", \ |
| 45 | + signed char: "%hhd", \ |
| 46 | + unsigned char: "%hhu", \ |
| 47 | + signed short: "%hd", \ |
| 48 | + unsigned short: "%hu", \ |
| 49 | + signed int: "%d", \ |
| 50 | + unsigned int: "%u", \ |
| 51 | + long int: "%ld", \ |
| 52 | + unsigned long int: "%lu", \ |
| 53 | + long long int: "%lld", \ |
| 54 | + unsigned long long int: "%llu", \ |
| 55 | + float: "%f", \ |
| 56 | + double: "%f", \ |
| 57 | + long double: "%Lf", \ |
| 58 | + char *: "%s", \ |
| 59 | + void *: "%p") |
| 60 | + |
| 61 | + |
| 62 | +/// Template print function for default data types |
| 63 | +#define PRINT_GEN(T, NAME) void NAME(t_gen x) \ |
| 64 | + { \ |
| 65 | + T y;\ |
| 66 | + printf(FMT_SPF(y), *((T*)x)); \ |
| 67 | + } |
| 68 | + |
| 69 | +/// Template function for comparing elemts at given indicies of an array for default data types |
| 70 | +#define CMPR_IDX(T, NAME) e_cmpr NAME(t_gen x, int idx1, int idx2)\ |
| 71 | + { \ |
| 72 | + e_cmpr ret = eEQUAL;\ |
| 73 | + T *arr = ((T*)(x));\ |
| 74 | + T tmp = arr[idx1] -arr[idx2];\ |
| 75 | + if (tmp < 0) \ |
| 76 | + ret = eLESS;\ |
| 77 | + else if (tmp > 0)\ |
| 78 | + ret = eGREAT;\ |
| 79 | + return ret;\ |
| 80 | + } |
| 81 | + |
| 82 | +/// Template function for swaping elemts at given indicies of an array for default data types |
| 83 | +#define SWP_IDX(T, NAME) void NAME(t_gen x, int idx1, int idx2)\ |
| 84 | + { \ |
| 85 | + T *arr = ((T*)(x));\ |
| 86 | + T tmp = arr[idx1] ;\ |
| 87 | + arr[idx1] = arr[idx2];\ |
| 88 | + arr[idx2] = tmp;\ |
| 89 | + } |
| 90 | + |
| 91 | +/// Template function for copying element to a given index of an array for default data types |
| 92 | +#define COPY_IDX(T, NAME) void NAME(t_gen x, int idx1, t_gen data)\ |
| 93 | + { \ |
| 94 | + T *arr = ((T*)(x));\ |
| 95 | + arr[idx1] = *((T*)(data));\ |
| 96 | + } |
| 97 | + |
| 98 | +/// Template function for getting element at a given index of an array for default data types |
| 99 | +#define GET_IDX(T, NAME) t_gen NAME(t_gen x, int idx1)\ |
| 100 | + { \ |
| 101 | + T *arr = ((T*)(x));\ |
| 102 | + t_gen tmp = &arr[idx1] ;\ |
| 103 | + return tmp;\ |
| 104 | + } |
| 105 | + |
| 106 | +/// Below routines defined as reference for basic datatypes |
| 107 | +e_cmpr compare_char(t_gen,t_gen); |
| 108 | +e_cmpr compare_int(t_gen,t_gen); |
| 109 | +e_cmpr compare_float(t_gen,t_gen); |
| 110 | +e_cmpr compare_string(t_gen,t_gen); |
| 111 | +e_cmpr compare_gen(t_gen,t_gen); |
| 112 | + |
| 113 | +t_gen assign_char(char); |
| 114 | +t_gen assign_int(int); |
| 115 | +t_gen assign_float(float); |
| 116 | +t_gen assign_string(char*); |
| 117 | +t_gen assign_gen(t_gen); |
| 118 | + |
| 119 | +void swap_char(t_gen,t_gen); |
| 120 | +void swap_int(t_gen,t_gen); |
| 121 | +void swap_float(t_gen,t_gen); |
| 122 | +void swap_string(t_gen,t_gen); |
| 123 | +void swap_gen(t_gen,t_gen); |
| 124 | + |
| 125 | +void print_char(t_gen); |
| 126 | +void print_float(t_gen); |
| 127 | +void print_int(t_gen); |
| 128 | +void print_str(t_gen); |
| 129 | +void print_gen(t_gen); |
| 130 | + |
| 131 | +e_cmpr compare_idx_char(t_gen,int,int); |
| 132 | +e_cmpr compare_idx_int(t_gen,int,int); |
| 133 | +e_cmpr compare_idx_float(t_gen,int,int); |
| 134 | + |
| 135 | +void swap_idx_char(t_gen,int,int); |
| 136 | +void swap_idx_int(t_gen,int,int); |
| 137 | +void swap_idx_float(t_gen,int,int); |
| 138 | + |
| 139 | +void copy_idx_char(t_gen,int,t_gen); |
| 140 | +void copy_idx_int(t_gen,int,t_gen); |
| 141 | +void copy_idx_float(t_gen,int,t_gen); |
| 142 | + |
| 143 | +t_gen get_idx_char(t_gen,int); |
| 144 | +t_gen get_idx_int(t_gen,int); |
| 145 | +t_gen get_idx_float(t_gen,int); |
0 commit comments