gtkrbtree.inc 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. // included by gtk2.pas
  2. {$IFDEF read_forward_definitions}
  3. {$ENDIF read_forward_definitions}
  4. //------------------------------------------------------------------------------
  5. {$IFDEF read_interface_types}
  6. PGtkRBNodeColor = ^TGtkRBNodeColor;
  7. TGtkRBNodeColor = longint;
  8. PGtkRBTree = ^TGtkRBTree;
  9. PGtkRBNode = ^TGtkRBNode;
  10. TGtkRBTreeTraverseFunc = procedure (tree:PGtkRBTree; node:PGtkRBNode; data:gpointer); cdecl;
  11. TGtkRBTree = record
  12. root : PGtkRBNode;
  13. _nil : PGtkRBNode;
  14. parent_tree : PGtkRBTree;
  15. parent_node : PGtkRBNode;
  16. end;
  17. { We keep track of whether the aggregate count of children plus 1
  18. for the node itself comes to an even number. The parity flag is
  19. the total count of children mod 2, where the total count of
  20. children gets computed in the same way that the total offset gets
  21. computed. i.e. not the same as the "count" field below which
  22. doesn't include children. We could replace parity with a
  23. full-size int field here, and then take % 2 to get the parity flag,
  24. but that would use extra memory.
  25. }
  26. { count is the number of nodes beneath us, plus 1 for ourselves.
  27. i.e. node->left->count + node->right->count + 1
  28. }
  29. { this is the total of sizes of
  30. node->left, node->right, our own height, and the height
  31. of all trees in ->children, iff children exists because
  32. the thing is expanded.
  33. }
  34. { Child trees }
  35. TGtkRBNode = record
  36. flag0 : word;
  37. left : PGtkRBNode;
  38. right : PGtkRBNode;
  39. parent : PGtkRBNode;
  40. count : gint;
  41. offset : gint;
  42. children : PGtkRBTree;
  43. end;
  44. {$ENDIF read_interface_types}
  45. //------------------------------------------------------------------------------
  46. {$IFDEF read_interface_rest}
  47. const
  48. GTK_RBNODE_BLACK = 1 shl 0;
  49. GTK_RBNODE_RED = 1 shl 1;
  50. GTK_RBNODE_IS_PARENT = 1 shl 2;
  51. GTK_RBNODE_IS_SELECTED = 1 shl 3;
  52. GTK_RBNODE_IS_PRELIT = 1 shl 4;
  53. GTK_RBNODE_IS_SEMI_COLLAPSED = 1 shl 5;
  54. GTK_RBNODE_IS_SEMI_EXPANDED = 1 shl 6;
  55. GTK_RBNODE_INVALID = 1 shl 7;
  56. GTK_RBNODE_COLUMN_INVALID = 1 shl 8;
  57. GTK_RBNODE_DESCENDANTS_INVALID = 1 shl 9;
  58. GTK_RBNODE_NON_COLORS = GTK_RBNODE_IS_PARENT
  59. or GTK_RBNODE_IS_SELECTED
  60. or GTK_RBNODE_IS_PRELIT
  61. or GTK_RBNODE_IS_SEMI_COLLAPSED
  62. or GTK_RBNODE_IS_SEMI_EXPANDED
  63. or GTK_RBNODE_INVALID
  64. or GTK_RBNODE_COLUMN_INVALID
  65. or GTK_RBNODE_DESCENDANTS_INVALID;
  66. const
  67. bm_TGtkRBNode_flags = $3FFF;
  68. bp_TGtkRBNode_flags = 0;
  69. bm_TGtkRBNode_parity = $4000;
  70. bp_TGtkRBNode_parity = 14;
  71. function flags(a : PGtkRBNode) : guint;
  72. procedure set_flags(a : PGtkRBNode; __flags : guint);
  73. function parity(a : PGtkRBNode) : guint;
  74. procedure set_parity(a : PGtkRBNode; __parity : guint);
  75. function GTK_RBNODE_GET_COLOR(node: PGtkRBNode) : guint;
  76. procedure GTK_RBNODE_SET_COLOR(node: PGtkRBNode; color: guint);
  77. function GTK_RBNODE_GET_HEIGHT(node: PGtkRBNode) : gint;
  78. procedure GTK_RBNODE_SET_FLAG(node: PGtkRBNode; flag: word);
  79. procedure GTK_RBNODE_UNSET_FLAG(node: PGtkRBNode; flag: word);
  80. function GTK_RBNODE_FLAG_SET(node: PGtkRBNode; flag : guint) : boolean;
  81. procedure _gtk_rbtree_push_allocator(allocator:PGAllocator); cdecl; external gtklib;
  82. procedure _gtk_rbtree_pop_allocator; cdecl; external gtklib;
  83. function _gtk_rbtree_new:PGtkRBTree; cdecl; external gtklib;
  84. procedure _gtk_rbtree_free(tree:PGtkRBTree); cdecl; external gtklib;
  85. procedure _gtk_rbtree_remove(tree:PGtkRBTree); cdecl; external gtklib;
  86. procedure _gtk_rbtree_destroy(tree:PGtkRBTree); cdecl; external gtklib;
  87. function _gtk_rbtree_insert_before(tree:PGtkRBTree; node:PGtkRBNode; height:gint; valid:gboolean):PGtkRBNode; cdecl; external gtklib;
  88. function _gtk_rbtree_insert_after(tree:PGtkRBTree; node:PGtkRBNode; height:gint; valid:gboolean):PGtkRBNode; cdecl; external gtklib;
  89. procedure _gtk_rbtree_remove_node(tree:PGtkRBTree; node:PGtkRBNode); cdecl; external gtklib;
  90. procedure _gtk_rbtree_reorder(tree:PGtkRBTree; new_order:Pgint; length:gint); cdecl; external gtklib;
  91. function _gtk_rbtree_find_count(tree:PGtkRBTree; count:gint):PGtkRBNode; cdecl; external gtklib;
  92. procedure _gtk_rbtree_node_set_height(tree:PGtkRBTree; node:PGtkRBNode; height:gint); cdecl; external gtklib;
  93. procedure _gtk_rbtree_node_mark_invalid(tree:PGtkRBTree; node:PGtkRBNode); cdecl; external gtklib;
  94. procedure _gtk_rbtree_node_mark_valid(tree:PGtkRBTree; node:PGtkRBNode); cdecl; external gtklib;
  95. procedure _gtk_rbtree_column_invalid(tree:PGtkRBTree); cdecl; external gtklib;
  96. procedure _gtk_rbtree_mark_invalid(tree:PGtkRBTree); cdecl; external gtklib;
  97. procedure _gtk_rbtree_set_fixed_height(tree:PGtkRBTree; height:gint); cdecl; external gtklib;
  98. function _gtk_rbtree_node_find_offset(tree:PGtkRBTree; node:PGtkRBNode):gint; cdecl; external gtklib;
  99. function _gtk_rbtree_node_find_parity(tree:PGtkRBTree; node:PGtkRBNode):gint; cdecl; external gtklib;
  100. function _gtk_rbtree_find_offset(tree:PGtkRBTree; offset:gint; var new_tree:PGtkRBTree; var new_node:PGtkRBNode):gint; cdecl; external gtklib;
  101. procedure _gtk_rbtree_traverse(tree:PGtkRBTree; node:PGtkRBNode; order:TGTraverseType; func:TGtkRBTreeTraverseFunc; data:gpointer); cdecl; external gtklib;
  102. function _gtk_rbtree_next(tree:PGtkRBTree; node:PGtkRBNode):PGtkRBNode; cdecl; external gtklib;
  103. function _gtk_rbtree_prev(tree:PGtkRBTree; node:PGtkRBNode):PGtkRBNode; cdecl; external gtklib;
  104. procedure _gtk_rbtree_next_full(tree:PGtkRBTree; node:PGtkRBNode; var new_tree:PGtkRBTree; var new_node:PGtkRBNode); cdecl; external gtklib;
  105. procedure _gtk_rbtree_prev_full(tree:PGtkRBTree; node:PGtkRBNode; var new_tree:PGtkRBTree; var new_node:PGtkRBNode); cdecl; external gtklib;
  106. function _gtk_rbtree_get_depth(tree:PGtkRBTree):gint; cdecl; external gtklib;
  107. { This func checks the integrity of the tree }
  108. {$ifdef G_ENABLE_DEBUG }
  109. procedure _gtk_rbtree_test(where:Pgchar; tree:PGtkRBTree); cdecl; external gtklib;
  110. procedure _gtk_rbtree_debug_spew(tree:PGtkRBTree); cdecl; external gtklib;
  111. {$endif}
  112. {$ENDIF read_interface_rest}
  113. //------------------------------------------------------------------------------
  114. {$IFDEF read_implementation}
  115. function flags(a : PGtkRBNode) : guint;
  116. begin
  117. flags:=(a^.flag0 and bm_TGtkRBNode_flags) shr bp_TGtkRBNode_flags;
  118. end;
  119. procedure set_flags(a : PGtkRBNode; __flags : guint);
  120. begin
  121. a^.flag0:=a^.flag0 or ((__flags shl bp_TGtkRBNode_flags) and bm_TGtkRBNode_flags);
  122. end;
  123. function parity(a : PGtkRBNode) : guint;
  124. begin
  125. parity:=(a^.flag0 and bm_TGtkRBNode_parity) shr bp_TGtkRBNode_parity;
  126. end;
  127. procedure set_parity(a : PGtkRBNode; __parity : guint);
  128. begin
  129. a^.flag0:=a^.flag0 or ((__parity shl bp_TGtkRBNode_parity) and bm_TGtkRBNode_parity);
  130. end;
  131. function GTK_RBNODE_GET_COLOR(node : PGtkRBNode) : guint;
  132. begin
  133. if node=nil then
  134. Result:=GTK_RBNODE_BLACK
  135. else
  136. if (flags(node) and GTK_RBNODE_RED) = GTK_RBNODE_RED then
  137. Result:=GTK_RBNODE_RED
  138. else
  139. Result:=GTK_RBNODE_BLACK;
  140. end;
  141. procedure GTK_RBNODE_SET_COLOR(node : PGtkRBNode; color: guint);
  142. begin
  143. if node=nil then exit;
  144. if ((flags(node) and color)<>color) then
  145. set_flags(node,flags(node) xor (GTK_RBNODE_RED or GTK_RBNODE_BLACK));
  146. end;
  147. function GTK_RBNODE_GET_HEIGHT(node : PGtkRBNode) : gint;
  148. var
  149. if_local1 : gint;
  150. begin
  151. if node^.children<>nil then
  152. if_local1:=node^.children^.root^.offset
  153. else
  154. if_local1:=0;
  155. GTK_RBNODE_GET_HEIGHT:=node^.offset -
  156. (node^.left^.offset + node^.right^.offset + if_local1);
  157. end;
  158. function GTK_RBNODE_FLAG_SET(node: PGtkRBNode; flag : guint) : boolean;
  159. begin
  160. GTK_RBNODE_FLAG_SET:=(node<>nil) and ((flags(node) and flag) = flag);
  161. end;
  162. procedure GTK_RBNODE_SET_FLAG(node: PGtkRBNode; flag: word);
  163. begin
  164. set_flags(node,flag or flags(node));
  165. end;
  166. procedure GTK_RBNODE_UNSET_FLAG(node: PGtkRBNode; flag: word);
  167. begin
  168. set_flags(node,(not flag) and flags(node));
  169. end;
  170. {$ENDIF read_implementation}
  171. // included by gtk2.pas