370
373
self._generate_destructor(code_sink)
371
374
self._generate_iter_methods(code_sink)
372
375
self._generate_container_constructor(code_sink)
377
# Generate the sequence methods
378
self._generate_len_method(code_sink)
379
self._generate_concat_method(code_sink)
380
self._generate_repeat_method(code_sink)
381
self._generate_item_method(code_sink)
373
383
self._generate_type_structure(code_sink, docstring)
375
385
def _generate_type_structure(self, code_sink, docstring):
376
386
"""generate the type structure"""
388
self.pyseq.generate(code_sink)
378
390
self.pytype.slots.setdefault("tp_basicsize", "sizeof(%s)" % (self.pystruct,))
379
391
self.pytype.slots.setdefault("tp_flags", "Py_TPFLAGS_DEFAULT")
380
392
self.pytype.slots.setdefault("typestruct", self.pytypestruct)
381
393
self.pytype.slots.setdefault("tp_name", self.python_full_name)
394
self.pytype.slots.setdefault("tp_as_sequence", '&' + self.sequence_methods_name)
382
395
self.pytype.generate(code_sink)
384
397
self.iter_pytype.slots.setdefault("tp_basicsize", "sizeof(%s)" % (self.iter_pystruct,))
524
def _generate_len_method(self, code_sink):
525
container_sq_len_function_name = "_wrap_%s__sq_len" % self.pystruct
527
'WRAPPER_NAME' : container_sq_len_function_name,
528
'PYSTRUCT' : self.pystruct,
530
code_sink.writeln(r'''
533
%(WRAPPER_NAME)s (%(PYSTRUCT)s *py_self)
536
result = py_self->obj->size();
541
self.pyseq.slots.setdefault("sq_length", container_sq_len_function_name)
544
def _generate_concat_method(self, code_sink):
545
container_sq_concat_function_name = "_wrap_%s__sq_concat" % self.pystruct
547
'WRAPPER_NAME' : container_sq_concat_function_name,
548
'PYSTRUCT' : self.pystruct,
549
'PYTYPESTRUCT' : self.pytypestruct,
550
'CTYPE' : self.full_name,
551
'ADD_VALUE' : self.container_traits.add_value_method,
553
code_sink.writeln(r'''
556
%(WRAPPER_NAME)s (%(PYSTRUCT)s *py_self, %(PYSTRUCT)s *py_rhs)
559
%(PYSTRUCT)s *result;
560
%(CTYPE)s::iterator itr;
561
result = PyObject_GC_New(%(PYSTRUCT)s, &%(PYTYPESTRUCT)s);
562
result->obj = new %(CTYPE)s(*(py_self->obj));
563
for (itr = py_rhs->obj->begin(); itr != py_rhs->obj->end(); ++itr) {
564
result->obj->%(ADD_VALUE)s(*itr);
566
py_result = Py_BuildValue((char *) "N", result);
571
self.pyseq.slots.setdefault("sq_concat", container_sq_concat_function_name)
574
def _generate_repeat_method(self, code_sink):
575
container_sq_repeat_function_name = "_wrap_%s__sq_repeat" % self.pystruct
577
'WRAPPER_NAME' : container_sq_repeat_function_name,
578
'PYSTRUCT' : self.pystruct,
579
'PYTYPESTRUCT' : self.pytypestruct,
580
'CTYPE' : self.full_name,
581
'ADD_VALUE' : self.container_traits.add_value_method,
583
code_sink.writeln(r'''
586
%(WRAPPER_NAME)s (%(PYSTRUCT)s *py_self, Py_ssize_t n)
589
%(PYSTRUCT)s *result;
590
%(CTYPE)s::iterator itr;
592
result = PyObject_GC_New(%(PYSTRUCT)s, &%(PYTYPESTRUCT)s);
593
result->obj = new %(CTYPE)s();
594
for (i = 0; i != n; ++i) {
595
for (itr = py_self->obj->begin(); itr != py_self->obj->end(); ++itr) {
596
result->obj->%(ADD_VALUE)s(*itr);
599
py_result = Py_BuildValue((char *) "N", result);
604
self.pyseq.slots.setdefault("sq_repeat", container_sq_repeat_function_name)
608
def _generate_item_method(self, code_sink):
609
item_c_to_python_converter = self.module.get_root().generate_c_to_python_type_converter(self.value_type, code_sink)
610
container_sq_item_function_name = "_wrap_%s__sq_item" % self.pystruct
612
'WRAPPER_NAME' : container_sq_item_function_name,
613
'PYSTRUCT' : self.pystruct,
614
'PYTYPESTRUCT' : self.pytypestruct,
615
'CTYPE' : self.full_name,
616
'ITEM_CTYPE' : self.value_type.ctype,
617
'VALUE_CONV' : item_c_to_python_converter,
619
code_sink.writeln(r'''
622
%(WRAPPER_NAME)s (%(PYSTRUCT)s *py_self, int i)
625
%(ITEM_CTYPE)s result;
627
n = py_self->obj->size();
630
PyErr_SetString(PyExc_IndexError, "Container index out of range");
632
py_result = %(VALUE_CONV)s(&(py_self->obj->at(j)));
638
self.pyseq.slots.setdefault("sq_item", container_sq_item_function_name)
511
642
def _generate_container_constructor(self, code_sink):
512
643
container_tp_init_function_name = "_wrap_%s__tp_init" % (self.pystruct,)
513
644
item_python_to_c_converter = self.module.get_root().generate_python_to_c_type_converter(self.value_type, code_sink)