diff --git a/c++/cpp2py/converters/map.hpp b/c++/cpp2py/converters/map.hpp index 28b4000..9a69b2a 100644 --- a/c++/cpp2py/converters/map.hpp +++ b/c++/cpp2py/converters/map.hpp @@ -5,13 +5,13 @@ namespace cpp2py { template struct py_converter> { - static PyObject *c2py(std::map const &m) { + static PyObject *c2py(std::map m) { PyObject *d = PyDict_New(); for (auto &x : m) { - pyref k = py_converter::c2py(x.first); + pyref k = py_converter>::c2py(std::move(x.first)); // if the K is a list, we transform into a tuple if (PyList_Check(k)) k = PyList_AsTuple(k); - pyref v = py_converter::c2py(x.second); + pyref v = py_converter>::c2py(std::move(x.second)); if (k.is_null() or v.is_null() or (PyDict_SetItem(d, k, v) == -1)) { Py_DECREF(d); return NULL; diff --git a/c++/cpp2py/converters/optional.hpp b/c++/cpp2py/converters/optional.hpp index 3179507..1d9f4e0 100644 --- a/c++/cpp2py/converters/optional.hpp +++ b/c++/cpp2py/converters/optional.hpp @@ -3,12 +3,12 @@ namespace cpp2py { template struct py_converter> { - using conv = py_converter; + using conv = py_converter>; - static PyObject *c2py(std::optional &op) { - if (!bool(op)) Py_RETURN_NONE; - return conv::c2py(*op); - } + static PyObject *c2py(std::optional op) { + if (!bool(op)) Py_RETURN_NONE; + return conv::c2py(std::move(*op)); + } static bool is_convertible(PyObject *ob, bool raise_exception) { return ((ob == Py_None) or conv::is_convertible(ob, raise_exception)); diff --git a/c++/cpp2py/converters/pair.hpp b/c++/cpp2py/converters/pair.hpp index a846943..1fe73bb 100644 --- a/c++/cpp2py/converters/pair.hpp +++ b/c++/cpp2py/converters/pair.hpp @@ -5,9 +5,9 @@ namespace cpp2py { template struct py_converter> { - static PyObject *c2py(std::pair const &p) { - pyref x1 = py_converter::c2py(std::get<0>(p)); - pyref x2 = py_converter::c2py(std::get<1>(p)); + static PyObject *c2py(std::pair p) { + pyref x1 = py_converter>::c2py(std::move(std::get<0>(p))); + pyref x2 = py_converter>::c2py(std::move(std::get<1>(p))); if (x1.is_null() or x2.is_null()) return NULL; return PyTuple_Pack(2, (PyObject *)x1, (PyObject *)x2); } diff --git a/c++/cpp2py/converters/set.hpp b/c++/cpp2py/converters/set.hpp index 2486cf0..ed57dcd 100644 --- a/c++/cpp2py/converters/set.hpp +++ b/c++/cpp2py/converters/set.hpp @@ -5,10 +5,10 @@ namespace cpp2py { template struct py_converter> { - static PyObject *c2py(std::set const &s) { + static PyObject *c2py(std::set s) { PyObject *set = PySet_New(NULL); for (auto &x : s) { - pyref y = py_converter::c2py(x); + pyref y = py_converter>::c2py(std::move(x)); if (y.is_null() or (PySet_Add(set, y) == -1)) { Py_DECREF(set); return NULL; diff --git a/c++/cpp2py/converters/std_array.hpp b/c++/cpp2py/converters/std_array.hpp index b939c41..e06593d 100644 --- a/c++/cpp2py/converters/std_array.hpp +++ b/c++/cpp2py/converters/std_array.hpp @@ -6,10 +6,10 @@ namespace cpp2py { template struct py_converter> { // -------------------------------------- - static PyObject *c2py(std::array const &v) { + static PyObject *c2py(std::array v) { PyObject *list = PyList_New(0); - for (auto const &x : v) { - pyref y = py_converter::c2py(x); + for (auto &x : v) { + pyref y = py_converter>::c2py(std::move(x)); if (y.is_null() or (PyList_Append(list, y) == -1)) { Py_DECREF(list); return NULL; diff --git a/c++/cpp2py/converters/tuple.hpp b/c++/cpp2py/converters/tuple.hpp index 35bdbe7..b26b732 100644 --- a/c++/cpp2py/converters/tuple.hpp +++ b/c++/cpp2py/converters/tuple.hpp @@ -11,8 +11,8 @@ namespace cpp2py { using tuple_t = std::tuple; // c2py implementation - template static PyObject *c2py_impl(tuple_t const &t, std::index_sequence) { - auto objs = std::array{pyref(py_converter::c2py(std::get(t)))...}; + template static PyObject *c2py_impl(tuple_t t, std::index_sequence) { + auto objs = std::array{pyref(py_converter>::c2py(std::move(std::get(t))))...}; bool one_is_null = std::accumulate(std::begin(objs), std::end(objs), false, [](bool x, PyObject *a) { return x or (a == NULL); }); if (one_is_null) return NULL; return PyTuple_Pack(sizeof...(Types), (PyObject *)(objs[Is])...); @@ -20,19 +20,19 @@ namespace cpp2py { // is_convertible implementation template static bool is_convertible_impl(PyObject *seq, bool raise_exception) { - return py_converter::is_convertible(PySequence_Fast_GET_ITEM(seq, N), raise_exception) + return py_converter>::is_convertible(PySequence_Fast_GET_ITEM(seq, N), raise_exception) && is_convertible_impl(seq, raise_exception); } template static bool is_convertible_impl(PyObject *seq, bool raise_exception) { return true; } template static auto py2c_impl(std::index_sequence, PyObject *seq) { - return std::make_tuple(py_converter::py2c(PySequence_Fast_GET_ITEM(seq, Is))...); + return std::make_tuple(py_converter>::py2c(PySequence_Fast_GET_ITEM(seq, Is))...); } public: // ----------------------------------------- - static PyObject *c2py(tuple_t const &t) { return c2py_impl(t, std::make_index_sequence()); } + static PyObject *c2py(tuple_t t) { return c2py_impl(std::move(t), std::make_index_sequence()); } // ----------------------------------------- diff --git a/c++/cpp2py/converters/variant.hpp b/c++/cpp2py/converters/variant.hpp index 96e6fca..c12ce0f 100644 --- a/c++/cpp2py/converters/variant.hpp +++ b/c++/cpp2py/converters/variant.hpp @@ -45,18 +45,14 @@ namespace cpp2py { } struct _visitor { - template PyObject *operator()(U const &x) { return py_converter::c2py(x); } + template PyObject *operator()(U x) { return py_converter>::c2py(std::move(x)); } }; public: - static PyObject *c2py(std::variant const &v) { - //auto l = [](auto const &x) -> PyObject * { return py_converter::c2py(x); }; - return visit(_visitor{}, v); - //return visit(_visitor{}, v); - } + static PyObject *c2py(std::variant v) { return visit(_visitor{}, std::move(v)); } static bool is_convertible(PyObject *ob, bool raise_exception) { - if ((... or py_converter::is_convertible(ob, false))) return true; + if ((... or py_converter>::is_convertible(ob, false))) return true; if (raise_exception) { PyErr_SetString(PyExc_TypeError, "Cannot convert to std::variant"); } return false; } diff --git a/c++/cpp2py/converters/vector.hpp b/c++/cpp2py/converters/vector.hpp index 7a6f7c3..ec7989a 100644 --- a/c++/cpp2py/converters/vector.hpp +++ b/c++/cpp2py/converters/vector.hpp @@ -9,23 +9,22 @@ namespace cpp2py { template static void delete_pycapsule(PyObject *capsule) { - auto *ptr = static_cast *>(PyCapsule_GetPointer(capsule, "guard")); + auto *ptr = static_cast *>(PyCapsule_GetPointer(capsule, "guard")); delete ptr; } // Convert vector to numpy_proxy, WARNING: Deep Copy - template numpy_proxy make_numpy_proxy_from_vector(std::vector const &v) { + template numpy_proxy make_numpy_proxy_from_vector(std::vector v) { - auto *data_ptr = new std::unique_ptr{new T[v.size()]}; - std::copy(begin(v), end(v), data_ptr->get()); - auto capsule = PyCapsule_New(data_ptr, "guard", &delete_pycapsule); + auto *vec_heap = new std::vector{std::move(v)}; + auto capsule = PyCapsule_New(vec_heap, "guard", &delete_pycapsule); return {1, // rank npy_type>, - (void *)data_ptr->get(), + (void *)vec_heap->data(), std::is_const_v, - v_t{static_cast(v.size())}, // extents - v_t{sizeof(T)}, // strides + v_t{static_cast(vec_heap->size())}, // extents + v_t{sizeof(T)}, // strides capsule}; } @@ -46,14 +45,14 @@ namespace cpp2py { template struct py_converter> { - static PyObject *c2py(std::vector const &v) { + static PyObject *c2py(std::vector v) { if constexpr (has_npy_type) { - return make_numpy_proxy_from_vector(v).to_python(); + return make_numpy_proxy_from_vector(std::move(v)).to_python(); } else { // Convert to Python List PyObject *list = PyList_New(0); for (auto const &x : v) { - pyref y = py_converter::c2py(x); + pyref y = py_converter>::c2py(std::move(x)); if (y.is_null() or (PyList_Append(list, y) == -1)) { Py_DECREF(list); return NULL;