// 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_
