diff --git a/modules/seq/base/pymod/const_seq_list_export_def.hh b/modules/seq/base/pymod/const_seq_list_export_def.hh index 4c8a2706853882c58b4bce556cf89bbb523e061b..62d731d201174dba56f6381b660a99b396c2f1b1 100644 --- a/modules/seq/base/pymod/const_seq_list_export_def.hh +++ b/modules/seq/base/pymod/const_seq_list_export_def.hh @@ -24,10 +24,9 @@ .def("GetMaxLength", &C::GetMaxLength) \ .def("GetMinLength", &C::GetMinLength) \ .def("Take", &C::Take) \ - .def("Slice", &C::Slice) \ + .def("Slice", &C::Slice) \ .def("SequencesHaveEqualLength", \ &C::SequencesHaveEqualLength) \ .def("__getitem__", &C::operator[]) \ - .def("__iter__", iterator<C>()) \ .def("__len__", &C::GetCount) diff --git a/modules/seq/base/pymod/export_sequence.cc b/modules/seq/base/pymod/export_sequence.cc index 0eb5ce9f29eae682b494d5ffd2cb73f1b981fded..fe0bae238ab74d5c45eadac1099983e8fea0f533 100644 --- a/modules/seq/base/pymod/export_sequence.cc +++ b/modules/seq/base/pymod/export_sequence.cc @@ -134,6 +134,53 @@ private: AlignedColumnIterator e_; }; +struct ConstSeqListIter { + ConstSeqListIter(ConstSequenceList& list): + b_(list.begin()), e_(list.end()) + { } + + ConstSequenceHandle next() + { + if (b_==e_) { + boost::python::objects::stop_iteration_error(); + } + ConstSequenceHandle s=*b_; + ++b_; + return s; + } +private: + ConstSequenceList::iterator b_; + ConstSequenceList::iterator e_; +}; + +struct SeqListIter { + SeqListIter(SequenceList& list): + b_(list.begin()), e_(list.end()) + { } + + SequenceHandle next() + { + if (b_==e_) { + boost::python::objects::stop_iteration_error(); + } + SequenceHandle s=*b_; + ++b_; + return s; + } +private: + SequenceList::iterator b_; + SequenceList::iterator e_; +}; + +ConstSeqListIter iter_cs(ConstSequenceList& sl) +{ + return ConstSeqListIter(sl); +} + +SeqListIter iter_sl(SequenceList& sl) +{ + return SeqListIter(sl); +} RegionRangeIter iter_range1(AlignmentHandle& aln) { @@ -229,6 +276,12 @@ void export_sequence() class_<RevRegionRangeIter>("RevRegionRangeIter", no_init) .def("next", &RevRegionRangeIter::next) ; + class_<ConstSeqListIter>("ConstSeqListIter", no_init) + .def("next", &ConstSeqListIter::next) + ; + class_<SeqListIter>("SeqListIter", no_init) + .def("next", &SeqListIter::next) + ; class_<AlignmentHandle>("AlignmentHandle", init<>()) .def("GetCount", &AlignmentHandle::GetCount) .add_property("sequence_count", &AlignmentHandle::GetCount) @@ -284,10 +337,12 @@ void export_sequence() class_<ConstSequenceList>("ConstSequenceList", init<>()) CONST_SEQ_LIST_DEF(ConstSequenceList) .def("__getitem__", &do_slice_a) + .def("__iter__", &iter_cs) ; class_<SequenceList>("SequenceList", init<>()) CONST_SEQ_LIST_DEF(SequenceList) .def("__getitem__", &do_slice_b) + .def("__iter__", &iter_sl) ; class_<AlignmentList>("AlignmentList", init<>()) .def(vector_indexing_suite<AlignmentList>())