使用C语言实现泛型

Redis中的泛型链表

typedef struct listNode
{
  struct listNode *prev;
  struct listNode *next;
  void *value;
} listNode;

typedef struct list
{
  listNode *head;
  listNode *tail;
  void *(*dup)(void *ptr);
  void (*free)(void *ptr);
  int (*match)(void *ptr, void *key);
  unsigned int len;
} list;

其中:

  • 链表结点使用void*指针来保存节点值。
  • dupfreematch成员是用于实现多态链表所需的类型特定函数。
    所以链表可以用于保存各种不同类型的值。

使用Redis中的泛型链表

TODO

Redis中的多态字典

typedef struct dictEntry {
    void *key;
    void *val;
    struct dictEntry *next;
} dictEntry;

typedef struct dictType
{
    unsigned int (*hashFunction)(const void *key);
    void *(*keyDup)(void *privdata, const void *key);
    void *(*valDup)(void *privdata, const void *obj);
    int (*keyCompare)(void *privdata, const void *key1, const void *key2);
    void (*keyDestructor)(void *privdata, void *key);
    void (*valDestructor)(void *privdata, void *obj);
} dictType;

typedef struct dictht {
    dictEntry **table;
    unsigned long size;
    unsigned long sizemask;
    unsigned long used;
} dictht;

typedef struct dict
{
  dictType *type;
  void *privdata;
  dictht ht[2];
  int rehashidx;
  int iterators;
};

type属性和privdata属性是针对不同类型的键值对,为创建多态字典而设置的。

参考

  • https://github.com/antirez/redis/tree/2.2

你可能感兴趣的:(使用C语言实现泛型)