MLIR
20.0.0git
|
A CRTP base class for pseudo-containers willing to support Python-type slicing access on top of indexed access. More...
#include "Bindings/Python/PybindUtils.h"
Public Member Functions | |
Sliceable (intptr_t startIndex, intptr_t length, intptr_t step) | |
ElementTy | getElement (intptr_t index) |
Returns the index -th element in the slice, supports negative indices. More... | |
intptr_t | size () |
Returns the size of slice. More... | |
std::vector< ElementTy > | dunderAdd (Derived &other) |
Returns a new vector (mapped to Python list) containing elements from two slices. More... | |
Static Public Member Functions | |
static void | bind (pybind11::module &m) |
Binds the indexing and length methods in the Python class. More... | |
static void | bindDerived (ClassTy &) |
Hook for derived classes willing to bind more methods. More... | |
Protected Types | |
using | ClassTy = pybind11::class_< Derived > |
template<typename T , typename... Args> | |
using | has_maybe_downcast = decltype(&T::maybeDownCast) |
Trait to check if T provides a maybeDownCast method. More... | |
Protected Member Functions | |
intptr_t | wrapIndex (intptr_t index) |
Transforms index into a legal value to access the underlying sequence. More... | |
intptr_t | linearizeIndex (intptr_t index) |
Computes the linear index given the current slice properties. More... | |
pybind11::object | getItem (intptr_t index) |
Returns the element at the given slice index. More... | |
pybind11::object | getItemSlice (PyObject *slice) |
Returns a new instance of the pseudo-container restricted to the given slice. More... | |
A CRTP base class for pseudo-containers willing to support Python-type slicing access on top of indexed access.
Calling ::bind on this class will define __len__
as well as __getitem__
with integer and slice arguments.
This is intended for pseudo-containers that can refer to arbitrary slices of underlying storage indexed by a single integer. Indexing those with an integer produces an instance of ElementTy. Indexing those with a slice produces a new instance of Derived, which can be sliced further.
A derived class must provide the following:
static const char *pyClassName
field containing the name of the Python class to bind;intptr_t getRawNumElements()
that returns the number of elements in the backing container (NOT that of the slice);ElementTy getRawElement(intptr_t)
that returns a single element at the given linear index (NOT slice index);Derived slice(intptr_t, intptr_t, intptr_t)
that constructs a new instance of the derived pseudo-container with the given slice parameters (to be forwarded to the Sliceable constructor).The getRawNumElements() and getRawElement(intptr_t) callbacks must not throw.
A derived class may additionally define:
static void bindDerived(ClassTy &)
method to bind additional methods the python class. Definition at line 209 of file PybindUtils.h.
|
protected |
Definition at line 211 of file PybindUtils.h.
|
protected |
Trait to check if T provides a maybeDownCast
method.
Note, you need the & to detect inherited members.
Definition at line 235 of file PybindUtils.h.
|
inlineexplicit |
Definition at line 271 of file PybindUtils.h.
|
inlinestatic |
Binds the indexing and length methods in the Python class.
Definition at line 307 of file PybindUtils.h.
|
inlinestatic |
Hook for derived classes willing to bind more methods.
Definition at line 358 of file PybindUtils.h.
|
inline |
Returns a new vector (mapped to Python list) containing elements from two slices.
The new vector is necessary because slices may not be contiguous or even come from the same original sequence.
Definition at line 294 of file PybindUtils.h.
References mlir::Sliceable< Derived, ElementTy >::getElement().
|
inline |
Returns the index
-th element in the slice, supports negative indices.
Throws if the index is out of bounds.
Definition at line 278 of file PybindUtils.h.
References mlir::Sliceable< Derived, ElementTy >::linearizeIndex(), and mlir::Sliceable< Derived, ElementTy >::wrapIndex().
Referenced by mlir::Sliceable< Derived, ElementTy >::dunderAdd().
|
inlineprotected |
Returns the element at the given slice index.
Supports negative indices by taking elements in inverse order. Returns a nullptr object if out of bounds.
Definition at line 240 of file PybindUtils.h.
References mlir::Sliceable< Derived, ElementTy >::linearizeIndex(), and mlir::Sliceable< Derived, ElementTy >::wrapIndex().
|
inlineprotected |
Returns a new instance of the pseudo-container restricted to the given slice.
Returns a nullptr object on failure.
Definition at line 259 of file PybindUtils.h.
|
inlineprotected |
Computes the linear index given the current slice properties.
Definition at line 224 of file PybindUtils.h.
Referenced by mlir::Sliceable< Derived, ElementTy >::getElement(), and mlir::Sliceable< Derived, ElementTy >::getItem().
|
inline |
Returns the size of slice.
Definition at line 289 of file PybindUtils.h.
|
inlineprotected |
Transforms index
into a legal value to access the underlying sequence.
Returns <0 on failure.
Definition at line 215 of file PybindUtils.h.
Referenced by mlir::Sliceable< Derived, ElementTy >::getElement(), and mlir::Sliceable< Derived, ElementTy >::getItem().