1/*[clinic input]
2preserve
3[clinic start generated code]*/
4
5PyDoc_STRVAR(_bisect_bisect_right__doc__,
6"bisect_right($module, /, a, x, lo=0, hi=None, *, key=None)\n"
7"--\n"
8"\n"
9"Return the index where to insert item x in list a, assuming a is sorted.\n"
10"\n"
11"The return value i is such that all e in a[:i] have e <= x, and all e in\n"
12"a[i:] have e > x. So if x already appears in the list, a.insert(i, x) will\n"
13"insert just after the rightmost x already there.\n"
14"\n"
15"Optional args lo (default 0) and hi (default len(a)) bound the\n"
16"slice of a to be searched.");
17
18#define _BISECT_BISECT_RIGHT_METHODDEF \
19 {"bisect_right", (PyCFunction)(void(*)(void))_bisect_bisect_right, METH_FASTCALL|METH_KEYWORDS, _bisect_bisect_right__doc__},
20
21static Py_ssize_t
22_bisect_bisect_right_impl(PyObject *module, PyObject *a, PyObject *x,
23 Py_ssize_t lo, Py_ssize_t hi, PyObject *key);
24
25static PyObject *
26_bisect_bisect_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
27{
28 PyObject *return_value = NULL;
29 static const char * const _keywords[] = {"a", "x", "lo", "hi", "key", NULL};
30 static _PyArg_Parser _parser = {NULL, _keywords, "bisect_right", 0};
31 PyObject *argsbuf[5];
32 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
33 PyObject *a;
34 PyObject *x;
35 Py_ssize_t lo = 0;
36 Py_ssize_t hi = -1;
37 PyObject *key = Py_None;
38 Py_ssize_t _return_value;
39
40 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf);
41 if (!args) {
42 goto exit;
43 }
44 a = args[0];
45 x = args[1];
46 if (!noptargs) {
47 goto skip_optional_pos;
48 }
49 if (args[2]) {
50 {
51 Py_ssize_t ival = -1;
52 PyObject *iobj = _PyNumber_Index(args[2]);
53 if (iobj != NULL) {
54 ival = PyLong_AsSsize_t(iobj);
55 Py_DECREF(iobj);
56 }
57 if (ival == -1 && PyErr_Occurred()) {
58 goto exit;
59 }
60 lo = ival;
61 }
62 if (!--noptargs) {
63 goto skip_optional_pos;
64 }
65 }
66 if (args[3]) {
67 if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) {
68 goto exit;
69 }
70 if (!--noptargs) {
71 goto skip_optional_pos;
72 }
73 }
74skip_optional_pos:
75 if (!noptargs) {
76 goto skip_optional_kwonly;
77 }
78 key = args[4];
79skip_optional_kwonly:
80 _return_value = _bisect_bisect_right_impl(module, a, x, lo, hi, key);
81 if ((_return_value == -1) && PyErr_Occurred()) {
82 goto exit;
83 }
84 return_value = PyLong_FromSsize_t(_return_value);
85
86exit:
87 return return_value;
88}
89
90PyDoc_STRVAR(_bisect_insort_right__doc__,
91"insort_right($module, /, a, x, lo=0, hi=None, *, key=None)\n"
92"--\n"
93"\n"
94"Insert item x in list a, and keep it sorted assuming a is sorted.\n"
95"\n"
96"If x is already in a, insert it to the right of the rightmost x.\n"
97"\n"
98"Optional args lo (default 0) and hi (default len(a)) bound the\n"
99"slice of a to be searched.");
100
101#define _BISECT_INSORT_RIGHT_METHODDEF \
102 {"insort_right", (PyCFunction)(void(*)(void))_bisect_insort_right, METH_FASTCALL|METH_KEYWORDS, _bisect_insort_right__doc__},
103
104static PyObject *
105_bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x,
106 Py_ssize_t lo, Py_ssize_t hi, PyObject *key);
107
108static PyObject *
109_bisect_insort_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
110{
111 PyObject *return_value = NULL;
112 static const char * const _keywords[] = {"a", "x", "lo", "hi", "key", NULL};
113 static _PyArg_Parser _parser = {NULL, _keywords, "insort_right", 0};
114 PyObject *argsbuf[5];
115 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
116 PyObject *a;
117 PyObject *x;
118 Py_ssize_t lo = 0;
119 Py_ssize_t hi = -1;
120 PyObject *key = Py_None;
121
122 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf);
123 if (!args) {
124 goto exit;
125 }
126 a = args[0];
127 x = args[1];
128 if (!noptargs) {
129 goto skip_optional_pos;
130 }
131 if (args[2]) {
132 {
133 Py_ssize_t ival = -1;
134 PyObject *iobj = _PyNumber_Index(args[2]);
135 if (iobj != NULL) {
136 ival = PyLong_AsSsize_t(iobj);
137 Py_DECREF(iobj);
138 }
139 if (ival == -1 && PyErr_Occurred()) {
140 goto exit;
141 }
142 lo = ival;
143 }
144 if (!--noptargs) {
145 goto skip_optional_pos;
146 }
147 }
148 if (args[3]) {
149 if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) {
150 goto exit;
151 }
152 if (!--noptargs) {
153 goto skip_optional_pos;
154 }
155 }
156skip_optional_pos:
157 if (!noptargs) {
158 goto skip_optional_kwonly;
159 }
160 key = args[4];
161skip_optional_kwonly:
162 return_value = _bisect_insort_right_impl(module, a, x, lo, hi, key);
163
164exit:
165 return return_value;
166}
167
168PyDoc_STRVAR(_bisect_bisect_left__doc__,
169"bisect_left($module, /, a, x, lo=0, hi=None, *, key=None)\n"
170"--\n"
171"\n"
172"Return the index where to insert item x in list a, assuming a is sorted.\n"
173"\n"
174"The return value i is such that all e in a[:i] have e < x, and all e in\n"
175"a[i:] have e >= x. So if x already appears in the list, a.insert(i, x) will\n"
176"insert just before the leftmost x already there.\n"
177"\n"
178"Optional args lo (default 0) and hi (default len(a)) bound the\n"
179"slice of a to be searched.");
180
181#define _BISECT_BISECT_LEFT_METHODDEF \
182 {"bisect_left", (PyCFunction)(void(*)(void))_bisect_bisect_left, METH_FASTCALL|METH_KEYWORDS, _bisect_bisect_left__doc__},
183
184static Py_ssize_t
185_bisect_bisect_left_impl(PyObject *module, PyObject *a, PyObject *x,
186 Py_ssize_t lo, Py_ssize_t hi, PyObject *key);
187
188static PyObject *
189_bisect_bisect_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
190{
191 PyObject *return_value = NULL;
192 static const char * const _keywords[] = {"a", "x", "lo", "hi", "key", NULL};
193 static _PyArg_Parser _parser = {NULL, _keywords, "bisect_left", 0};
194 PyObject *argsbuf[5];
195 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
196 PyObject *a;
197 PyObject *x;
198 Py_ssize_t lo = 0;
199 Py_ssize_t hi = -1;
200 PyObject *key = Py_None;
201 Py_ssize_t _return_value;
202
203 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf);
204 if (!args) {
205 goto exit;
206 }
207 a = args[0];
208 x = args[1];
209 if (!noptargs) {
210 goto skip_optional_pos;
211 }
212 if (args[2]) {
213 {
214 Py_ssize_t ival = -1;
215 PyObject *iobj = _PyNumber_Index(args[2]);
216 if (iobj != NULL) {
217 ival = PyLong_AsSsize_t(iobj);
218 Py_DECREF(iobj);
219 }
220 if (ival == -1 && PyErr_Occurred()) {
221 goto exit;
222 }
223 lo = ival;
224 }
225 if (!--noptargs) {
226 goto skip_optional_pos;
227 }
228 }
229 if (args[3]) {
230 if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) {
231 goto exit;
232 }
233 if (!--noptargs) {
234 goto skip_optional_pos;
235 }
236 }
237skip_optional_pos:
238 if (!noptargs) {
239 goto skip_optional_kwonly;
240 }
241 key = args[4];
242skip_optional_kwonly:
243 _return_value = _bisect_bisect_left_impl(module, a, x, lo, hi, key);
244 if ((_return_value == -1) && PyErr_Occurred()) {
245 goto exit;
246 }
247 return_value = PyLong_FromSsize_t(_return_value);
248
249exit:
250 return return_value;
251}
252
253PyDoc_STRVAR(_bisect_insort_left__doc__,
254"insort_left($module, /, a, x, lo=0, hi=None, *, key=None)\n"
255"--\n"
256"\n"
257"Insert item x in list a, and keep it sorted assuming a is sorted.\n"
258"\n"
259"If x is already in a, insert it to the left of the leftmost x.\n"
260"\n"
261"Optional args lo (default 0) and hi (default len(a)) bound the\n"
262"slice of a to be searched.");
263
264#define _BISECT_INSORT_LEFT_METHODDEF \
265 {"insort_left", (PyCFunction)(void(*)(void))_bisect_insort_left, METH_FASTCALL|METH_KEYWORDS, _bisect_insort_left__doc__},
266
267static PyObject *
268_bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x,
269 Py_ssize_t lo, Py_ssize_t hi, PyObject *key);
270
271static PyObject *
272_bisect_insort_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
273{
274 PyObject *return_value = NULL;
275 static const char * const _keywords[] = {"a", "x", "lo", "hi", "key", NULL};
276 static _PyArg_Parser _parser = {NULL, _keywords, "insort_left", 0};
277 PyObject *argsbuf[5];
278 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
279 PyObject *a;
280 PyObject *x;
281 Py_ssize_t lo = 0;
282 Py_ssize_t hi = -1;
283 PyObject *key = Py_None;
284
285 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf);
286 if (!args) {
287 goto exit;
288 }
289 a = args[0];
290 x = args[1];
291 if (!noptargs) {
292 goto skip_optional_pos;
293 }
294 if (args[2]) {
295 {
296 Py_ssize_t ival = -1;
297 PyObject *iobj = _PyNumber_Index(args[2]);
298 if (iobj != NULL) {
299 ival = PyLong_AsSsize_t(iobj);
300 Py_DECREF(iobj);
301 }
302 if (ival == -1 && PyErr_Occurred()) {
303 goto exit;
304 }
305 lo = ival;
306 }
307 if (!--noptargs) {
308 goto skip_optional_pos;
309 }
310 }
311 if (args[3]) {
312 if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) {
313 goto exit;
314 }
315 if (!--noptargs) {
316 goto skip_optional_pos;
317 }
318 }
319skip_optional_pos:
320 if (!noptargs) {
321 goto skip_optional_kwonly;
322 }
323 key = args[4];
324skip_optional_kwonly:
325 return_value = _bisect_insort_left_impl(module, a, x, lo, hi, key);
326
327exit:
328 return return_value;
329}
330/*[clinic end generated code: output=aeb97db6db79bf96 input=a9049054013a1b77]*/
331