blob: 2c889508b4b495b56df2fc034f6f6ad5baebba89 [file] [log] [blame]
Guido van Rossume15d0de1996-07-30 16:42:30 +00001#ifndef Py_SLICEOBJECT_H
2#define Py_SLICEOBJECT_H
3#ifdef __cplusplus
4extern "C" {
5#endif
6
Guido van Rossume449af71996-10-11 16:25:41 +00007/* The unique ellipsis object "..." */
Guido van Rossume15d0de1996-07-30 16:42:30 +00008
Mark Hammond91a681d2002-08-12 07:21:58 +00009PyAPI_DATA(PyObject) _Py_EllipsisObject; /* Don't use this directly */
Guido van Rossume15d0de1996-07-30 16:42:30 +000010
Guido van Rossume449af71996-10-11 16:25:41 +000011#define Py_Ellipsis (&_Py_EllipsisObject)
Guido van Rossume15d0de1996-07-30 16:42:30 +000012
13/* Slice object interface */
14
15/*
16
17A slice object containing start, stop, and step data members (the
18names are from range). After much talk with Guido, it was decided to
Armin Rigo89a39462004-10-28 16:32:00 +000019let these be any arbitrary python type. Py_None stands for omitted values.
Guido van Rossume15d0de1996-07-30 16:42:30 +000020*/
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000021#ifndef Py_LIMITED_API
Guido van Rossume15d0de1996-07-30 16:42:30 +000022typedef struct {
Fred Drake3cf4d2b2000-07-09 00:55:06 +000023 PyObject_HEAD
Serhiy Storchaka598ceae2017-11-28 17:56:10 +020024 PyObject *start, *stop, *step; /* not NULL */
Guido van Rossume15d0de1996-07-30 16:42:30 +000025} PySliceObject;
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000026#endif
Guido van Rossume15d0de1996-07-30 16:42:30 +000027
Mark Hammond91a681d2002-08-12 07:21:58 +000028PyAPI_DATA(PyTypeObject) PySlice_Type;
Benjamin Petersonfd838e62009-04-20 02:09:13 +000029PyAPI_DATA(PyTypeObject) PyEllipsis_Type;
Guido van Rossume15d0de1996-07-30 16:42:30 +000030
Dong-hee Nad905df72020-02-14 02:37:17 +090031#define PySlice_Check(op) Py_IS_TYPE(op, &PySlice_Type)
Guido van Rossume15d0de1996-07-30 16:42:30 +000032
Mark Hammond91a681d2002-08-12 07:21:58 +000033PyAPI_FUNC(PyObject *) PySlice_New(PyObject* start, PyObject* stop,
Fred Drake3cf4d2b2000-07-09 00:55:06 +000034 PyObject* step);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000035#ifndef Py_LIMITED_API
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000036PyAPI_FUNC(PyObject *) _PySlice_FromIndices(Py_ssize_t start, Py_ssize_t stop);
Mark Dickinsonffdb2c22012-11-17 19:18:10 +000037PyAPI_FUNC(int) _PySlice_GetLongIndices(PySliceObject *self, PyObject *length,
38 PyObject **start_ptr, PyObject **stop_ptr,
39 PyObject **step_ptr);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000040#endif
41PyAPI_FUNC(int) PySlice_GetIndices(PyObject *r, Py_ssize_t length,
Martin v. Löwis18e16552006-02-15 17:27:45 +000042 Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step);
Zackery Spytz3c8724f2019-05-28 09:16:33 -060043Py_DEPRECATED(3.7)
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000044PyAPI_FUNC(int) PySlice_GetIndicesEx(PyObject *r, Py_ssize_t length,
Serhiy Storchakab2a5be02017-01-25 13:23:05 +020045 Py_ssize_t *start, Py_ssize_t *stop,
Zackery Spytz3c8724f2019-05-28 09:16:33 -060046 Py_ssize_t *step,
47 Py_ssize_t *slicelength);
Serhiy Storchakab2a5be02017-01-25 13:23:05 +020048
49#if !defined(Py_LIMITED_API) || (Py_LIMITED_API+0 >= 0x03050400 && Py_LIMITED_API+0 < 0x03060000) || Py_LIMITED_API+0 >= 0x03060100
50#define PySlice_GetIndicesEx(slice, length, start, stop, step, slicelen) ( \
Serhiy Storchakac7611362017-02-04 11:04:00 +020051 PySlice_Unpack((slice), (start), (stop), (step)) < 0 ? \
52 ((*(slicelen) = 0), -1) : \
53 ((*(slicelen) = PySlice_AdjustIndices((length), (start), (stop), *(step))), \
Serhiy Storchakab2a5be02017-01-25 13:23:05 +020054 0))
55PyAPI_FUNC(int) PySlice_Unpack(PyObject *slice,
56 Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step);
57PyAPI_FUNC(Py_ssize_t) PySlice_AdjustIndices(Py_ssize_t length,
58 Py_ssize_t *start, Py_ssize_t *stop,
59 Py_ssize_t step);
60#endif
Guido van Rossume15d0de1996-07-30 16:42:30 +000061
62#ifdef __cplusplus
63}
64#endif
65#endif /* !Py_SLICEOBJECT_H */