• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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