All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
content.h
Go to the documentation of this file.
1// BSD 3-Clause License; see https://github.com/scikit-hep/awkward-1.0/blob/main/LICENSE
2
3#ifndef AWKWARDPY_CONTENT_H_
4#define AWKWARDPY_CONTENT_H_
5
6#include <pybind11/numpy.h>
7#include <pybind11/pybind11.h>
8#include <pybind11/stl.h>
9
11#include "awkward/util.h"
12
13namespace py = pybind11;
14namespace ak = awkward;
15
16template <typename T>
17std::string
18repr(const T& self) {
19 return self.tostring();
20}
21
22template <typename T>
23int64_t
24len(const T& self) {
25 return self.length();
26}
27
28int64_t
29check_maxdecimals(const py::object& maxdecimals);
30
31ak::util::Parameters
32dict2parameters(const py::object& in);
33
34py::dict
35parameters2dict(const ak::util::Parameters& in);
36
38py::class_<ak::ArrayBuilder>
39 make_ArrayBuilder(const py::handle& m, const std::string& name);
40
41namespace {
42 class NumpyBuffersContainer: public ak::BuffersContainer {
43 public:
44 py::dict container() {
45 return container_;
46 }
47
48 void*
49 empty_buffer(const std::string& name, int64_t num_bytes) override {
50 py::object pyarray = py::module::import("numpy").attr("empty")(num_bytes, "u1");
51 py::array_t<uint8_t> rawarray = pyarray.cast<py::array_t<uint8_t>>();
52 py::buffer_info rawinfo = rawarray.request();
53 container_[py::str(name)] = pyarray;
54 return rawinfo.ptr;
55 }
56
57 void
58 copy_buffer(const std::string& name, const void* source, int64_t num_bytes) override {
59 py::object pyarray = py::module::import("numpy").attr("empty")(num_bytes, "u1");
60 py::array_t<uint8_t> rawarray = pyarray.cast<py::array_t<uint8_t>>();
61 py::buffer_info rawinfo = rawarray.request();
62 std::memcpy(rawinfo.ptr, source, num_bytes);
63 container_[py::str(name)] = pyarray;
64 }
65
66 void
67 full_buffer(const std::string& name, int64_t length, int64_t value, const std::string& dtype) override {
68 py::object pyarray = py::module::import("numpy").attr("full")(py::int_(length), py::int_(value), py::str(dtype));
69 container_[py::str(name)] = pyarray;
70 }
71
72 private:
73 py::dict container_;
74 };
75
76 class EmptyBuffersContainer: public ak::BuffersContainer {
77 public:
78 void*
79 empty_buffer(const std::string& /* name */, int64_t /* num_bytes */) override {
80 return nullptr;
81 }
82
83 void
84 copy_buffer(const std::string& /* name */, const void* /* source */, int64_t /* num_bytes */) override { }
85
86 void
87 full_buffer(const std::string& /* name */, int64_t /* length */, int64_t /* value */, const std::string& /* dtype */) override { }
88 };
89}
90
91#endif // AWKWARDPY_CONTENT_H_
Abstract class to represent the output of ak.to_buffers. In Python, this would be a dict of NumPy arr...
Definition: Builder.h:20
py::class_< ak::ArrayBuilder > make_ArrayBuilder(const py::handle &m, const std::string &name)
Makes an ArrayBuilder class in Python that mirrors the one in C++.
ak::util::Parameters dict2parameters(const py::object &in)
int64_t len(const T &self)
Definition: content.h:24
int64_t check_maxdecimals(const py::object &maxdecimals)
py::dict parameters2dict(const ak::util::Parameters &in)
std::string repr(const T &self)
Definition: content.h:18
Definition: ArrayBuilder.h:14