INDEX CLUSTER FEATURES SHORT FRAMES NO FRAMES

indexing

description: "Trees, without commitment to a particular representation"
title: "EiffelBase: library of reusable components for Eiffel. ", "Based on EiffelBase library for ISE Eiffel, ", "used with permission. "
project: "EiffelBase Library"
copyright: "(c) 1986-1997 Interactive Software Engineering Inc. ", "Modifications and extensions: ", "(c) 1997-2001 Object Tools ", "All rights reserved. Duplication and distribution prohibited", "May be used only with Visual Eiffel under terms of user ", "license "
key: "tree"
cluster: eiffelbase
deferred class TREE [G]
inherit

CONTAINER [G]
end
feature -- Access

parent: like Current

child: like parent
-- Current child node
require
readable: readable_child

item: G
-- Item in current node

child_item: G
-- Item in current child node
require
readable: child_readable

child_cursor: CURSOR
-- Current cursor position

child_index: INTEGER
-- Index of current child
ensure
valid_index: Result >= 0 and Result <= arity + 1

first_child: like parent
-- Leftmost child
require
is_not_leaf: not is_leaf

last_child: like parent
-- Right most child
require
is_not_leaf: not is_leaf

left_sibling: like parent
-- Left neighbor (if any)
require
is_not_root: not is_root
ensure
is_sibling: is_sibling (Result)
right_is_current: (Result /= void) implies (Result.right_sibling = Current)

right_sibling: like parent
-- Right neighbor (if any)
require
is_not_root: not is_root
ensure
is_sibling: is_sibling (Result)
left_is_current: (Result /= void) implies (Result.left_sibling = Current)

has (v: G): BOOLEAN
-- Does subtree include `v'?
-- (Reference or object equality,
-- based on `object_comparison'.)

is_sibling (other: like parent): BOOLEAN
-- Are current node and `other' siblings?
ensure
not_root: Result implies not is_root
other_not_root: Result implies not other.is_root
same_parent: Result = (not is_root and other.parent = parent)
feature -- Measurement

arity: INTEGER
-- Number of children

count: INTEGER
-- Number of items
feature -- Status report

readable: BOOLEAN

child_readable: BOOLEAN
-- Is there a current `child_item' to be read?

readable_child: BOOLEAN
-- Is there a current child to be read?

writable: BOOLEAN

child_writable: BOOLEAN
-- Is there a current `child_item' that may be modified?

writable_child: BOOLEAN
-- Is there a current child that may be modified?

child_off: BOOLEAN
-- Is there no current child?

child_before: BOOLEAN
-- Is there no valid child position to the left of cursor?

child_after: BOOLEAN
-- Is there no valid child position to the right of cursor?

empty: BOOLEAN
-- Is structure empty of items?

is_leaf: BOOLEAN
-- Are there no children?

is_root: BOOLEAN
-- Is there no parent?

child_isfirst: BOOLEAN
-- Is cursor under first child?
ensure
not_is_leaf: Result implies not is_leaf

child_islast: BOOLEAN
-- Is cursor under last child?
ensure
not_is_leaf: Result implies not is_leaf

valid_cursor_index (i: INTEGER): BOOLEAN
-- Is `i' correctly bounded for cursor movement?
ensure
valid_cursor_index_definition: Result = ((i >= 0) and (i <= arity + 1))
feature -- Cursor movement

child_go_to (p: CURSOR)
-- Move cursor to position `p'.

child_start
-- Move cursor to first child.
ensure
is_first_child: not is_leaf implies child_isfirst

child_finish
-- Move cursor to last child.
ensure
is_last_child: not is_leaf implies child_islast

child_forth
-- Move cursor to next child.

child_back
-- Move cursor to previous child.

child_go_i_th (i: INTEGER)
-- Move cursor to `i'-th child.
require
valid_cursor_index: valid_cursor_index (i)
ensure
position: child_index = i
is_before: (i = 0) implies child_before
is_after: (i = arity + 1) implies child_after
feature -- Element change

sprout
-- Make current node a root.

put, replace (v: G)
-- Replace element at cursor position by `v'.
require
is_writable: writable
ensure
item_inserted: item = v

child_put, child_replace (v: G)
-- Put `v' at current child position.
require
child_writable: child_writable
ensure
item_inserted: child_item = v

replace_child (n: like parent)
-- Put `n' at current child position.
require
writable_child: writable_child
was_root: n.is_root
ensure
child_replaced: child = n

prune (n: TREE [G])
-- Remove `n' from the children
require
is_child: n.parent = Current
ensure
n_is_root: n.is_root

fill (other: TREE [G])
-- Fill with as many items of `other' as possible.
-- The representations of `other' and current node
-- need not be the same.
feature -- Conversion

linear_representation: LINEAR [G]
-- Representation as a linear structure

binary_representation: BINARY_TREE [G]
-- Convert to binary tree representation:
-- first child becomes left child,
-- right sibling becomes right child.
ensure
result_is_root: Result.is_root
result_has_no_right_child: not Result.has_right
feature -- Duplication

duplicate (n: INTEGER): like Current
-- Copy of sub-tree beginning at cursor position and
-- having min (`n', `arity' - `child_index' + 1)
-- children.
require
not_child_off: not child_off
valid_sublist: n >= 0
invariant

leaf_definition: is_leaf = (arity = 0)
child_off_definition: child_off = (child_before or child_after)
child_before_definition: child_before = (child_index = 0)
child_isfirst_definition: child_isfirst = (not is_leaf and child_index = 1)
child_islast_definition: child_islast = (not is_leaf and child_index = arity)
child_after_definition: child_after = (child_index >= arity + 1)
child_consistency: child_readable implies child.parent = Current
end -- class TREE

INDEX CLUSTER FEATURES SHORT FRAMES NO FRAMES