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