From 27dd05f1ffe7ceef7549ac59fb76792ec5fd991f Mon Sep 17 00:00:00 2001 From: marco <marco@5a81b35b-ba03-0410-adc8-b2c5c5119f08> Date: Tue, 22 Jun 2010 12:18:49 +0000 Subject: [PATCH] fix for residue iterator trouble on windows git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2440 5a81b35b-ba03-0410-adc8-b2c5c5119f08 --- modules/mol/base/src/chain_handle.cc | 6 ++--- modules/mol/base/src/entity_handle.cc | 4 ++-- modules/mol/base/src/entity_view.cc | 10 ++++---- modules/mol/base/src/iterator.cc | 33 +++++++++++++++++++-------- modules/mol/base/src/iterator.hh | 11 ++++----- 5 files changed, 39 insertions(+), 25 deletions(-) diff --git a/modules/mol/base/src/chain_handle.cc b/modules/mol/base/src/chain_handle.cc index 4581eb780..b50917c10 100644 --- a/modules/mol/base/src/chain_handle.cc +++ b/modules/mol/base/src/chain_handle.cc @@ -127,7 +127,7 @@ ResidueHandleIter ChainHandle::ResiduesBegin() const { impl::ChainImplPtr c=Impl(); impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName()); return ResidueHandleIter(cc, c->GetResidueList().begin(), - c->GetEntity()); + c->GetEntity(), true); } ResidueHandleIter ChainHandle::ResiduesEnd() const { @@ -137,10 +137,10 @@ ResidueHandleIter ChainHandle::ResiduesEnd() const { impl::ChainImplList::iterator nc=cc; ++nc; if (nc!=c->GetEntity()->GetChainList().end()) { return ResidueHandleIter(nc, (*nc)->GetResidueList().begin(), - c->GetEntity()); + c->GetEntity(), true); } else { return ResidueHandleIter(cc, c->GetResidueList().end(), - c->GetEntity()); + c->GetEntity(), true); } } diff --git a/modules/mol/base/src/entity_handle.cc b/modules/mol/base/src/entity_handle.cc index 8686df88c..600c479ce 100644 --- a/modules/mol/base/src/entity_handle.cc +++ b/modules/mol/base/src/entity_handle.cc @@ -263,7 +263,7 @@ ResidueHandleIter EntityHandle::ResiduesBegin() const { impl::EntityImplPtr i=Impl(); impl::ChainImplPtr chain=i->GetChainList().front(); return ResidueHandleIter(i->GetChainList().begin(), - chain->GetResidueList().begin(), i); + chain->GetResidueList().begin(), i, true); } ResidueHandleIter EntityHandle::ResiduesEnd() const { @@ -274,7 +274,7 @@ ResidueHandleIter EntityHandle::ResiduesEnd() const { impl::EntityImplPtr i=Impl(); impl::ChainImplPtr chain=i->GetChainList().back(); return ResidueHandleIter(i->GetChainList().end(), - chain->GetResidueList().end(), i); + chain->GetResidueList().end(), i, false); } ChainHandleIter EntityHandle::ChainsBegin() const { diff --git a/modules/mol/base/src/entity_view.cc b/modules/mol/base/src/entity_view.cc index a3819e102..639c1e2bd 100644 --- a/modules/mol/base/src/entity_view.cc +++ b/modules/mol/base/src/entity_view.cc @@ -489,22 +489,24 @@ AtomViewIter EntityView::AtomsEnd() const { rvl.back().GetAtomList().end(), *this, false); } -ResidueViewIter EntityView::ResiduesBegin() const { +ResidueViewIter EntityView::ResiduesBegin() const +{ this->CheckValidity(); if (data_->chains.empty()) { return ResidueViewIter(); } const ResidueViewList& rvl=data_->chains.front().GetResidueList(); - return ResidueViewIter(data_->chains.begin(), rvl.begin(), *this); + return ResidueViewIter(data_->chains.begin(), rvl.begin(), *this, true); } -ResidueViewIter EntityView::ResiduesEnd() const { +ResidueViewIter EntityView::ResiduesEnd() const +{ this->CheckValidity(); if (data_->chains.empty()) { return ResidueViewIter(); } const ResidueViewList& rvl=data_->chains.back().GetResidueList(); - return ResidueViewIter(data_->chains.end(), rvl.end(), *this); + return ResidueViewIter(data_->chains.end(), rvl.end(), *this, false); } diff --git a/modules/mol/base/src/iterator.cc b/modules/mol/base/src/iterator.cc index 74ff90c65..c5df53944 100644 --- a/modules/mol/base/src/iterator.cc +++ b/modules/mol/base/src/iterator.cc @@ -25,9 +25,8 @@ namespace ost { namespace mol { - -ResidueHandleIter& ResidueHandleIter::operator++() { - ++cur_res_; +void ResidueHandleIter::SkipEmpty() +{ if (cur_res_==(*cur_chain_)->GetResidueList().end()) { // we have to skip over empty chains otherwise we end up pointing to an // invalid residue. @@ -38,16 +37,23 @@ ResidueHandleIter& ResidueHandleIter::operator++() { } cur_res_=(*cur_chain_)->GetResidueList().begin(); } while ((*cur_chain_)->GetResidueList().empty()); - } + } +} +ResidueHandleIter& ResidueHandleIter::operator++() +{ + ++cur_res_; + this->SkipEmpty(); return *this; } ResidueHandleIter::ResidueHandleIter(impl::ChainImplList::iterator chain_it, impl::ResidueImplList::iterator res_it, - impl::EntityImplPtr ent) + impl::EntityImplPtr ent, bool skip_empty) : cur_chain_(chain_it), cur_res_(res_it), ent_(ent) { - + if (skip_empty) { + this->SkipEmpty(); + } } ResidueHandle ResidueHandleIter::operator*() { @@ -60,8 +66,8 @@ ResidueView ResidueViewIter::operator*() { return ResidueView(*cur_res_); } -ResidueViewIter& ResidueViewIter::operator++() { - ++cur_res_; +void ResidueViewIter::SkipEmpty() +{ if (cur_res_==cur_chain_->GetResidueList().end()) { // we have to skip over empty chains otherwise we end up pointing to an // invalid residue. @@ -72,7 +78,11 @@ ResidueViewIter& ResidueViewIter::operator++() { } cur_res_=cur_chain_->GetResidueList().begin(); } while (cur_chain_->GetResidueList().empty()); - } + } +} +ResidueViewIter& ResidueViewIter::operator++() { + ++cur_res_; + this->SkipEmpty(); return *this; } @@ -86,9 +96,12 @@ ResidueViewIter::ResidueViewIter() ResidueViewIter::ResidueViewIter(ChainViewList::const_iterator chain_it, ResidueViewList::const_iterator res_it, - EntityView ent) + EntityView ent, bool skip_empty) : cur_chain_(chain_it), cur_res_(res_it), ent_(ent) { + if (skip_empty) { + this->SkipEmpty(); + } } AtomHandleIter::AtomHandleIter() diff --git a/modules/mol/base/src/iterator.hh b/modules/mol/base/src/iterator.hh index 7bbbe4839..04b4387f9 100644 --- a/modules/mol/base/src/iterator.hh +++ b/modules/mol/base/src/iterator.hh @@ -116,7 +116,7 @@ public: } ResidueHandleIter(impl::ChainImplList::iterator chain_it, impl::ResidueImplList::iterator res_it, - impl::EntityImplPtr ent); + impl::EntityImplPtr ent, bool skip_empty); bool operator==(const ResidueHandleIter& rhs) const { #if defined(_MSC_VER) return cur_chain_==rhs.cur_chain_ && cur_res_==rhs.cur_res_; @@ -124,7 +124,7 @@ public: return cur_res_==rhs.cur_res_; #endif } - + void SkipEmpty(); bool operator!=(const ResidueHandleIter& rhs) const { return !this->operator==(rhs); } @@ -145,17 +145,16 @@ public: ResidueViewIter(ChainViewList::const_iterator chain_it, ResidueViewList::const_iterator res_it, - EntityView ent); + EntityView ent, bool skip_empty); bool operator==(const ResidueViewIter& rhs) const { #if defined(_MSC_VER) return cur_chain_==rhs.cur_chain_ && cur_res_==rhs.cur_res_; #else return cur_res_==rhs.cur_res_; -#endif - return cur_res_==rhs.cur_res_; +#endif } - + void SkipEmpty(); bool operator!=(const ResidueViewIter& rhs) const { return !this->operator==(rhs); } -- GitLab