~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
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
27
    def __new__(cls, *args):
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
28
        # Make the empty StaticTuple a singleton
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
29
        if not args and _empty_tuple is not None:
30
            return _empty_tuple
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
31
        return tuple.__new__(cls, args)
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
32
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
33
    def __init__(self, *args):
4679.3.41 by John Arbash Meinel
Finish switching the naming to StaticTuple.
34
        """Create a new 'StaticTuple'"""
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
35
        for bit in args:
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
36
            if type(bit) not in (str, StaticTuple):
4679.3.42 by John Arbash Meinel
Implement comparison support when using nested StaticTuple objects.
37
                raise TypeError('key bits must be strings or StaticTuple')
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
38
        num_keys = len(args)
4679.3.42 by John Arbash Meinel
Implement comparison support when using nested StaticTuple objects.
39
        if num_keys < 0 or num_keys > 255:
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
40
            raise ValueError('must have 1 => 256 key bits')
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
41
        # We don't need to pass args to tuple.__init__, because that was
42
        # already handled in __new__.
43
        tuple.__init__(self)
44
4679.3.79 by John Arbash Meinel
Change the repr to print out 'StaticTuple'
45
    def __repr__(self):
46
        return '%s%s' % (self.__class__.__name__, tuple.__repr__(self))
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
47
48
    def as_tuple(self):
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
49
        return self
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
50
4679.3.30 by John Arbash Meinel
Interning with a regular 'dict' is a tradeoff for bzr.dev of:
51
    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.
52
        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:
53
4679.3.16 by John Arbash Meinel
Initial work for a Key class.
54
4679.5.4 by John Arbash Meinel
Add a comment to help Matthew Nordhoff understand why we have:
55
# Have to set it to None first, so that __new__ can determine whether
56
# 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.
57
_empty_tuple = None
58
_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.
59
_interned_tuples = {}