2011-07-16 32 views
0

我正在編程C中的前綴樹來存儲IP前綴。 這些密鑰是IP前綴。 我想用它與32位或128位密鑰(IPv4/IPv6地址)。具有2種不同密鑰類型和最少冗餘代碼的樹數據結構

插入/刪除/查找功能需要爲ipv4或ipv6變體調用不同的bitop函數。

我怎麼能在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); 

感謝:=)

回答

1

你可以使用每個IPv4地址都可以映射到IPv6地址的事實。

+0

肯定的,但在128位整數存儲32位不會忽略是一個巨大的浪費內存(幾十萬節點) – fho

1

您可以使用另一個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

定義欺騙可能是要走的路如果你想在編譯時做所有事情。 – hugomg

+0

如果我使用define定義。我將編譯一個具有相同名稱的函數,例如tree_insert兩次,具有不同的定義集。但是,我不能將一個程序鏈接到兩個目標文件,因爲tree_insert的符號名稱是相等的? – fho

+0

解決此問題的最簡單方法是爲每個名稱空間定義不同的名稱空間。 –