home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / netds / rras / lookup / structs.h < prev   
Encoding:
C/C++ Source or Header  |  1997-06-10  |  2.5 KB  |  172 lines

  1. /*++
  2.  
  3. Copyright (c) 1995  Microsoft Corporation
  4.  
  5. Module Name:
  6.  
  7.     net\ip\lookup\structs.h
  8.  
  9. Abstract:
  10.  
  11.  
  12. Revision History:
  13.  
  14.  
  15.  
  16. --*/
  17.  
  18. #ifndef __LOOKUP_STRUCTS_H__
  19. #define __LOOKUP_STRUCTS_H__
  20.  
  21. #define LEFT    0
  22. #define RIGHT   1
  23.  
  24. //
  25. //  BYTE
  26. //  ComplementPosition(
  27. //      IN BYTE byPos
  28. //      )
  29. //
  30.  
  31. #define ComplementPosition(X)   ((X)^0x01)
  32.  
  33. typedef struct _TRIE_KEY
  34. {
  35.     DWORD   dwAddr;
  36.     DWORD   dwMask;
  37.     BYTE    byPosition;
  38.     BYTE    byLength;
  39. }TRIE_KEY, *PTRIE_KEY;
  40.  
  41. //
  42. //  ULONG
  43. //  Length(
  44. //      IN PTRIE_KEY ptkKey
  45. //      )
  46. //
  47.  
  48. #define Length(X)    (X)->byLength
  49.  
  50. typedef struct _TRIE_NODE TRIE_NODE *PTRIE_NODE;
  51.  
  52. struct _TRIE_NODE
  53. {
  54.     PTRIE_NODE  ptnParent;
  55.     PTRIE_NODE  ptnTrie[2];
  56.     PTRIE_KEY   ptkKey[2];
  57.     BYTE        byPosition;
  58.     BYTE        byIndex;
  59. };
  60.  
  61. //
  62. //  BYTE
  63. //  Index(
  64. //      IN PTRIE_NODE ptnNode
  65. //      )
  66. //
  67.  
  68. #define Index(X)    (X)->byIndex
  69.  
  70. //
  71. //  PTRIE_NODE
  72. //  Parent(
  73. //      IN PTRIE_NODE ptnNode
  74. //      )
  75. //
  76.  
  77. #define Parent(X)   (X)->ptnParent
  78.  
  79. //
  80. //  PTRIE_NODE
  81. //  LeftTrie(
  82. //      IN PTRIE_NODE ptnNode
  83. //      )
  84. //
  85.  
  86. #define LeftTrie(X) (X)->ptnTrie[LEFT]
  87.  
  88. //
  89. //  PTRIE_NODE
  90. //  RightTrie(
  91. //      IN PTRIE_NODE ptnNode
  92. //      )
  93. //
  94.  
  95. #define RightTrie(X) (X)->ptnTrie[RIGHT]
  96.  
  97. //
  98. //  PTRIE_NODE
  99. //  LeftKey(
  100. //      IN PTRIE_NODE ptnNode
  101. //      )
  102. //
  103.  
  104. #define LeftKey(X) (X)->rgptkKey[LEFT]
  105.  
  106. //
  107. //  PTRIE_NODE
  108. //  RightKey(
  109. //      IN PTRIE_NODE ptnNode
  110. //      )
  111. //
  112.  
  113. #define RightKey(X) (X)->rgptkKey[RIGHT]
  114.  
  115. //
  116. //  BOOL
  117. //  IsLeafNode(
  118. //      IN PTRIE_NODE ptnNode
  119. //      )
  120. //
  121.  
  122. #define IsLeafNode(X)   ((RightTrie((X)) == NULL) && (LeftTrie((X)) == NULL))
  123.  
  124. //
  125. //  BOOL
  126. //  IsSingleKeyNode(
  127. //      IN PTRIE_NODE ptnNode
  128. //      )
  129. //
  130.  
  131. #define IsSingleKeyNode(X) ((RightKey((X)) && (LeftKey((X)) == NULL)) ||    \
  132.                             (LeftKey((X)) && (RightKey((X)) == NULL)))
  133.  
  134. //
  135. //  BOOL
  136. //  IsSingleKeyLeafNode(
  137. //      IN PTRIE_NODE ptnNode
  138. //      )
  139. //
  140.  
  141. #define IsSingleKeyLeafNode(X) (IsLeafNode((X)) && IsSingleKeyNode((X)))
  142.  
  143. //
  144. //  PTRIE_KEY
  145. //  GetKeyByPosition(
  146. //      IN PTRIE_NODE ptnNode,
  147. //      IN ULONG      ulPosition
  148. //      )
  149. //
  150.  
  151. #define GetKeyByPosition(X,Y)   ((X)->rgptkKey[(Y)])
  152.  
  153. //
  154. //  PTRIE_NODE
  155. //  GetSubTrieByPosition(
  156. //      IN PTRIE_NODE ptnNode,
  157. //      IN ULONG      ulPosition
  158. //      )
  159. //
  160.  
  161. #define GetSubTrieByPosition(X,Y)  ((X)->ptnNode[(Y)])
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.     
  171.  
  172.