summaryrefslogtreecommitdiff
path: root/py/obj.h
diff options
context:
space:
mode:
authorNicko van Someren <nicko@nicko.org>2019-11-16 17:07:11 -0700
committerDamien George <damien.p.george@gmail.com>2019-12-28 23:55:15 +1100
commit4c93955b7b4d3d860aed1551ca6231ac4e388e69 (patch)
tree33d4e13a6076d847f98da761febeb5f745e94a3c /py/obj.h
parent007a704d82f07d1482dae6f265fecf5710266767 (diff)
py/objslice: Add support for indices() method on slice objects.
Instances of the slice class are passed to __getitem__() on objects when the user indexes them with a slice. In practice the majority of the time (other than passing it on untouched) is to work out what the slice means in the context of an array dimension of a particular length. Since Python 2.3 there has been a method on the slice class, indices(), that takes a dimension length and returns the real start, stop and step, accounting for missing or negative values in the slice spec. This commit implements such a indices() method on the slice class. It is configurable at compile-time via MICROPY_PY_BUILTINS_SLICE_INDICES, disabled by default, enabled on unix, stm32 and esp32 ports. This commit also adds new tests for slice indices and for slicing unicode strings.
Diffstat (limited to 'py/obj.h')
-rw-r--r--py/obj.h15
1 files changed, 8 insertions, 7 deletions
diff --git a/py/obj.h b/py/obj.h
index efeb14b43..ab5b1e6ec 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -778,8 +778,16 @@ static inline mp_map_t *mp_obj_dict_get_map(mp_obj_t dict) {
// set
void mp_obj_set_store(mp_obj_t self_in, mp_obj_t item);
+// slice indexes resolved to particular sequence
+typedef struct {
+ mp_int_t start;
+ mp_int_t stop;
+ mp_int_t step;
+} mp_bound_slice_t;
+
// slice
void mp_obj_slice_get(mp_obj_t self_in, mp_obj_t *start, mp_obj_t *stop, mp_obj_t *step);
+void mp_obj_slice_indices(mp_obj_t self_in, mp_int_t length, mp_bound_slice_t *result);
// functions
@@ -836,13 +844,6 @@ const mp_obj_t *mp_obj_property_get(mp_obj_t self_in);
// sequence helpers
-// slice indexes resolved to particular sequence
-typedef struct {
- mp_uint_t start;
- mp_uint_t stop;
- mp_int_t step;
-} mp_bound_slice_t;
-
void mp_seq_multiply(const void *items, size_t item_sz, size_t len, size_t times, void *dest);
#if MICROPY_PY_BUILTINS_SLICE
bool mp_seq_get_fast_slice_indexes(mp_uint_t len, mp_obj_t slice, mp_bound_slice_t *indexes);