/src/lib/iterator/internal/avl_tree_iterator.e

http://github.com/tybor/Liberty · Specman e · 118 lines · 100 code · 15 blank · 3 comment · 7 complexity · 003d1bbb366285ad63e2afa14f46cff9 MD5 · raw file

  1. deferred class AVL_TREE_ITERATOR[E_]
  2. inherit
  3. RECYCLABLE
  4. -- 4
  5. -- 2 6
  6. -- 1 3 5 7
  7. feature {}
  8. nodes: STACK[AVL_TREE_NODE[E_]]
  9. cur: AVL_TREE_NODE[E_]
  10. go_leftmost (node: AVL_TREE_NODE[E_])
  11. require
  12. node = nodes.top
  13. local
  14. left: like node
  15. do
  16. left := node.left
  17. if left = Void then
  18. cur := node
  19. else
  20. nodes.push(left)
  21. go_leftmost(left)
  22. end
  23. end
  24. go_next_node (node: AVL_TREE_NODE[E_])
  25. require
  26. node = nodes.top
  27. local
  28. right: like node
  29. do
  30. if cur = node then
  31. right := node.right
  32. if right /= Void then
  33. nodes.pop
  34. nodes.push(right)
  35. go_leftmost(right)
  36. else
  37. nodes.pop
  38. if nodes.is_empty then
  39. cur := Void
  40. else
  41. cur := nodes.top
  42. end
  43. end
  44. else
  45. cur := node
  46. end
  47. end
  48. go_first (root: AVL_TREE_NODE[E_])
  49. do
  50. from
  51. until
  52. nodes.is_empty
  53. loop
  54. nodes.pop
  55. end
  56. nodes.push(root)
  57. go_leftmost(root)
  58. end
  59. go_next
  60. require
  61. not nodes.is_empty
  62. do
  63. go_next_node(nodes.top)
  64. end
  65. feature {ANY}
  66. generation: INTEGER
  67. feature {RECYCLING_POOL}
  68. recycle
  69. do
  70. nodes_pool.recycle(nodes)
  71. end
  72. feature {}
  73. new_nodes: like nodes
  74. do
  75. if nodes_pool.is_empty then
  76. create Result.make
  77. else
  78. Result := nodes_pool.item
  79. end
  80. end
  81. nodes_pool: RECYCLING_POOL[STACK[AVL_TREE_NODE[E_]]]
  82. local
  83. key: FIXED_STRING
  84. do
  85. Result := nodes_pool_memory
  86. if Result = Void then
  87. key := generating_type.intern
  88. Result ::= nodes_pools.fast_reference_at(key)
  89. if Result = Void then
  90. create Result.make
  91. nodes_pools.add(Result, key)
  92. end
  93. nodes_pool_memory := Result
  94. end
  95. end
  96. nodes_pool_memory: like nodes_pool
  97. nodes_pools: HASHED_DICTIONARY[RECYCLING_POOL[STACK[AVL_TREE_NODE_ANY]], FIXED_STRING]
  98. once
  99. create Result.make
  100. end
  101. invariant
  102. nodes /= Void
  103. end -- class AVL_TREE_ITERATOR