From 5c12b23ee93fb2ae47f788cb95a3c4d2296e65e1 Mon Sep 17 00:00:00 2001 From: marco <marco@5a81b35b-ba03-0410-adc8-b2c5c5119f08> Date: Fri, 9 Apr 2010 08:41:11 +0000 Subject: [PATCH] switch to hand-written iterator export The iterator export shipping with boost.python seems to be broken (or I'm too stupid to use it). git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@1952 5a81b35b-ba03-0410-adc8-b2c5c5119f08 --- modules/seq/base/pymod/export_sequence.cc | 39 +++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/modules/seq/base/pymod/export_sequence.cc b/modules/seq/base/pymod/export_sequence.cc index 9b7071c84..bf2caca97 100644 --- a/modules/seq/base/pymod/export_sequence.cc +++ b/modules/seq/base/pymod/export_sequence.cc @@ -88,6 +88,38 @@ AlignedRegion slice_aln(const AlignmentHandle& aln, slice sl) { return aln.MakeRegion(start, end-start); } + +struct RegionRangeIter { + RegionRangeIter(AlignedColumnIterator b, + AlignedColumnIterator e): + b_(b), e_(e) + { } + + AlignedColumn next() + { + if (b_==e_) { + boost::python::objects::stop_iteration_error(); + } + AlignedColumn col=*b_; + ++b_; + return col; + } +private: + AlignedColumnIterator b_; + AlignedColumnIterator e_; +}; + + +RegionRangeIter iter_range1(AlignmentHandle& aln) +{ + return RegionRangeIter(aln.begin(), aln.end()); +} + +RegionRangeIter iter_range2(AlignedRegion& aln_region) +{ + return RegionRangeIter(aln_region.begin(), aln_region.end()); +} + } void export_sequence() @@ -148,6 +180,9 @@ void export_sequence() /*class_<SequenceHandleList>("SequenceHandleList", init<>()) .def(vector_indexing_suite<SequenceHandleList>()) ;*/ + class_<RegionRangeIter>("RegionRangeIter", no_init) + .def("next", &RegionRangeIter::next) + ; class_<AlignmentHandle>("AlignmentHandle", init<>()) .def("GetCount", &AlignmentHandle::GetCount) .add_property("sequence_count", &AlignmentHandle::GetCount) @@ -167,7 +202,7 @@ void export_sequence() .def("Replace",&AlignmentHandle::Replace) .def("__getitem__", &slice_aln) .def("__getitem__", &AlignmentHandle::operator[]) - .def("__iter__", iterator<AlignmentHandle>()) + .def("__iter__", iter_range1) .add_property("sequences", &AlignmentHandle::GetSequences) .def("SetSequenceName", &AlignmentHandle::SetSequenceName) .def("SetSequenceOffset", &AlignmentHandle::SetSequenceOffset) @@ -193,7 +228,7 @@ void export_sequence() &AlignedRegion::SetMaster) .def("__getitem__", &AlignedRegion::operator[]) .def("__len__", &AlignedRegion::GetLength) - .def("__iter__", iterator<AlignedRegion>()) + .def("__iter__", iter_range2) .add_property("start", &AlignedRegion::GetStart) .add_property("end", &AlignedRegion::GetEnd) ; -- GitLab