Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
85f64437
Commit
85f64437
authored
Jul 31, 2000
by
Peter Schneider-Kamp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
added count, extend, index, pop and remove to arraymodule
parent
795de228
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
233 additions
and
74 deletions
+233
-74
Doc/lib/libarray.tex
Doc/lib/libarray.tex
+23
-0
Doc/lib/libstdtypes.tex
Doc/lib/libstdtypes.tex
+2
-2
Lib/test/test_array.py
Lib/test/test_array.py
+40
-0
Modules/arraymodule.c
Modules/arraymodule.c
+168
-72
No files found.
Doc/lib/libarray.tex
View file @
85f64437
...
...
@@ -83,6 +83,14 @@ values, \exception{RuntimeError} is raised. It is useful when reading
data from a file written on a machine with a different byte order.
\end{methoddesc}
\begin{methoddesc}
[array]
{
count
}{
x
}
Return the number of occurences of
\var
{
x
}
in the array.
\end{methoddesc}
\begin{methoddesc}
[array]
{
extend
}{
a
}
Append array items from
\var
{
a
}
to the end of the array.
\end{methoddesc}
\begin{methoddesc}
[array]
{
fromfile
}{
f, n
}
Read
\var
{
n
}
items (as machine values) from the file object
\var
{
f
}
and append them to the end of the array. If less than
\var
{
n
}
items
...
...
@@ -104,11 +112,22 @@ array of machine values (i.e. as if it had been read from a
file using the
\method
{
fromfile()
}
method).
\end{methoddesc}
\begin{methoddesc}
[array]
{
index
}{
x
}
Return the smallest
\var
{
i
}
such that
\var
{
i
}
is the index of
the first occurence of
\var
{
x
}
in the array.
\end{methoddesc}
\begin{methoddesc}
[array]
{
insert
}{
i, x
}
Insert a new item with value
\var
{
x
}
in the array before position
\var
{
i
}
.
\end{methoddesc}
\begin{methoddesc}
[array]
{
pop
}{
\optional
{
i
}}
Removes the item with the index
\var
{
i
}
from the array and returns
it. The optional argument defaults to
\code
{
-1
}
, so that by default
the last item is removed and returned.
\end{methoddesc}
\begin{methoddesc}
[array]
{
read
}{
f, n
}
\deprecated
{
1.5.1
}
{
Use the
\method
{
fromfile()
}
method.
}
...
...
@@ -120,6 +139,10 @@ built-in file object; something else with a \method{read()} method won't
do.
\end{methoddesc}
\begin{methoddesc}
[array]
{
remove
}{
x
}
Remove the first occurence of
\var
{
x
}
from the array.
\end{methoddesc}
\begin{methoddesc}
[array]
{
reverse
}{}
Reverse the order of the items in the array.
\end{methoddesc}
...
...
Doc/lib/libstdtypes.tex
View file @
85f64437
...
...
@@ -506,8 +506,8 @@ Notes:
\item
[(3)]
Raises
\exception
{
ValueError
}
when
\var
{
x
}
is not found in
\var
{
s
}
.
\item
[(4)]
The
\method
{
pop()
}
method is experimental and
not supported
by other mutable sequence types than list
s. The optional argument
\item
[(4)]
The
\method
{
pop()
}
method is experimental and
at the moment
only supported by the list and array type
s. The optional argument
\var
{
i
}
defaults to
\code
{
-1
}
, so that by default the last item is
removed and returned.
...
...
Lib/test/test_array.py
View file @
85f64437
...
...
@@ -105,6 +105,26 @@ def testtype(type, example):
a
[
1
:
-
1
]
=
a
if
a
!=
array
.
array
(
type
,
"aabcdee"
):
raise
TestFailed
,
"array(%s) self-slice-assign (cntr)"
%
`type`
if
a
.
index
(
"e"
)
!=
5
:
raise
TestFailed
,
"array(%s) index-test"
%
`type`
if
a
.
count
(
"a"
)
!=
2
:
raise
TestFailed
,
"array(%s) count-test"
%
`type`
a
.
remove
(
"e"
)
if
a
!=
array
.
array
(
type
,
"aabcde"
):
raise
TestFailed
,
"array(%s) remove-test"
%
`type`
if
a
.
pop
(
0
)
!=
"a"
:
raise
TestFailed
,
"array(%s) pop-test"
%
`type`
if
a
.
pop
(
1
)
!=
"b"
:
raise
TestFailed
,
"array(%s) pop-test"
%
`type`
a
.
extend
(
array
.
array
(
type
,
"xyz"
))
if
a
!=
array
.
array
(
type
,
"acdexyz"
):
raise
TestFailed
,
"array(%s) extend-test"
%
`type`
a
.
pop
()
a
.
pop
()
a
.
pop
()
a
.
pop
()
if
a
!=
array
.
array
(
type
,
"acd"
):
raise
TestFailed
,
"array(%s) pop-test"
%
`type`
else
:
a
=
array
.
array
(
type
,
[
1
,
2
,
3
,
4
,
5
])
a
[:
-
1
]
=
a
...
...
@@ -118,6 +138,26 @@ def testtype(type, example):
a
[
1
:
-
1
]
=
a
if
a
!=
array
.
array
(
type
,
[
1
,
1
,
2
,
3
,
4
,
5
,
5
]):
raise
TestFailed
,
"array(%s) self-slice-assign (cntr)"
%
`type`
if
a
.
index
(
5
)
!=
5
:
raise
TestFailed
,
"array(%s) index-test"
%
`type`
if
a
.
count
(
1
)
!=
2
:
raise
TestFailed
,
"array(%s) count-test"
%
`type`
a
.
remove
(
5
)
if
a
!=
array
.
array
(
type
,
[
1
,
1
,
2
,
3
,
4
,
5
]):
raise
TestFailed
,
"array(%s) remove-test"
%
`type`
if
a
.
pop
(
0
)
!=
1
:
raise
TestFailed
,
"array(%s) pop-test"
%
`type`
if
a
.
pop
(
1
)
!=
2
:
raise
TestFailed
,
"array(%s) pop-test"
%
`type`
a
.
extend
(
array
.
array
(
type
,
[
7
,
8
,
9
]))
if
a
!=
array
.
array
(
type
,
[
1
,
3
,
4
,
5
,
7
,
8
,
9
]):
raise
TestFailed
,
"array(%s) extend-test"
%
`type`
a
.
pop
()
a
.
pop
()
a
.
pop
()
a
.
pop
()
if
a
!=
array
.
array
(
type
,
[
1
,
3
,
4
]):
raise
TestFailed
,
"array(%s) pop-test"
%
`type`
# test that overflow exceptions are raised as expected for assignment
# to array of specific integral types
...
...
Modules/arraymodule.c
View file @
85f64437
...
...
@@ -673,6 +673,163 @@ ins(arrayobject *self, int where, PyObject *v)
return
Py_None
;
}
static
PyObject
*
array_count
(
arrayobject
*
self
,
PyObject
*
args
)
{
int
count
=
0
;
int
i
;
PyObject
*
v
;
if
(
!
PyArg_ParseTuple
(
args
,
"O:count"
,
&
v
))
return
NULL
;
for
(
i
=
0
;
i
<
self
->
ob_size
;
i
++
)
{
PyObject
*
selfi
=
getarrayitem
((
PyObject
*
)
self
,
i
);
if
(
PyObject_Compare
(
selfi
,
v
)
==
0
)
count
++
;
Py_DECREF
(
selfi
);
if
(
PyErr_Occurred
())
return
NULL
;
}
return
PyInt_FromLong
((
long
)
count
);
}
static
char
count_doc
[]
=
"count (x)
\n
\
\n
\
Return number of occurences of x in the array."
;
static
PyObject
*
array_index
(
arrayobject
*
self
,
PyObject
*
args
)
{
int
i
;
PyObject
*
v
;
if
(
!
PyArg_ParseTuple
(
args
,
"O:index"
,
&
v
))
return
NULL
;
for
(
i
=
0
;
i
<
self
->
ob_size
;
i
++
)
{
PyObject
*
selfi
=
getarrayitem
((
PyObject
*
)
self
,
i
);
if
(
PyObject_Compare
(
selfi
,
v
)
==
0
)
{
Py_DECREF
(
selfi
);
return
PyInt_FromLong
((
long
)
i
);
}
Py_DECREF
(
selfi
);
if
(
PyErr_Occurred
())
return
NULL
;
}
PyErr_SetString
(
PyExc_ValueError
,
"array.index(x): x not in list"
);
return
NULL
;
}
static
char
index_doc
[]
=
"index (x)
\n
\
\n
\
Return index of first occurence of x in the array."
;
static
PyObject
*
array_remove
(
arrayobject
*
self
,
PyObject
*
args
)
{
int
i
;
PyObject
*
v
;
if
(
!
PyArg_ParseTuple
(
args
,
"O:remove"
,
&
v
))
return
NULL
;
for
(
i
=
0
;
i
<
self
->
ob_size
;
i
++
)
{
PyObject
*
selfi
=
getarrayitem
((
PyObject
*
)
self
,
i
);
if
(
PyObject_Compare
(
selfi
,
v
)
==
0
)
{
Py_DECREF
(
selfi
);
if
(
array_ass_slice
(
self
,
i
,
i
+
1
,
(
PyObject
*
)
NULL
)
!=
0
)
return
NULL
;
Py_INCREF
(
Py_None
);
return
Py_None
;
}
Py_DECREF
(
selfi
);
if
(
PyErr_Occurred
())
return
NULL
;
}
PyErr_SetString
(
PyExc_ValueError
,
"array.remove(x): x not in list"
);
return
NULL
;
}
static
char
remove_doc
[]
=
"remove (x)
\n
\
\n
\
Remove the first occurence of x in the array."
;
static
PyObject
*
array_pop
(
arrayobject
*
self
,
PyObject
*
args
)
{
int
i
=
-
1
;
PyObject
*
v
;
if
(
!
PyArg_ParseTuple
(
args
,
"|i:pop"
,
&
i
))
return
NULL
;
if
(
self
->
ob_size
==
0
)
{
/* Special-case most common failure cause */
PyErr_SetString
(
PyExc_IndexError
,
"pop from empty array"
);
return
NULL
;
}
if
(
i
<
0
)
i
+=
self
->
ob_size
;
if
(
i
<
0
||
i
>=
self
->
ob_size
)
{
PyErr_SetString
(
PyExc_IndexError
,
"pop index out of range"
);
return
NULL
;
}
v
=
getarrayitem
((
PyObject
*
)
self
,
i
);
if
(
array_ass_slice
(
self
,
i
,
i
+
1
,
(
PyObject
*
)
NULL
)
!=
0
)
{
Py_DECREF
(
v
);
return
NULL
;
}
return
v
;
}
static
char
pop_doc
[]
=
"pop ([i])
\n
\
\n
\
Return the i-th element and delete it from the array. i defaults to -1."
;
static
PyObject
*
array_extend
(
self
,
args
)
arrayobject
*
self
;
PyObject
*
args
;
{
int
size
;
PyObject
*
bb
;
arrayobject
*
np
;
if
(
!
PyArg_ParseTuple
(
args
,
"O:extend"
,
&
bb
))
return
NULL
;
if
(
!
is_arrayobject
(
bb
))
{
PyErr_Format
(
PyExc_TypeError
,
"can only append array (not
\"
%.200s
\"
) to array"
,
bb
->
ob_type
->
tp_name
);
return
NULL
;
}
#define b ((arrayobject *)bb)
if
(
self
->
ob_descr
!=
b
->
ob_descr
)
{
PyErr_SetString
(
PyExc_TypeError
,
"can only append arrays of same kind"
);
return
NULL
;
}
size
=
self
->
ob_size
+
b
->
ob_size
;
PyMem_RESIZE
(
self
->
ob_item
,
char
,
size
*
self
->
ob_descr
->
itemsize
);
if
(
self
->
ob_item
==
NULL
)
{
PyObject_Del
(
self
);
return
PyErr_NoMemory
();
}
memcpy
(
self
->
ob_item
+
self
->
ob_size
*
self
->
ob_descr
->
itemsize
,
b
->
ob_item
,
b
->
ob_size
*
b
->
ob_descr
->
itemsize
);
self
->
ob_size
=
size
;
Py_INCREF
(
Py_None
);
return
Py_None
;
#undef b
}
static
char
extend_doc
[]
=
"extend(array)
\n
\
\n
\
Append array items to the end of the array."
;
static
PyObject
*
array_insert
(
arrayobject
*
self
,
PyObject
*
args
)
{
...
...
@@ -816,74 +973,6 @@ static char reverse_doc [] =
\n
\
Reverse the order of the items in the array."
;
/* The following routines were adapted from listobject.c but not converted.
To make them work you will have to work! */
#if 0
static PyObject *
array_index(arrayobject *self, PyObject *args)
{
int i;
if (args == NULL) {
PyErr_BadArgument();
return NULL;
}
for (i = 0; i < self->ob_size; i++) {
if (PyObject_Compare(self->ob_item[i], args) == 0)
return PyInt_FromLong((long)i);
/* XXX PyErr_Occurred */
}
PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
return NULL;
}
#endif
#if 0
static PyObject *
array_count(arrayobject *self, PyObject *args)
{
int count = 0;
int i;
if (args == NULL) {
PyErr_BadArgument();
return NULL;
}
for (i = 0; i < self->ob_size; i++) {
if (PyObject_Compare(self->ob_item[i], args) == 0)
count++;
/* XXX PyErr_Occurred */
}
return PyInt_FromLong((long)count);
}
#endif
#if 0
static PyObject *
array_remove(arrayobject *self, PyObject *args)
{
int i;
if (args == NULL) {
PyErr_BadArgument();
return NULL;
}
for (i = 0; i < self->ob_size; i++) {
if (PyObject_Compare(self->ob_item[i], args) == 0) {
if (array_ass_slice(self, i, i+1,
(PyObject *)NULL) != 0)
return NULL;
Py_INCREF(Py_None);
return Py_None;
}
/* XXX PyErr_Occurred */
}
PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
return NULL;
}
#endif
static
PyObject
*
array_fromfile
(
arrayobject
*
self
,
PyObject
*
args
)
{
...
...
@@ -1095,16 +1184,18 @@ PyMethodDef array_methods[] = {
{
"buffer_info"
,
(
PyCFunction
)
array_buffer_info
,
0
,
buffer_info_doc
},
{
"byteswap"
,
(
PyCFunction
)
array_byteswap
,
METH_VARARGS
,
byteswap_doc
},
/* {"count", (method)array_count},*/
{
"count"
,
(
PyCFunction
)
array_count
,
1
,
count_doc
},
{
"extend"
,
(
PyCFunction
)
array_extend
,
1
,
extend_doc
},
{
"fromfile"
,
(
PyCFunction
)
array_fromfile
,
0
,
fromfile_doc
},
{
"fromlist"
,
(
PyCFunction
)
array_fromlist
,
0
,
fromlist_doc
},
{
"fromstring"
,
(
PyCFunction
)
array_fromstring
,
0
,
fromstring_doc
},
/* {"index", (method)array_index},*/
{
"index"
,
(
PyCFunction
)
array_index
,
1
,
index_doc
},
{
"insert"
,
(
PyCFunction
)
array_insert
,
0
,
insert_doc
},
{
"pop"
,
(
PyCFunction
)
array_pop
,
1
,
pop_doc
},
{
"read"
,
(
PyCFunction
)
array_fromfile
,
0
,
fromfile_doc
},
/* {"remove", (method)array_remove},*/
{
"remove"
,
(
PyCFunction
)
array_remove
,
1
,
remove_doc
},
{
"reverse"
,
(
PyCFunction
)
array_reverse
,
0
,
reverse_doc
},
/* {"sort", (
method)array_sort
},*/
/* {"sort", (
PyCFunction)array_sort, 0, sort_doc
},*/
{
"tofile"
,
(
PyCFunction
)
array_tofile
,
0
,
tofile_doc
},
{
"tolist"
,
(
PyCFunction
)
array_tolist
,
0
,
tolist_doc
},
{
"tostring"
,
(
PyCFunction
)
array_tostring
,
0
,
tostring_doc
},
...
...
@@ -1364,11 +1455,16 @@ Methods:\n\
append() -- append a new item to the end of the array
\n
\
buffer_info() -- return information giving the current memory info
\n
\
byteswap() -- byteswap all the items of the array
\n
\
count() -- return number of occurences of an object
\n
\
extend() -- extend array by appending array elements
\n
\
fromfile() -- read items from a file object
\n
\
fromlist() -- append items from the list
\n
\
fromstring() -- append items from the string
\n
\
index() -- return index of first occurence of an object
\n
\
insert() -- insert a new item into the array at a provided position
\n
\
pop() -- remove and return item (default last)
\n
\
read() -- DEPRECATED, use fromfile()
\n
\
remove() -- remove first occurence of an object
\n
\
reverse() -- reverse the order of the items in the array
\n
\
tofile() -- write all items to a file object
\n
\
tolist() -- return the array converted to an ordinary list
\n
\
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment