~bzr-pqm/bzr/bzr.dev

4679.3.5 by John Arbash Meinel
Have a pure-python implementation that works as tuples of tuples of strings,
1
# Copyright (C) 2009 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
4679.3.41 by John Arbash Meinel
Finish switching the naming to StaticTuple.
17
"""The pure-python implementation of the StaticTuple type.
4679.3.5 by John Arbash Meinel
Have a pure-python implementation that works as tuples of tuples of strings,
18
19
Note that it is generally just implemented as using tuples of tuples of
20
strings.
21
"""
22
23
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
24
class StaticTuple(tuple):
4679.3.41 by John Arbash Meinel
Finish switching the naming to StaticTuple.
25
    """A static type, similar to a tuple of strings."""
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
26
4771.1.1 by John Arbash Meinel
Don't allow extra attributes on the pure-python StaticTuple.
27
    __slots__ = ()
28
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
29
    def __new__(cls, *args):
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
30
        # Make the empty StaticTuple a singleton
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
31
        if not args and _empty_tuple is not None:
32
            return _empty_tuple
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
33
        return tuple.__new__(cls, args)
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
34
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
35
    def __init__(self, *args):
4679.3.41 by John Arbash Meinel
Finish switching the naming to StaticTuple.
36
        """Create a new 'StaticTuple'"""
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
37
        for bit in args:
4759.2.9 by John Arbash Meinel
Implement support for lots of types.
38
            if type(bit) not in (str, StaticTuple, unicode, int, long, float,
4759.2.8 by John Arbash Meinel
Set up a test suite for hash() and richcompare against lots of acceptable types.
39
                                 None.__class__, bool):
40
                raise TypeError('StaticTuple can only point to'
4759.2.9 by John Arbash Meinel
Implement support for lots of types.
41
                    ' StaticTuple, str, unicode, int, long, float, bool, or'
42
                    ' None not %s' % (type(bit),))
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
43
        num_keys = len(args)
4679.3.42 by John Arbash Meinel
Implement comparison support when using nested StaticTuple objects.
44
        if num_keys < 0 or num_keys > 255:
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
45
            raise ValueError('must have 1 => 256 key bits')
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
46
        # We don't need to pass args to tuple.__init__, because that was
47
        # already handled in __new__.
48
        tuple.__init__(self)
49
4679.3.79 by John Arbash Meinel
Change the repr to print out 'StaticTuple'
50
    def __repr__(self):
51
        return '%s%s' % (self.__class__.__name__, tuple.__repr__(self))
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
52
4759.2.15 by Matt Nordhoff
Add a __reduce__ method to the Python version
53
    def __reduce__(self):
54
        return (StaticTuple, tuple(self))
55
4759.2.2 by John Arbash Meinel
Update _static_tuple_py.py with the same concatenation behavior
56
    def __add__(self, other):
57
        """Concatenate self with other"""
58
        return StaticTuple.from_sequence(tuple.__add__(self,other))
59
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
60
    def as_tuple(self):
4789.28.3 by John Arbash Meinel
Add a static_tuple.as_tuples() helper.
61
        return tuple(self)
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
62
4679.3.30 by John Arbash Meinel
Interning with a regular 'dict' is a tradeoff for bzr.dev of:
63
    def intern(self):
4679.3.51 by John Arbash Meinel
Add a _static_tuple_c.pxd file to define the C api to pyrex code.
64
        return _interned_tuples.setdefault(self, self)
4679.3.30 by John Arbash Meinel
Interning with a regular 'dict' is a tradeoff for bzr.dev of:
65
4739.4.1 by John Arbash Meinel
Implement StaticTuple.from_sequence()
66
    @staticmethod
67
    def from_sequence(seq):
68
        """Convert a sequence object into a StaticTuple instance."""
69
        if isinstance(seq, StaticTuple):
70
            # it already is
71
            return seq
72
        return StaticTuple(*seq)
73
74
4679.3.16 by John Arbash Meinel
Initial work for a Key class.
75
4679.5.4 by John Arbash Meinel
Add a comment to help Matthew Nordhoff understand why we have:
76
# Have to set it to None first, so that __new__ can determine whether
77
# the _empty_tuple singleton has been created yet or not.
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
78
_empty_tuple = None
79
_empty_tuple = StaticTuple()
4679.3.51 by John Arbash Meinel
Add a _static_tuple_c.pxd file to define the C api to pyrex code.
80
_interned_tuples = {}