1// NodeTable.cpp
2
3#include "Debug.h"
4#include "NodeTable.h"
5
6// constructor
7NodeTable::NodeTable()
8	: fElementArray(1000),
9	  fNodes(1000, &fElementArray)
10{
11}
12
13// destructor
14NodeTable::~NodeTable()
15{
16}
17
18// InitCheck
19status_t
20NodeTable::InitCheck() const
21{
22	RETURN_ERROR(fNodes.InitCheck() && fElementArray.InitCheck()
23				 ? B_OK : B_NO_MEMORY);
24}
25
26// AddNode
27status_t
28NodeTable::AddNode(Node *node)
29{
30	status_t error = (node ? B_OK : B_BAD_VALUE);
31	if (error == B_OK) {
32		NodeHashElement *element
33			= fNodes.Add(NodeHashElement::HashForID(node));
34		if (element)
35			element->fNode = node;
36		else
37			SET_ERROR(error, B_NO_MEMORY);
38	}
39	return error;
40}
41
42// RemoveNode
43status_t
44NodeTable::RemoveNode(Node *node)
45{
46	status_t error = (node ? B_OK : B_BAD_VALUE);
47	if (error == B_OK)
48		error = RemoveNode(node->GetID());
49	return error;
50}
51
52// RemoveNode
53status_t
54NodeTable::RemoveNode(vnode_id id)
55{
56	status_t error = B_OK;
57	if (NodeHashElement *element = _FindElement(id))
58		fNodes.Remove(element);
59	else
60		error = B_ERROR;
61	return error;
62}
63
64// GetNode
65Node *
66NodeTable::GetNode(vnode_id id)
67{
68	Node *node = NULL;
69	if (NodeHashElement *element = _FindElement(id))
70		node = element->fNode;
71	return node;
72}
73
74// GetAllocationInfo
75void
76NodeTable::GetAllocationInfo(AllocationInfo &info)
77{
78	info.AddNodeTableAllocation(fNodes.ArraySize(), fNodes.VectorSize(),
79								sizeof(NodeHashElement),
80								fNodes.CountElements());
81}
82
83// _FindElement
84NodeHashElement *
85NodeTable::_FindElement(vnode_id id) const
86{
87	NodeHashElement *element
88		= fNodes.FindFirst(NodeHashElement::HashForID(id));
89	while (element && element->fNode->GetID() != id) {
90		if (element->fNext >= 0)
91			element = fNodes.ElementAt(element->fNext);
92		else
93			element = NULL;
94	}
95	return element;
96}
97
98