blob: 20ee3527d51ac98b87df9e82b8db040698093a95 [file] [log] [blame]
// Copyright 2023 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// Nanobind removed buffer protocol interop in favor of a new and improved
// ndarray thingy. This thingy is mostly better for a subset of cases but is
// not great for just generically accessing chunks of memory. For cases where
// we do the latter (mapping files, etc), we just have some helpers over the
// low level Python buffer protocol to ease the transition.
#ifndef IREE_BINDINGS_PYTHON_IREE_BUFFER_INTEROP_H_
#define IREE_BINDINGS_PYTHON_IREE_BUFFER_INTEROP_H_
#include "./binding.h"
namespace iree::python {
// Represents a Py_buffer obtained via PyObject_GetBuffer() and terminated via
// PyBuffer_Release().
class PyBufferRequest {
public:
PyBufferRequest(py::object &exporter, int flags) {
int rc = PyObject_GetBuffer(exporter.ptr(), &view_, flags);
if (rc != 0) {
throw py::python_error();
}
}
~PyBufferRequest() { PyBuffer_Release(&view_); }
PyBufferRequest(const PyBufferRequest &) = delete;
void operator=(const PyBufferRequest &) = delete;
Py_buffer &view() { return view_; }
private:
Py_buffer view_;
};
} // namespace iree::python
#endif // IREE_BINDINGS_PYTHON_IREE_BUFFER_INTEROP_H_