164 lines
4.9 KiB
Python

# RTEMS Tools Project (http://www.rtems.org/)
# Copyright 2010-2015 Chris Johns (chrisj@rtems.org)
# All rights reserved.
#
# This file is part of the RTEMS Tools package in 'rtems-tools'.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
#
# RTEMS Red/Black Tree Support
#
import gdb
rbt_left = 0
rbt_right = 1
def opp_dir(dir_):
if dir_ == rbt_left:
return rbt_right
return rbt_left
class node:
"""Manage the RBTree_Node_struct."""
def __init__(self, node_ptr):
self.node_ptr = node_ptr
self.node_val = None
if node_ptr != 0:
print '}}}}'
self.node_val = node_ptr.dereference()
def __str__(self):
return self.to_string()
def null(self):
if not self.node_val:
return True
return False
def pointer(self):
return self.node_ptr
def parent(self):
if not self.null():
return self.node_val['parent']
return None
def child(self):
if not self.null():
return self.node_val['child']
return None
def left(self):
if not self.null():
return self.node_val['child'][rbt_left]
return None
def right(self):
if not self.null():
return self.node_val['child'][rbt_right]
return None
def next(self, dir_):
next_ = None
if not self.null():
current = self.child(color, dir_)
if current is not None:
while current is not None:
cn = node(current)
current = cn.child(opp_dir(dir_))
next_ = current
else:
# RBTree_Node *parent = node->parent;
# if ( parent->parent && node == parent->child[ opp_dir ] ) {
#
# node->parent
if self.parent():
# pn = *(node->parent) or pn = *parent
pn = node(self.parent())
if pn.parent() and (self.pointer() == pn.child(opp_dir(dir_))):
next_ = self.parent()
else:
nn = self
while pn.parent():
if nn.pointer() != pn.child(dir_):
break
nn = pn
pn = node(pn.parent())
if pn.parent():
next_ = pn.pointer()
return next_
def predecessor(self):
return self.next(rbt_left)
def successor(self):
return self.next(rbt_right)
def color(self):
if not self.null():
return self.node_val['color']
return None
def cast(self, typename):
if not self.null():
nodetype = gdb.lookup_type(typename)
return self.node_val.cast(nodetype)
return None
def off_tree(self):
if parent.null():
return True
return False
def to_string(self):
if self.null():
return 'NULL'
print ']]] here'
return 'Parent:%s Child:%s Color:%s' % (self.node_val['parent'],
self.node_val['child'],
self.node_val['color'])
class control:
"""Manage the RBTree_Control."""
def __init__(self, ctrl):
self.ctrl = ctrl
def root(self):
"""Return the root node of the RBT."""
return node(self.ctrl['root'])
def first(self, dir_):
""" Return the min or max nodes of this RBT."""
return node(self.ctrl['first'][dir_])
def empty(self):
if self.root().null():
return True
return False