STRUCTS.H
/*++ 
 
Copyright (c) 1995  Microsoft Corporation 
 
Module Name: 
 
    net\ip\lookup\structs.h 
 
Abstract: 
 
 
Revision History: 
 
 
 
--*/ 
 
#ifndef __LOOKUP_STRUCTS_H__ 
#define __LOOKUP_STRUCTS_H__ 
 
#define LEFT    0 
#define RIGHT   1 
 
// 
//  BYTE 
//  ComplementPosition( 
//      IN BYTE byPos 
//      ) 
// 
 
#define ComplementPosition(X)   ((X)^0x01) 
 
typedef struct _TRIE_KEY 
{ 
    DWORD   dwAddr; 
    DWORD   dwMask; 
    BYTE    byPosition; 
    BYTE    byLength; 
}TRIE_KEY, *PTRIE_KEY; 
 
// 
//  ULONG 
//  Length( 
//      IN PTRIE_KEY ptkKey 
//      ) 
// 
 
#define Length(X)    (X)->byLength 
 
typedef struct _TRIE_NODE TRIE_NODE *PTRIE_NODE; 
 
struct _TRIE_NODE 
{ 
    PTRIE_NODE  ptnParent; 
    PTRIE_NODE  ptnTrie[2]; 
    PTRIE_KEY   ptkKey[2]; 
    BYTE        byPosition; 
    BYTE        byIndex; 
}; 
 
// 
//  BYTE 
//  Index( 
//      IN PTRIE_NODE ptnNode 
//      ) 
// 
 
#define Index(X)    (X)->byIndex 
 
// 
//  PTRIE_NODE 
//  Parent( 
//      IN PTRIE_NODE ptnNode 
//      ) 
// 
 
#define Parent(X)   (X)->ptnParent 
 
// 
//  PTRIE_NODE 
//  LeftTrie( 
//      IN PTRIE_NODE ptnNode 
//      ) 
// 
 
#define LeftTrie(X) (X)->ptnTrie[LEFT] 
 
// 
//  PTRIE_NODE 
//  RightTrie( 
//      IN PTRIE_NODE ptnNode 
//      ) 
// 
 
#define RightTrie(X) (X)->ptnTrie[RIGHT] 
 
// 
//  PTRIE_NODE 
//  LeftKey( 
//      IN PTRIE_NODE ptnNode 
//      ) 
// 
 
#define LeftKey(X) (X)->rgptkKey[LEFT] 
 
// 
//  PTRIE_NODE 
//  RightKey( 
//      IN PTRIE_NODE ptnNode 
//      ) 
// 
 
#define RightKey(X) (X)->rgptkKey[RIGHT] 
 
// 
//  BOOL 
//  IsLeafNode( 
//      IN PTRIE_NODE ptnNode 
//      ) 
// 
 
#define IsLeafNode(X)   ((RightTrie((X)) == NULL) && (LeftTrie((X)) == NULL)) 
 
// 
//  BOOL 
//  IsSingleKeyNode( 
//      IN PTRIE_NODE ptnNode 
//      ) 
// 
 
#define IsSingleKeyNode(X) ((RightKey((X)) && (LeftKey((X)) == NULL)) ||    \ 
                            (LeftKey((X)) && (RightKey((X)) == NULL))) 
 
// 
//  BOOL 
//  IsSingleKeyLeafNode( 
//      IN PTRIE_NODE ptnNode 
//      ) 
// 
 
#define IsSingleKeyLeafNode(X) (IsLeafNode((X)) && IsSingleKeyNode((X))) 
 
// 
//  PTRIE_KEY 
//  GetKeyByPosition( 
//      IN PTRIE_NODE ptnNode, 
//      IN ULONG      ulPosition 
//      ) 
// 
 
#define GetKeyByPosition(X,Y)   ((X)->rgptkKey[(Y)]) 
 
// 
//  PTRIE_NODE 
//  GetSubTrieByPosition( 
//      IN PTRIE_NODE ptnNode, 
//      IN ULONG      ulPosition 
//      ) 
// 
 
#define GetSubTrieByPosition(X,Y)  ((X)->ptnNode[(Y)])