summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorMoshe Zadka <moshez@math.huji.ac.il>2000-11-30 12:31:03 (GMT)
committerMoshe Zadka <moshez@math.huji.ac.il>2000-11-30 12:31:03 (GMT)
commit1a62750eda22dcef1976f4a3dbaa886039cd2f92 (patch)
tree291193bd5c8e1c6cb83b1087cb2b935bf82e4a8c /Objects
parent827bb9fb3c6c3889c046404df171a0b8f383eb23 (diff)
downloadcpython-1a62750eda22dcef1976f4a3dbaa886039cd2f92.zip
cpython-1a62750eda22dcef1976f4a3dbaa886039cd2f92.tar.gz
cpython-1a62750eda22dcef1976f4a3dbaa886039cd2f92.tar.bz2
Added .first{item,value,key}() to dictionaries.
Complete with docos and tests. OKed by Guido.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/dictobject.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 7be1c67..ecc94cd 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -709,6 +709,75 @@ static PyMappingMethods dict_as_mapping = {
};
static PyObject *
+dict_firstkey(register dictobject *mp, PyObject *args)
+{
+ register int i;
+
+ if (!PyArg_NoArgs(args))
+ return NULL;
+ if (mp->ma_used == 0) {
+ PyErr_SetString(PyExc_ValueError, "empty dictionary");
+ return NULL;
+ }
+ for (i = 0; i < mp->ma_size; i++) {
+ if (mp->ma_table[i].me_value != NULL) {
+ PyObject *key = mp->ma_table[i].me_key;
+ Py_INCREF(key);
+ return key;
+ }
+ }
+}
+
+static PyObject *
+dict_firstvalue(register dictobject *mp, PyObject *args)
+{
+ register int i;
+
+ if (!PyArg_NoArgs(args))
+ return NULL;
+ if (mp->ma_used == 0) {
+ PyErr_SetString(PyExc_ValueError, "empty dictionary");
+ return NULL;
+ }
+ for (i = 0; i < mp->ma_size; i++) {
+ if (mp->ma_table[i].me_value != NULL) {
+ PyObject *value = mp->ma_table[i].me_value;
+ Py_INCREF(value);
+ return value;
+ }
+ }
+}
+
+static PyObject *
+dict_firstitem(register dictobject *mp, PyObject *args)
+{
+ register int i;
+
+ if (!PyArg_NoArgs(args))
+ return NULL;
+ if (mp->ma_used == 0) {
+ PyErr_SetString(PyExc_ValueError, "empty dictionary");
+ return NULL;
+ }
+ for (i = 0; i < mp->ma_size; i++) {
+ if (mp->ma_table[i].me_value != NULL) {
+ PyObject *key = mp->ma_table[i].me_key;
+ PyObject *value = mp->ma_table[i].me_value;
+ PyObject *item = PyTuple_New(2);
+ if (item == NULL) {
+ return NULL;
+ }
+ Py_INCREF(key);
+ PyTuple_SetItem(item, 0, key);
+ Py_INCREF(value);
+ PyTuple_SetItem(item, 1, value);
+ return item;
+ }
+ }
+}
+
+
+static PyObject *
dict_keys(register dictobject *mp, PyObject *args)
{
register PyObject *v;
@@ -1162,6 +1231,9 @@ static PyMethodDef mapp_methods[] = {
{"keys", (PyCFunction)dict_keys},
{"items", (PyCFunction)dict_items},
{"values", (PyCFunction)dict_values},
+ {"firstkey", (PyCFunction)dict_firstkey},
+ {"firstitem", (PyCFunction)dict_firstitem},
+ {"firstvalue", (PyCFunction)dict_firstvalue},
{"update", (PyCFunction)dict_update},
{"clear", (PyCFunction)dict_clear},
{"copy", (PyCFunction)dict_copy},