53 Py_DECREF(
self->parent_obj);
59 PyObject* parent_obj) {
62 (
void*)PyType_GenericAlloc(s->descriptor_iterator_type, 0);
64 iter->parent = parent;
65 iter->parent_obj = parent_obj;
67 Py_INCREF(
iter->parent_obj);
68 return &
iter->ob_base;
73 int size =
self->funcs->get_elem_count(
self->parent);
74 if (
self->index >=
size)
return NULL;
75 const void*
elem =
self->funcs->index(
self->parent,
self->index);
77 return self->funcs->get_elem_wrapper(
elem);
82 {Py_tp_iter, PyObject_SelfIter},
112 Py_CLEAR(
self->parent_obj);
117 const void* parent, PyObject* parent_obj) {
124 Py_INCREF(parent_obj);
125 return &seq->ob_base;
130 return self->funcs->get_elem_count(
self->parent);
136 Py_ssize_t
size =
self->funcs->get_elem_count(
self->parent);
137 if (index < 0 || index >=
size) {
138 PyErr_Format(PyExc_IndexError,
"list index (%zd) out of range",
index);
142 return self->funcs->get_elem_wrapper(
elem);
151 if (PyObject_TypeCheck(other,
Py_TYPE(
self))) {
156 if (!PyList_Check(other))
return 0;
162 if ((Py_ssize_t)
n != PyList_Size(other)) {
167 for (
int i = 0;
i <
n;
i++) {
169 PyObject* item2 = PyList_GetItem(other,
i);
170 if (!item1 || !item2)
goto error;
171 int cmp = PyObject_RichCompareBool(item1, item2, Py_EQ);
184 PyObject* other,
int opid) {
186 if (opid != Py_EQ && opid != Py_NE) {
187 Py_RETURN_NOTIMPLEMENTED;
190 if (opid == Py_NE)
ret = !
ret;
191 return PyBool_FromLong(
ret);
199 int count =
self->funcs->get_elem_count(
self->parent);
201 if (
self->funcs->index(
self->parent,
i) == item_ptr) {
211 PyErr_SetNone(PyExc_ValueError);
221 int n =
self->funcs->get_elem_count(
self->parent);
223 for (
int i = 0;
i <
n;
i++) {
224 if (
self->funcs->index(
self->parent,
i) == item_ptr) {
228 return PyLong_FromLong(
count);
232 PyErr_Format(PyExc_TypeError,
"'%R' is not a mutable sequence",
self);
284 Py_DECREF(
self->parent_obj);
289 const void* parent, PyObject* parent_obj) {
293 map->parent = parent;
294 map->parent_obj = parent_obj;
295 Py_INCREF(parent_obj);
296 return &
map->ob_base;
301 return self->funcs->base.get_elem_count(
self->parent);
310 return self->funcs->base.get_elem_wrapper(
elem);
312 PyErr_SetObject(PyExc_KeyError,
key);
320 ".ByNameMap' object does not support item assignment");
334 PyObject* default_value = Py_None;
335 if (!PyArg_UnpackTuple(
args,
"get", 1, 2, &
key, &default_value)) {
343 return self->funcs->base.get_elem_wrapper(
elem);
345 Py_INCREF(default_value);
346 return default_value;
358 int n =
self->funcs->base.get_elem_count(
self->parent);
359 PyObject*
ret = PyList_New(
n);
360 if (!
ret)
return NULL;
361 for (
int i = 0;
i <
n;
i++) {
362 const void*
elem =
self->funcs->base.index(
self->parent,
i);
363 PyObject*
key = PyUnicode_FromString(
self->funcs->get_elem_name(
elem));
376 int n =
self->funcs->base.get_elem_count(
self->parent);
377 PyObject*
ret = PyList_New(
n);
378 if (!
ret)
return NULL;
379 for (
int i = 0;
i <
n;
i++) {
380 const void*
elem =
self->funcs->base.index(
self->parent,
i);
381 PyObject* py_elem =
self->funcs->base.get_elem_wrapper(
elem);
382 if (!py_elem)
goto error;
383 PyList_SetItem(
ret,
i, py_elem);
394 int n =
self->funcs->base.get_elem_count(
self->parent);
395 PyObject*
ret = PyList_New(
n);
398 if (!
ret)
return NULL;
399 for (
int i = 0;
i <
n;
i++) {
400 const void*
elem =
self->funcs->base.index(
self->parent,
i);
401 item = PyTuple_New(2);
402 py_elem =
self->funcs->base.get_elem_wrapper(
elem);
403 if (!item || !py_elem)
goto error;
404 PyTuple_SetItem(item, 0,
405 PyUnicode_FromString(
self->funcs->get_elem_name(
elem)));
406 PyTuple_SetItem(item, 1, py_elem);
407 PyList_SetItem(
ret,
i, item);
423 if (PyObject_TypeCheck(other,
Py_TYPE(
self))) {
428 if (!PyDict_Check(other))
return 0;
430 PyObject* self_dict = PyDict_New();
431 PyDict_Merge(self_dict, (PyObject*)
self, 0);
432 int eq = PyObject_RichCompareBool(self_dict, other, Py_EQ);
433 Py_DECREF(self_dict);
440 if (opid != Py_EQ && opid != Py_NE) {
441 Py_RETURN_NOTIMPLEMENTED;
444 if (opid == Py_NE)
ret = !
ret;
445 return PyBool_FromLong(
ret);
492 const void* parent, PyObject* parent_obj) {
496 map->parent = parent;
497 map->parent_obj = parent_obj;
498 Py_INCREF(parent_obj);
499 return &
map->ob_base;
504 Py_DECREF(
self->parent_obj);
510 return self->funcs->base.get_elem_count(
self->parent);
515 long num = PyLong_AsLong(
key);
516 if (
num == -1 && PyErr_Occurred()) {
520 return self->funcs->lookup(
self->parent,
num);
528 return self->funcs->base.get_elem_wrapper(
elem);
530 PyErr_SetObject(PyExc_KeyError,
key);
538 ".ByNumberMap' object does not support item assignment");
545 PyObject* default_value = Py_None;
546 if (!PyArg_UnpackTuple(
args,
"get", 1, 2, &
key, &default_value)) {
552 return self->funcs->base.get_elem_wrapper(
elem);
566 int n =
self->funcs->base.get_elem_count(
self->parent);
567 PyObject*
ret = PyList_New(
n);
568 if (!
ret)
return NULL;
569 for (
int i = 0;
i <
n;
i++) {
570 const void*
elem =
self->funcs->base.index(
self->parent,
i);
571 PyObject*
key = PyLong_FromLong(
self->funcs->get_elem_num(
elem));
584 int n =
self->funcs->base.get_elem_count(
self->parent);
585 PyObject*
ret = PyList_New(
n);
586 if (!
ret)
return NULL;
587 for (
int i = 0;
i <
n;
i++) {
588 const void*
elem =
self->funcs->base.index(
self->parent,
i);
589 PyObject* py_elem =
self->funcs->base.get_elem_wrapper(
elem);
590 if (!py_elem)
goto error;
591 PyList_SetItem(
ret,
i, py_elem);
602 int n =
self->funcs->base.get_elem_count(
self->parent);
603 PyObject*
ret = PyList_New(
n);
606 if (!
ret)
return NULL;
607 for (
int i = 0;
i <
n;
i++) {
608 const void*
elem =
self->funcs->base.index(
self->parent,
i);
610 item = PyTuple_New(2);
611 py_elem =
self->funcs->base.get_elem_wrapper(
elem);
612 if (!item || !py_elem)
goto error;
613 PyTuple_SetItem(item, 0, PyLong_FromLong(
number));
614 PyTuple_SetItem(item, 1, py_elem);
615 PyList_SetItem(
ret,
i, item);
637 if (PyObject_TypeCheck(other,
Py_TYPE(
self))) {
642 if (!PyDict_Check(other))
return 0;
644 PyObject* self_dict = PyDict_New();
645 PyDict_Merge(self_dict, (PyObject*)
self, 0);
646 int eq = PyObject_RichCompareBool(self_dict, other, Py_EQ);
647 Py_DECREF(self_dict);
654 if (opid != Py_EQ && opid != Py_NE) {
655 Py_RETURN_NOTIMPLEMENTED;
658 if (opid == Py_NE)
ret = !
ret;
659 return PyBool_FromLong(
ret);
698 s->descriptor_iterator_type =
702 return s->by_name_map_type && s->by_number_map_type &&
703 s->descriptor_iterator_type && s->generic_sequence_type;