Changeset 391 for python/trunk/Modules/_bisectmodule.c
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Modules/_bisectmodule.c
r2 r391 9 9 internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi) 10 10 { 11 PyObject *litem; 12 Py_ssize_t mid, res; 13 14 if (lo < 0) { 15 PyErr_SetString(PyExc_ValueError, "lo must be non-negative"); 16 return -1; 17 } 18 if (hi == -1) { 19 hi = PySequence_Size(list); 20 if (hi < 0) 21 return -1; 22 } 23 while (lo < hi) { 24 mid = (lo + hi) / 2; 25 litem = PySequence_GetItem(list, mid); 26 if (litem == NULL) 27 return -1; 28 res = PyObject_RichCompareBool(item, litem, Py_LT); 29 Py_DECREF(litem); 30 if (res < 0) 31 return -1; 32 if (res) 33 hi = mid; 34 else 35 lo = mid + 1; 36 } 37 return lo; 11 PyObject *litem; 12 Py_ssize_t mid, res; 13 14 if (lo < 0) { 15 PyErr_SetString(PyExc_ValueError, "lo must be non-negative"); 16 return -1; 17 } 18 if (hi == -1) { 19 hi = PySequence_Size(list); 20 if (hi < 0) 21 return -1; 22 } 23 while (lo < hi) { 24 /* The (size_t)cast ensures that the addition and subsequent division 25 are performed as unsigned operations, avoiding difficulties from 26 signed overflow. (See issue 13496.) */ 27 mid = ((size_t)lo + hi) / 2; 28 litem = PySequence_GetItem(list, mid); 29 if (litem == NULL) 30 return -1; 31 res = PyObject_RichCompareBool(item, litem, Py_LT); 32 Py_DECREF(litem); 33 if (res < 0) 34 return -1; 35 if (res) 36 hi = mid; 37 else 38 lo = mid + 1; 39 } 40 return lo; 38 41 } 39 42 … … 41 44 bisect_right(PyObject *self, PyObject *args, PyObject *kw) 42 45 { 43 44 45 46 47 48 49 50 51 52 53 54 55 46 PyObject *list, *item; 47 Py_ssize_t lo = 0; 48 Py_ssize_t hi = -1; 49 Py_ssize_t index; 50 static char *keywords[] = {"a", "x", "lo", "hi", NULL}; 51 52 if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:bisect_right", 53 keywords, &list, &item, &lo, &hi)) 54 return NULL; 55 index = internal_bisect_right(list, item, lo, hi); 56 if (index < 0) 57 return NULL; 58 return PyInt_FromSsize_t(index); 56 59 } 57 60 58 61 PyDoc_STRVAR(bisect_right_doc, 59 "bisect_right(a, x[, lo[, hi]]) -> index\n\ 62 "bisect(a, x[, lo[, hi]]) -> index\n\ 63 bisect_right(a, x[, lo[, hi]]) -> index\n\ 60 64 \n\ 61 65 Return the index where to insert item x in list a, assuming a is sorted.\n\ … … 71 75 insort_right(PyObject *self, PyObject *args, PyObject *kw) 72 76 { 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 77 PyObject *list, *item, *result; 78 Py_ssize_t lo = 0; 79 Py_ssize_t hi = -1; 80 Py_ssize_t index; 81 static char *keywords[] = {"a", "x", "lo", "hi", NULL}; 82 83 if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:insort_right", 84 keywords, &list, &item, &lo, &hi)) 85 return NULL; 86 index = internal_bisect_right(list, item, lo, hi); 87 if (index < 0) 88 return NULL; 89 if (PyList_CheckExact(list)) { 90 if (PyList_Insert(list, index, item) < 0) 91 return NULL; 92 } else { 93 result = PyObject_CallMethod(list, "insert", "nO", 94 index, item); 95 if (result == NULL) 96 return NULL; 97 Py_DECREF(result); 98 } 99 100 Py_RETURN_NONE; 97 101 } 98 102 99 103 PyDoc_STRVAR(insort_right_doc, 100 "insort_right(a, x[, lo[, hi]])\n\ 104 "insort(a, x[, lo[, hi]])\n\ 105 insort_right(a, x[, lo[, hi]])\n\ 101 106 \n\ 102 107 Insert item x in list a, and keep it sorted assuming a is sorted.\n\ … … 110 115 internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi) 111 116 { 112 PyObject *litem; 113 Py_ssize_t mid, res; 114 115 if (lo < 0) { 116 PyErr_SetString(PyExc_ValueError, "lo must be non-negative"); 117 return -1; 118 } 119 if (hi == -1) { 120 hi = PySequence_Size(list); 121 if (hi < 0) 122 return -1; 123 } 124 while (lo < hi) { 125 mid = (lo + hi) / 2; 126 litem = PySequence_GetItem(list, mid); 127 if (litem == NULL) 128 return -1; 129 res = PyObject_RichCompareBool(litem, item, Py_LT); 130 Py_DECREF(litem); 131 if (res < 0) 132 return -1; 133 if (res) 134 lo = mid + 1; 135 else 136 hi = mid; 137 } 138 return lo; 117 PyObject *litem; 118 Py_ssize_t mid, res; 119 120 if (lo < 0) { 121 PyErr_SetString(PyExc_ValueError, "lo must be non-negative"); 122 return -1; 123 } 124 if (hi == -1) { 125 hi = PySequence_Size(list); 126 if (hi < 0) 127 return -1; 128 } 129 while (lo < hi) { 130 /* The (size_t)cast ensures that the addition and subsequent division 131 are performed as unsigned operations, avoiding difficulties from 132 signed overflow. (See issue 13496.) */ 133 mid = ((size_t)lo + hi) / 2; 134 litem = PySequence_GetItem(list, mid); 135 if (litem == NULL) 136 return -1; 137 res = PyObject_RichCompareBool(litem, item, Py_LT); 138 Py_DECREF(litem); 139 if (res < 0) 140 return -1; 141 if (res) 142 lo = mid + 1; 143 else 144 hi = mid; 145 } 146 return lo; 139 147 } 140 148 … … 142 150 bisect_left(PyObject *self, PyObject *args, PyObject *kw) 143 151 { 144 145 146 147 148 149 150 151 152 153 154 155 156 152 PyObject *list, *item; 153 Py_ssize_t lo = 0; 154 Py_ssize_t hi = -1; 155 Py_ssize_t index; 156 static char *keywords[] = {"a", "x", "lo", "hi", NULL}; 157 158 if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:bisect_left", 159 keywords, &list, &item, &lo, &hi)) 160 return NULL; 161 index = internal_bisect_left(list, item, lo, hi); 162 if (index < 0) 163 return NULL; 164 return PyInt_FromSsize_t(index); 157 165 } 158 166 … … 172 180 insort_left(PyObject *self, PyObject *args, PyObject *kw) 173 181 { 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 result = PyObject_CallMethod(list, "insert", "iO",191 192 193 194 195 196 197 182 PyObject *list, *item, *result; 183 Py_ssize_t lo = 0; 184 Py_ssize_t hi = -1; 185 Py_ssize_t index; 186 static char *keywords[] = {"a", "x", "lo", "hi", NULL}; 187 188 if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:insort_left", 189 keywords, &list, &item, &lo, &hi)) 190 return NULL; 191 index = internal_bisect_left(list, item, lo, hi); 192 if (index < 0) 193 return NULL; 194 if (PyList_CheckExact(list)) { 195 if (PyList_Insert(list, index, item) < 0) 196 return NULL; 197 } else { 198 result = PyObject_CallMethod(list, "insert", "nO", 199 index, item); 200 if (result == NULL) 201 return NULL; 202 Py_DECREF(result); 203 } 204 205 Py_RETURN_NONE; 198 206 } 199 207 … … 208 216 slice of a to be searched.\n"); 209 217 210 PyDoc_STRVAR(bisect_doc, "Alias for bisect_right().\n");211 PyDoc_STRVAR(insort_doc, "Alias for insort_right().\n");212 213 218 static PyMethodDef bisect_methods[] = { 214 215 216 217 METH_VARARGS|METH_KEYWORDS, bisect_doc},218 219 220 221 METH_VARARGS|METH_KEYWORDS, insort_doc},222 223 224 225 226 219 {"bisect_right", (PyCFunction)bisect_right, 220 METH_VARARGS|METH_KEYWORDS, bisect_right_doc}, 221 {"bisect", (PyCFunction)bisect_right, 222 METH_VARARGS|METH_KEYWORDS, bisect_right_doc}, 223 {"insort_right", (PyCFunction)insort_right, 224 METH_VARARGS|METH_KEYWORDS, insort_right_doc}, 225 {"insort", (PyCFunction)insort_right, 226 METH_VARARGS|METH_KEYWORDS, insort_right_doc}, 227 {"bisect_left", (PyCFunction)bisect_left, 228 METH_VARARGS|METH_KEYWORDS, bisect_left_doc}, 229 {"insort_left", (PyCFunction)insort_left, 230 METH_VARARGS|METH_KEYWORDS, insort_left_doc}, 231 {NULL, NULL} /* sentinel */ 227 232 }; 228 233 … … 238 243 init_bisect(void) 239 244 { 240 PyObject *m; 241 242 m = Py_InitModule3("_bisect", bisect_methods, module_doc); 243 } 245 Py_InitModule3("_bisect", bisect_methods, module_doc); 246 }
Note:
See TracChangeset
for help on using the changeset viewer.