1#!/usr/bin/env python 2#coding:utf-8 3# Author: mozman -- <mozman@gmx.at> 4# Purpose: TreeSlice 5# Created: 11.04.2011 6# Copyright (c) 2010-2013 by Manfred Moitzi 7# License: MIT License 8 9 10class TreeSlice(object): 11 __slots__ = ['_tree', '_start', '_stop'] 12 13 def __init__(self, tree, start, stop): 14 self._tree = tree 15 self._start = start 16 self._stop = stop 17 18 def __repr__(self): 19 tpl = "%s({%s})" % (self._tree.__class__.__name__, '%s') 20 return tpl % ", ".join( ("%r: %r" % item for item in self.items()) ) 21 22 def __contains__(self, key): 23 if self._inrange(key): 24 return key in self._tree 25 else: 26 return False 27 28 def _inrange(self, key): 29 if self._start is not None and key < self._start: 30 return False 31 if self._stop is not None and key >= self._stop: 32 return False 33 return True 34 35 def __getitem__(self, key): 36 if isinstance(key, slice): 37 return self._subslice(key.start, key.stop) 38 if self._inrange(key): 39 return self._tree[key] 40 else: 41 raise KeyError(key) 42 43 def _subslice(self, start, stop): 44 def newstart(): 45 if start is None: 46 return self._start 47 elif self._start is None: 48 return start 49 else: 50 return max(start, self._start) 51 52 def newstop(): 53 if stop is None: 54 return self._stop 55 elif self._stop is None: 56 return stop 57 else: 58 return min(stop, self._stop) 59 60 return TreeSlice(self._tree, newstart(), newstop()) 61 62 def keys(self): 63 return self._tree.keyslice(self._start, self._stop) 64 __iter__ = keys 65 66 def values(self): 67 return self._tree.valueslice(self._start, self._stop) 68 69 def items(self): 70 return self._tree.itemslice(self._start, self._stop) 71