mirror of
https://github.com/python/cpython.git
synced 2025-08-29 05:05:03 +00:00
Finally implement tuple*number. From now on all sequence types
must (pretend to) support all operations except assignments; if you don't want to support an operation you have to provide a dummy function that raises an exception...
This commit is contained in:
parent
85e3b01f3b
commit
b8393da8f8
1 changed files with 33 additions and 1 deletions
|
@ -259,10 +259,42 @@ tupleconcat(a, bb)
|
||||||
#undef b
|
#undef b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static object *
|
||||||
|
tuplerepeat(a, n)
|
||||||
|
tupleobject *a;
|
||||||
|
int n;
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
int size;
|
||||||
|
tupleobject *np;
|
||||||
|
object **p;
|
||||||
|
if (n < 0)
|
||||||
|
n = 0;
|
||||||
|
if (a->ob_size*n == a->ob_size) {
|
||||||
|
/* Since tuples are immutable, we can return a shared
|
||||||
|
copy in this case */
|
||||||
|
INCREF(a);
|
||||||
|
return (object *)a;
|
||||||
|
}
|
||||||
|
size = a->ob_size * n;
|
||||||
|
np = (tupleobject *) newtupleobject(size);
|
||||||
|
if (np == NULL)
|
||||||
|
return NULL;
|
||||||
|
p = np->ob_item;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
for (j = 0; j < a->ob_size; j++) {
|
||||||
|
*p = a->ob_item[j];
|
||||||
|
INCREF(*p);
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (object *) np;
|
||||||
|
}
|
||||||
|
|
||||||
static sequence_methods tuple_as_sequence = {
|
static sequence_methods tuple_as_sequence = {
|
||||||
tuplelength, /*sq_length*/
|
tuplelength, /*sq_length*/
|
||||||
tupleconcat, /*sq_concat*/
|
tupleconcat, /*sq_concat*/
|
||||||
0, /*sq_repeat*/
|
tuplerepeat, /*sq_repeat*/
|
||||||
tupleitem, /*sq_item*/
|
tupleitem, /*sq_item*/
|
||||||
tupleslice, /*sq_slice*/
|
tupleslice, /*sq_slice*/
|
||||||
0, /*sq_ass_item*/
|
0, /*sq_ass_item*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue