1 import threading
2
3 from collections import OrderedDict
4 from concurrent_tree_crawler.abstract_node import AbstractNode, NodeState
5
7 """A simple in-memory implementation of the L{AbstractNode}."""
8
10 """
11 @type parent: L{StandardNode}, equals C{None} if node is
12 the sentinel node
13 @type name: string
14 @type state: L{NodeState}
15 """
16 self.__parent = parent
17
18 self.__name = name
19
20 self.__state = state
21
22 self._children = \
23 [OrderedDict() for _ in xrange(NodeState.MAX_ENUM_INDEX+1)]
24 """Array indexed by the L{NodeState} enumeration index"""
25
26 self.__cond = threading.Condition()
27
30
33
36
38 if self.__parent is not None:
39 child_found = False
40 for state in xrange(NodeState.MAX_ENUM_INDEX+1):
41 if self.__name in self.__parent._children[state]:
42 del self.__parent._children[state][self.__name]
43 child_found = True
44 break
45 assert child_found, "This node not found among parent's children"
46 self.__parent._children[new_state][self.__name] = self
47 self.__state = new_state
48
51
53 for state in xrange(NodeState.MAX_ENUM_INDEX+1):
54 if name in self._children[state]:
55 return True
56 return False
57
59 for state in xrange(NodeState.MAX_ENUM_INDEX+1):
60 if name in self._children[state]:
61 return self._children[state][name]
62 assert False, "Child with given name not found"
63
65 children = []
66 for state in xrange(NodeState.MAX_ENUM_INDEX+1):
67 for (_, node) in self._children[state].iteritems():
68 children.append(node)
69 return children
70
72 assert name not in self._children[state]
73 new_child = StandardNode(self, name, state)
74 self._children[state][name] = new_child
75 return new_child
76
78 return len(self._children[state]) > 0
79