2 package net.pterodactylus.util.data;
4 import java.util.Iterator;
7 * A node that can be stored in a {@link Tree}. A node has exactly one parent
8 * (which is <code>null</code> if the node is the {@link Tree#getRootNode()}
9 * of the tree) and an arbitrary amount of child nodes.
11 * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
13 * The type of the element to store
15 public interface Node<E> extends Iterable<Node<E>> {
18 * Returns the parent node of the node.
20 * @return The parent node
22 public Node<E> getParent();
25 * Returns the element that is stored in the node.
27 * @return The node’s element
29 public E getElement();
32 * Adds an element as a child to this node and returns the created node.
35 * The child node’s element
36 * @return The created child node
38 public Node<E> addChild(E child);
41 * Returns the number of children this node has.
43 * @return The number of children
48 * Returns the child at the given index.
51 * The index of the child
52 * @return The child at the given index
54 public Node<E> getChild(int index);
57 * Returns the direct child node that contains the given element.
61 * @return The direct child node containing the given element, or
62 * <code>null</code> if this node does not have a child node
63 * containing the given element
65 public Node<E> getChild(E element);
68 * Returns whether the given node is a direct child of this node.
72 * @return <code>true</code> if the given node is a direct child of this
73 * node, <code>false</code> otherwise
75 public boolean hasChild(Node<E> childNode);
78 * Returns whether this node contains a child node containing the given
83 * @return <code>true</code> if this node contains a direct child node
84 * containing the given element, <code>false</code> otherwise
86 public boolean hasChild(E element);
89 * Returns the index of the given child node.
93 * @return The index of the child node, or <code>-1</code> if the child
94 * node is not a child node of this node
96 public int getIndexOfChild(Node<E> childNode);
99 * Returns the index of the child node containing the given element.
103 * @return The index of the child node, or <code>-1</code> if the child
104 * node is not a child node of this node
106 public int getIndexOfChild(E element);
109 * Remove the given child node from this node. If the given node is not a
110 * child of this node, nothing happens.
113 * The child node to remove
115 public void removeChild(Node<E> childNode);
118 * Removes the child node that contains the given element. The element in
119 * the node is checked using {@link Object#equals(Object)}.
122 * The child element to remove
124 public void removeChild(E child);
127 * Removes the child at the given index.
130 * The index of the child to remove
132 public void removeChild(int childIndex);
135 * Removes all children from this node.
137 public void removeAllChildren();
142 public Iterator<Node<E>> iterator();
145 * Searches this node’s children recursively for a node that contains the
149 * The element to search
150 * @return The node that contains the given element, or <code>null</code>
151 * if no node could be found
153 public Node<E> findChild(E element);