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 = {} |