/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/intset.py

  • Committer: John Arbash Meinel
  • Date: 2010-01-12 22:51:31 UTC
  • mto: This revision was merged to the branch mainline in revision 4955.
  • Revision ID: john@arbash-meinel.com-20100112225131-he8h411p6aeeb947
Delay grabbing an output stream until we actually go to show a diff.

This makes the test suite happy, but it also seems to be reasonable.
If we aren't going to write anything, we don't need to hold an
output stream open.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#! /usr/bin/python
2
 
 
3
1
# Copyright (C) 2005 Canonical Ltd
4
 
 
 
2
#
5
3
# This program is free software; you can redistribute it and/or modify
6
4
# it under the terms of the GNU General Public License as published by
7
5
# the Free Software Foundation; either version 2 of the License, or
8
6
# (at your option) any later version.
9
 
 
 
7
#
10
8
# This program is distributed in the hope that it will be useful,
11
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
11
# GNU General Public License for more details.
14
 
 
 
12
#
15
13
# You should have received a copy of the GNU General Public License
16
14
# along with this program; if not, write to the Free Software
17
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
16
 
19
17
# Author: Martin Pool <mbp@canonical.com>
20
18
 
62
60
    True
63
61
    >>> list(a)
64
62
    [10]
65
 
    
 
63
 
66
64
    """
67
65
    __slots__ = ['_val']
68
66
 
73
71
            If specified, an initial collection of values.
74
72
        """
75
73
        self._val = bitmask
76
 
        if values != None:
 
74
        if values is not None:
77
75
            self.update(values)
78
76
 
79
77
 
82
80
 
83
81
        >>> bool(IntSet())
84
82
        False
85
 
        
 
83
 
86
84
        >>> bool(IntSet([0]))
87
85
        True
88
86
        """
131
129
        """
132
130
        if not isinstance(other, IntSet):
133
131
            raise NotImplementedError(type(other))
134
 
        return IntSet(bitmask=(self._val | other._val))        
 
132
        return IntSet(bitmask=(self._val | other._val))
135
133
 
136
134
 
137
135
    def __eq__(self, other):
151
149
 
152
150
 
153
151
    def __contains__(self, i):
154
 
        assert i >= 0
155
152
        return self._val & (1L << i)
156
153
 
157
154
 
172
169
            v = v >> 1
173
170
            o = o + 1
174
171
 
175
 
        
 
172
 
176
173
    def update(self, to_add):
177
174
        """Add all the values from the sequence or intset to_add"""
178
175
        if isinstance(to_add, IntSet):
179
176
            self._val |= to_add._val
180
177
        else:
181
178
            for i in to_add:
182
 
                assert i >= 0
183
179
                self._val |= (1L << i)
184
180
 
185
181
 
186
182
    def add(self, to_add):
187
 
        assert 0 <= to_add
188
183
        self._val |= (1L << to_add)
189
184
 
190
185
 
205
200
        >>> not a
206
201
        True
207
202
        """
208
 
        assert 0 <= to_remove
209
203
        m = 1L << to_remove
210
204
        if not self._val & m:
211
205
            raise KeyError(to_remove)
212
206
        self._val ^= m
213
 
        
214
 
        
215
 
            
216
 
    
217
 
 
218
 
if __name__ == '__main__':
219
 
    import doctest
220
 
    doctest.testmod()
221
 
    
 
207
 
 
208
    def set_remove(self, to_remove):
 
209
        """Remove all values that exist in to_remove.
 
210
 
 
211
        >>> a = IntSet(range(10))
 
212
        >>> b = IntSet([2,3,4,7,12])
 
213
        >>> a.set_remove(b)
 
214
        >>> list(a)
 
215
        [0, 1, 5, 6, 8, 9]
 
216
        >>> a.set_remove([1,2,5])
 
217
        >>> list(a)
 
218
        [0, 6, 8, 9]
 
219
        """
 
220
        if not isinstance(to_remove, IntSet):
 
221
            self.set_remove(IntSet(to_remove))
 
222
            return
 
223
        intersect = self._val & to_remove._val
 
224
        self._val ^= intersect
 
225