From 67ac6b63fd1964d54626df0767b6850c08ce0e4e Mon Sep 17 00:00:00 2001 From: Vishal Pankaj Chandratreya <19171016+tfpf@users.noreply.github.com> Date: Tue, 10 Dec 2024 12:49:35 +0530 Subject: [PATCH] Add `copy` method (#36) --- src/pysorteddict/pysorteddict.cc | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/pysorteddict/pysorteddict.cc b/src/pysorteddict/pysorteddict.cc index 22dceff..db7264d 100644 --- a/src/pysorteddict/pysorteddict.cc +++ b/src/pysorteddict/pysorteddict.cc @@ -83,6 +83,7 @@ struct SortedDictType int setitem(PyObject*, PyObject*); PyObject* str(void); PyObject* clear(void); + PyObject* copy(void); PyObject* items(void); PyObject* keys(void); PyObject* values(void); @@ -239,6 +240,25 @@ PyObject* SortedDictType::clear(void) Py_RETURN_NONE; } +PyObject* SortedDictType::copy(void) +{ + PyTypeObject* type = Py_TYPE(this); + PyObject* sd_copy = type->tp_alloc(type, 0); // New reference. + if (sd_copy == nullptr) + { + return nullptr; + } + SortedDictType* this_copy = reinterpret_cast(sd_copy); + this_copy->map = new std::map(*this->map); + for (auto& item : *this_copy->map) + { + Py_INCREF(item.first); + Py_INCREF(item.second); + } + this_copy->key_type = Py_NewRef(this->key_type); + return sd_copy; +} + PyObject* SortedDictType::items(void) { PyObject* pyitems = PyList_New(this->map->size()); // New reference. @@ -405,6 +425,18 @@ static PyObject* sorted_dict_type_clear(PyObject* self, PyObject* args) return sd->clear(); } +PyDoc_STRVAR( + sorted_dict_type_copy_doc, + "d.copy() -> SortedDict\n" + "Return a shallow copy of the sorted dictionary ``d``." +); + +static PyObject* sorted_dict_type_copy(PyObject* self, PyObject* args) +{ + SortedDictType* sd = reinterpret_cast(self); + return sd->copy(); +} + PyDoc_STRVAR( sorted_dict_type_items_doc, "d.items() -> list[tuple[object, object]]\n" @@ -451,6 +483,12 @@ static PyMethodDef sorted_dict_type_methods[] = { METH_NOARGS, // ml_flags sorted_dict_type_clear_doc, // ml_doc }, + { + "copy", // ml_name + sorted_dict_type_copy, // ml_meth + METH_NOARGS, // ml_flags + sorted_dict_type_copy_doc, // ml_doc + }, { "items", // ml_name sorted_dict_type_items, // ml_meth