Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reutilizing same c ADT for other types

So i'm having trouble figuring how to overcome this.

Take for example, i have a red black tree implementation that works with items:

typedef unsigned long int Key;
struct rbt_node{
    Item item;
    int color;
    Key key;
    struct rbt_node* parent;
    struct rbt_node* left;
    struct rbt_node* right;
};

then in an Item.h i define the structure i'll be using, for example:

typedef struct _something* Item;

That way i'm decoupling the Item holded from the tree implementation. The problem arises if i want to reuse the ADT for other types.

At the moment i would have to define a Item2.h, and copy rbt.c/rbt.h to rbt2.c/rbt2.h and change them to use Item2.h and change the functions names. Isn't there any cleaner way?

I found this C double linked list with abstract data type, but it seems to have some problems depending on the architecture and size of the structures, which i'm not really very knowledgeable.

I'm looking for this kind of usage:
rbt_insert(rbt_of_something, something);
rbt_insert(rbt_of_somethingElse, somethingElse);

Thanks

like image 639
GriffinHeart Avatar asked Feb 10 '26 20:02

GriffinHeart


2 Answers

You can put all your Items definitions in one single header file and use preprocessor to choose the right one:

#ifdef SOMETHING
typedef struct _something* Item;
#elif SOMETHINGELSE
typedef struct _somethingElse* Item;
#else
#error no definition for Item. Use -D flag to specify Item definition.
#endif

Then when compiling, just use -D arguments to define one of these macros.

like image 94
Benoit Thiery Avatar answered Feb 13 '26 14:02

Benoit Thiery


Make the item member void*. Then define functions or macros that you use to assign/read the items to perform the required casts. e.g.

FILE* rbt_fileFromNode(struct rbt_node* node);

If you want to be really clever and you have a fixed number of types you'd like to put in there, add an enum to rbt_node or rbt_tree to store the type of the item.

like image 41
JeremyP Avatar answered Feb 13 '26 13:02

JeremyP



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!