Древовидная структура данных с 2 различными типами ключей и минимальным избыточным кодом - PullRequest
0 голосов
/ 16 июля 2011

Я программирую дерево префиксов в C для хранения IP-префиксов.Ключами являются IP-префиксы.Я хотел бы использовать его с 32-битными или 128-битными ключами (адреса IPv4 / IPv6).

Функции вставки / удаления / поиска должны вызывать различные битовые функции для варианта ipv4 или ipv6.

Как я могу сделать это в C?

  • Тип ключа не должен быть определен во время выполнения.
  • Я хочу скомпилировать с различными версиями структуры данных, которая работает сПрефиксы IPv4 и один для префиксов IPv6.
  • Мне нужно позже использовать обе версии в дереве в одном и том же C-файле.
  • Я хотел бы иметь минимальный повторяющийся код

В конце я хотел бы иметь следующие структуры и функции:

  typedef struct tree_node6_t {
    ipv6_addr prefix;
    u_int8_t len;
    struct tree_node6_t* parent;
    struct tree_node6_t* lchild;
    struct tree_node6_t* rchild;
    void* data;
} tree_node6;

typedef struct tree_node4_t {
    ipv4_addr prefix;
    u_int8_t len;
    struct tree_node4_t* parent;
    struct tree_node4_t* lchild;
    struct tree_node4_t* rchild;
    void* data;
} tree_node;

void tree_insert4(tree_node* root, tree_node* new_node, const unsigned int level);
void tree_insert6(tree_node* root, tree_node* new_node, const unsigned int level);
tree_node* tree_lookup4(const tree_node* root_node, const ipv4_addr* prefix, const u_int8_t prefix_len, unsigned int* level);
tree_node* tree_lookup6(const tree_node* root_node, const ipv6_addr* prefix, const u_int8_t prefix_len, unsigned int* level);

спасибо за любые подсказки: =)

Ответы [ 2 ]

1 голос
/ 16 июля 2011

Вы можете использовать другой typedef для объявления типа ip.
Затем вы можете просто изменить это во время компиляции с помощью директив препроцессора:

#ifdef USE_NODE4
typedef ipv4_addr ADDRESSTYPE ;
#define TREEINSERT tree_insert4 
#define TREELOOKUP tree_lookup4
#else
typedef ipv6_addr ADDRESSTYPE ;
#define TREEINSERT tree_insert6 
#define TREELOOKUP tree_lookup6
#endif

typedef struct tree_node_general {
    ADDRESSTYPE prefix;
    u_int8_t len;
    struct tree_node_general* parent;
    struct tree_node_general* lchild;
    struct tree_node_general* rchild;
    void* data;
} tree_node; 

void TREEINSERT (tree_node* root, tree_node* new_node, const unsigned int level);
tree_node* TREELOOKUP (const tree_node* root_node, const ADDRESSTYPE* prefix, const u_int8_t prefix_len, unsigned int* level);
1 голос
/ 16 июля 2011

Вы можете использовать тот факт, что каждый адрес IPv4 может быть сопоставлен с адресом IPv6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...