1
from pypy.objspace.std.objspace import W_Object, OperationError
2
from pypy.objspace.std.objspace import registerimplementation, register_all
3
from pypy.rlib.objectmodel import r_dict
4
from pypy.rlib.rarithmetic import intmask, r_uint
5
from pypy.interpreter import gateway
7
class W_BaseSetObject(W_Object):
9
def __init__(w_self, space, setdata=None):
11
w_self.setdata = r_dict(space.eq_w, space.hash_w)
13
w_self.setdata = setdata.copy()
16
"""representation for debugging purposes"""
17
reprlist = [repr(w_item) for w_item in w_self.setdata.keys()]
18
return "<%s(%s)>" % (w_self.__class__.__name__, ', '.join(reprlist))
20
def _newobj(w_self, space, rdict_w=None):
21
#return space.call(space.type(w_self),W_SetIterObject(rdict_w))
22
objtype = type(w_self)
23
if objtype is W_SetObject:
24
obj = W_SetObject(space, rdict_w)
25
elif objtype is W_FrozensetObject:
26
obj = W_FrozensetObject(space, rdict_w)
28
itemiterator = space.iter(W_SetIterObject(rdict_w))
29
obj = space.call_function(space.type(w_self),itemiterator)
32
class W_SetObject(W_BaseSetObject):
33
from pypy.objspace.std.settype import set_typedef as typedef
35
class W_FrozensetObject(W_BaseSetObject):
36
from pypy.objspace.std.frozensettype import frozenset_typedef as typedef
38
def __init__(w_self, space, setdata):
39
W_BaseSetObject.__init__(w_self, space, setdata)
42
registerimplementation(W_SetObject)
43
registerimplementation(W_FrozensetObject)
45
class W_SetIterObject(W_Object):
46
from pypy.objspace.std.settype import setiter_typedef as typedef
48
def __init__(w_self, setdata):
49
w_self.content = content = setdata
50
w_self.len = len(content)
52
w_self.iterator = w_self.content.iterkeys()
54
def next_entry(w_self):
55
for w_key in w_self.iterator:
60
registerimplementation(W_SetIterObject)
62
def iter__SetIterObject(space, w_setiter):
65
def next__SetIterObject(space, w_setiter):
66
content = w_setiter.content
67
if content is not None:
68
if w_setiter.len != len(content):
69
w_setiter.len = -1 # Make this error state sticky
70
raise OperationError(space.w_RuntimeError,
71
space.wrap("dictionary changed size during iteration"))
72
# look for the next entry
73
w_result = w_setiter.next_entry()
74
if w_result is not None:
78
w_setiter.content = None
79
raise OperationError(space.w_StopIteration, space.w_None)
81
def len__SetIterObject(space, w_setiter):
82
content = w_setiter.content
83
if content is None or w_setiter.len == -1:
85
return space.wrap(w_setiter.len - w_setiter.pos)
87
# some helper functions
89
def make_setdata_from_w_iterable(space, w_iterable=None):
90
data = r_dict(space.eq_w, space.hash_w)
91
if w_iterable is not None:
92
w_iterator = space.iter(w_iterable)
95
w_item = space.next(w_iterator)
96
except OperationError, e:
97
if not e.match(space, space.w_StopIteration):
103
def _initialize_set(space, w_obj, w_iterable=None):
104
w_obj.setdata.clear()
105
if w_iterable is not None:
106
w_obj.setdata.update(make_setdata_from_w_iterable(space, w_iterable))
108
# helper functions for set operation on dicts
110
def _is_frozenset_exact(w_obj):
111
if (w_obj is not None) and (type(w_obj) is W_FrozensetObject):
116
def _is_eq(w_left, w_right):
117
if len(w_left.setdata) != len(w_right.setdata):
119
for w_key in w_left.setdata:
120
if w_key not in w_right.setdata:
124
def _union_dict(ldict, rdict, isupdate):
132
def _difference_dict(ldict, rdict, isupdate):
140
del_list_w.append(w_key)
141
for w_key in del_list_w:
146
def _intersection_dict(ldict, rdict, isupdate):
153
if w_key not in rdict:
154
del_list_w.append(w_key)
156
for w_key in del_list_w:
162
def _symmetric_difference_dict(ldict, rdict, isupdate):
171
del_list_w.append(w_key)
175
add_list_w.append(w_key)
177
for w_key in del_list_w:
180
for w_key in add_list_w:
185
#end helper functions
187
def set_update__Set_Set(space, w_left, w_other):
188
ld, rd = w_left.setdata, w_other.setdata
189
new_ld, rd = _union_dict(ld, rd, True)
192
set_update__Set_Frozenset = set_update__Set_Set
194
def set_update__Set_ANY(space, w_left, w_other):
195
"""Update a set with the union of itself and another."""
196
ld, rd = w_left.setdata, make_setdata_from_w_iterable(space, w_other)
197
new_ld, rd = _union_dict(ld, rd, True)
200
def inplace_or__Set_Set(space, w_left, w_other):
201
set_update__Set_Set(space, w_left, w_other)
204
inplace_or__Set_Frozenset = inplace_or__Set_Set
206
def set_add__Set_ANY(space, w_left, w_other):
207
"""Add an element to a set.
209
This has no effect if the element is already present.
211
w_left.setdata[w_other] = None
214
def set_copy__Set(space, w_set):
215
return w_set._newobj(space,w_set.setdata)
217
def frozenset_copy__Frozenset(space, w_left):
218
if _is_frozenset_exact(w_left):
221
return set_copy__Set(space,w_left)
223
def set_clear__Set(space, w_left):
224
w_left.setdata.clear()
227
def set_difference__Set_Set(space, w_left, w_other):
228
ld, rd = w_left.setdata, w_other.setdata
229
new_ld, rd = _difference_dict(ld, rd, False)
230
return w_left._newobj(space, new_ld)
232
set_difference__Set_Frozenset = set_difference__Set_Set
233
frozenset_difference__Frozenset_Set = set_difference__Set_Set
234
frozenset_difference__Frozenset_Frozenset = set_difference__Set_Set
235
sub__Set_Set = set_difference__Set_Set
236
sub__Set_Frozenset = set_difference__Set_Set
237
sub__Frozenset_Set = set_difference__Set_Set
238
sub__Frozenset_Frozenset = set_difference__Set_Set
240
def set_difference__Set_ANY(space, w_left, w_other):
241
ld, rd = w_left.setdata, make_setdata_from_w_iterable(space, w_other)
242
new_ld, rd = _difference_dict(ld, rd, False)
243
return w_left._newobj(space, new_ld)
245
frozenset_difference__Frozenset_ANY = set_difference__Set_ANY
248
def set_difference_update__Set_Set(space, w_left, w_other):
249
ld, rd = w_left.setdata, w_other.setdata
250
new_ld, rd = _difference_dict(ld, rd, True)
253
set_difference_update__Set_Frozenset = set_difference_update__Set_Set
255
def set_difference_update__Set_ANY(space, w_left, w_other):
256
ld, rd = w_left.setdata, make_setdata_from_w_iterable(space, w_other)
257
new_ld, rd = _difference_dict(ld, rd, True)
260
def inplace_sub__Set_Set(space, w_left, w_other):
261
set_difference_update__Set_Set(space, w_left, w_other)
264
inplace_sub__Set_Frozenset = inplace_sub__Set_Set
266
def eq__Set_Set(space, w_left, w_other):
267
return space.wrap(_is_eq(w_left, w_other))
269
eq__Set_Frozenset = eq__Set_Set
270
eq__Frozenset_Frozenset = eq__Set_Set
271
eq__Frozenset_Set = eq__Set_Set
273
def eq__Set_ANY(space, w_left, w_other):
276
eq__Frozenset_ANY = eq__Set_ANY
278
def contains__Set_Set(space, w_left, w_other):
279
w_f = space.newfrozenset(w_other.setdata)
280
return space.newbool(w_f in w_left.setdata)
282
contains__Frozenset_Set = contains__Set_Set
284
def contains__Set_ANY(space, w_left, w_other):
285
return space.newbool(w_other in w_left.setdata)
287
contains__Frozenset_ANY = contains__Set_ANY
289
def set_issubset__Set_Set(space, w_left, w_other):
290
if space.is_w(w_left, w_other):
292
ld, rd = w_left.setdata, w_other.setdata
293
if len(ld) > len(rd):
301
set_issubset__Set_Frozenset = set_issubset__Set_Set
302
frozenset_issubset__Frozenset_Set = set_issubset__Set_Set
303
frozenset_issubset__Frozenset_Frozenset = set_issubset__Set_Set
305
def set_issubset__Set_ANY(space, w_left, w_other):
306
if space.is_w(w_left, w_other):
309
ld, rd = w_left.setdata, make_setdata_from_w_iterable(space, w_other)
310
if len(ld) > len(rd):
318
frozenset_issubset__Frozenset_ANY = set_issubset__Set_ANY
320
le__Set_Set = set_issubset__Set_Set
321
le__Set_Frozenset = set_issubset__Set_Set
322
le__Frozenset_Frozenset = set_issubset__Set_Set
324
def set_issuperset__Set_Set(space, w_left, w_other):
325
if space.is_w(w_left, w_other):
328
ld, rd = w_left.setdata, w_other.setdata
329
if len(ld) < len(rd):
337
set_issuperset__Set_Frozenset = set_issuperset__Set_Set
338
set_issuperset__Frozenset_Set = set_issuperset__Set_Set
339
set_issuperset__Frozenset_Frozenset = set_issuperset__Set_Set
341
def set_issuperset__Set_ANY(space, w_left, w_other):
342
if space.is_w(w_left, w_other):
345
ld, rd = w_left.setdata, make_setdata_from_w_iterable(space, w_other)
346
if len(ld) < len(rd):
354
frozenset_issuperset__Frozenset_ANY = set_issuperset__Set_ANY
356
ge__Set_Set = set_issuperset__Set_Set
357
ge__Set_Frozenset = set_issuperset__Set_Set
358
ge__Frozenset_Frozenset = set_issuperset__Set_Set
360
def set_discard__Set_Set(space, w_left, w_item):
361
w_f = space.newfrozenset(w_item.setdata)
362
if w_f in w_left.setdata:
363
del w_left.setdata[w_f]
365
def set_discard__Set_ANY(space, w_left, w_item):
366
if w_item in w_left.setdata:
367
del w_left.setdata[w_item]
369
def set_remove__Set_Set(space, w_left, w_item):
370
w_f = space.newfrozenset(w_item.setdata)
372
del w_left.setdata[w_f]
374
raise OperationError(space.w_KeyError,
375
space.call_method(w_item,'__repr__'))
377
def set_remove__Set_ANY(space, w_left, w_item):
379
del w_left.setdata[w_item]
381
raise OperationError(space.w_KeyError,
382
space.call_method(w_item,'__repr__'))
384
def hash__Frozenset(space, w_set):
385
multi = r_uint(1822399083) + r_uint(1822399083) + 1
387
return space.wrap(w_set.hash)
389
hash *= (len(w_set.setdata) + 1)
390
for w_item in w_set.setdata:
391
h = space.hash_w(w_item)
392
value = ((h ^ (h << 16) ^ 89869747) * multi)
393
hash = intmask(hash ^ value)
394
hash = hash * 69069 + 907133923
400
return space.wrap(hash)
402
def set_pop__Set(space, w_left):
403
if len(w_left.setdata) == 0:
404
raise OperationError(space.w_KeyError,
405
space.wrap('pop from an empty set'))
406
w_keys = w_left.setdata.keys()
408
del w_left.setdata[w_value]
412
def set_intersection__Set_Set(space, w_left, w_other):
413
ld, rd = w_left.setdata, w_other.setdata
414
new_ld, rd = _intersection_dict(ld, rd, False)
415
return w_left._newobj(space,new_ld)
417
set_intersection__Set_Frozenset = set_intersection__Set_Set
418
set_intersection__Frozenset_Frozenset = set_intersection__Set_Set
419
set_intersection__Frozenset_Set = set_intersection__Set_Set
421
def set_intersection__Set_ANY(space, w_left, w_other):
422
ld, rd = w_left.setdata, make_setdata_from_w_iterable(space, w_other)
423
new_ld, rd = _intersection_dict(ld, rd, False)
424
return w_left._newobj(space,new_ld)
426
frozenset_intersection__Frozenset_ANY = set_intersection__Set_ANY
428
and__Set_Set = set_intersection__Set_Set
429
and__Set_Frozenset = set_intersection__Set_Set
430
and__Frozenset_Set = set_intersection__Set_Set
431
and__Frozenset_Frozenset = set_intersection__Set_Set
433
def set_intersection_update__Set_Set(space, w_left, w_other):
434
ld, rd = w_left.setdata, w_other.setdata
435
new_ld, rd = _intersection_dict(ld, rd, True)
438
set_intersection_update__Set_Frozenset = set_intersection_update__Set_Set
440
def set_intersection_update__Set_ANY(space, w_left, w_other):
441
ld, rd = w_left.setdata, make_setdata_from_w_iterable(space, w_other)
442
new_ld, rd = _intersection_dict(ld, rd, True)
445
def inplace_and__Set_Set(space, w_left, w_other):
446
set_intersection_update__Set_Set(space, w_left, w_other)
449
inplace_and__Set_Frozenset = inplace_and__Set_Set
451
def set_symmetric_difference__Set_Set(space, w_left, w_other):
452
ld, rd = w_left.setdata, w_other.setdata
453
new_ld, rd = _symmetric_difference_dict(ld, rd, False)
454
return w_left._newobj(space, new_ld)
456
set_symmetric_difference__Set_Frozenset = set_symmetric_difference__Set_Set
457
set_symmetric_difference__Frozenset_Set = set_symmetric_difference__Set_Set
458
set_symmetric_difference__Frozenset_Frozenset = \
459
set_symmetric_difference__Set_Set
461
xor__Set_Set = set_symmetric_difference__Set_Set
462
xor__Set_Frozenset = set_symmetric_difference__Set_Set
463
xor__Frozenset_Set = set_symmetric_difference__Set_Set
464
xor__Frozenset_Frozenset = set_symmetric_difference__Set_Set
467
def set_symmetric_difference__Set_ANY(space, w_left, w_other):
468
ld, rd = w_left.setdata, make_setdata_from_w_iterable(space, w_other)
469
new_ld, rd = _symmetric_difference_dict(ld, rd, False)
470
return w_left._newobj(space, new_ld)
472
frozenset_symmetric_difference__Frozenset_ANY = \
473
set_symmetric_difference__Set_ANY
475
def set_symmetric_difference_update__Set_Set(space, w_left, w_other):
476
ld, rd = w_left.setdata, w_other.setdata
477
new_ld, rd = _symmetric_difference_dict(ld, rd, True)
480
set_symmetric_difference_update__Set_Frozenset = \
481
set_symmetric_difference_update__Set_Set
483
def set_symmetric_difference_update__Set_ANY(space, w_left, w_other):
484
ld, rd = w_left.setdata, make_setdata_from_w_iterable(space, w_other)
485
new_ld, rd = _symmetric_difference_dict(ld, rd, True)
488
def inplace_xor__Set_Set(space, w_left, w_other):
489
set_symmetric_difference_update__Set_Set(space, w_left, w_other)
492
inplace_xor__Set_Frozenset = inplace_xor__Set_Set
494
def set_union__Set_Set(space, w_left, w_other):
495
ld, rd = w_left.setdata, w_other.setdata
496
new_ld, rd = _union_dict(ld, rd, False)
497
return w_left._newobj(space, new_ld)
499
set_union__Set_Frozenset = set_union__Set_Set
500
set_union__Frozenset_Set = set_union__Set_Set
501
set_union__Frozenset_Frozenset = set_union__Set_Set
502
or__Set_Set = set_union__Set_Set
503
or__Set_Frozenset = set_union__Set_Set
504
or__Frozenset_Set = set_union__Set_Set
505
or__Frozenset_Frozenset = set_union__Set_Set
508
def set_union__Set_ANY(space, w_left, w_other):
509
ld, rd = w_left.setdata, make_setdata_from_w_iterable(space, w_other)
510
new_ld, rd = _union_dict(ld, rd, False)
511
return w_left._newobj(space, new_ld)
513
frozenset_union__Frozenset_ANY = set_union__Set_ANY
515
def len__Set(space, w_left):
516
return space.newint(len(w_left.setdata))
518
len__Frozenset = len__Set
520
def iter__Set(space, w_left):
521
return W_SetIterObject(w_left.setdata)
523
iter__Frozenset = iter__Set
525
def cmp__Set_Set(space, w_left, w_other):
526
raise OperationError(space.w_TypeError,
527
space.wrap('cannot compare sets using cmp()'))
529
cmp__Set_Frozenset = cmp__Set_Set
530
cmp__Frozenset_Frozenset = cmp__Set_Set
531
cmp__Frozenset_Set = cmp__Set_Set
533
def init__Set(space, w_set, __args__):
534
w_iterable, = __args__.parse('set',
535
(['some_iterable'], None, None),
536
[space.newtuple([])])
537
_initialize_set(space, w_set, w_iterable)
539
def init__Frozenset(space, w_set, __args__):
540
w_iterable, = __args__.parse('set',
541
(['some_iterable'], None, None),
542
[space.newtuple([])])
544
_initialize_set(space, w_set, w_iterable)
545
hash__Frozenset(space, w_set)
547
app = gateway.applevel("""
548
def ne__Set_ANY(s, o):
551
def gt__Set_Set(s, o):
552
return s != o and s.issuperset(o)
554
def lt__Set_Set(s, o):
555
return s != o and s.issubset(o)
558
return '%s(%s)' % (s.__class__.__name__, [x for x in s])
561
dict = getattr(s,'__dict__', None)
562
return (s.__class__, (tuple(s),), dict)
564
""", filename=__file__)
566
ne__Set_ANY = app.interphook("ne__Set_ANY")
567
ne__Frozenset_ANY = ne__Set_ANY
569
gt__Set_Set = app.interphook("gt__Set_Set")
570
gt__Set_Frozenset = gt__Set_Set
571
gt__Frozenset_Set = gt__Set_Set
572
gt__Frozenset_Frozenset = gt__Set_Set
574
lt__Set_Set = app.interphook("lt__Set_Set")
575
lt__Set_Frozenset = lt__Set_Set
576
lt__Frozenset_Set = lt__Set_Set
577
lt__Frozenset_Frozenset = lt__Set_Set
579
repr__Set = app.interphook('repr__Set')
580
repr__Frozenset = app.interphook('repr__Set')
582
set_reduce__Set = app.interphook('reduce__Set')
583
frozenset_reduce__Frozenset = app.interphook('reduce__Set')
585
from pypy.objspace.std import frozensettype
586
from pypy.objspace.std import settype
588
register_all(vars(), settype, frozensettype)