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