From 6ee43e37263f285c6593d966560e8600dfa360db Mon Sep 17 00:00:00 2001
From: Marco Biasini <mvbiasini@gmail.com>
Date: Tue, 5 Mar 2013 20:15:48 +0100
Subject: [PATCH] speed up intersection at expense of memory

---
 modules/mol/base/src/chain_view.cc | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/modules/mol/base/src/chain_view.cc b/modules/mol/base/src/chain_view.cc
index b8fc1b55b..8f8d2c0e1 100644
--- a/modules/mol/base/src/chain_view.cc
+++ b/modules/mol/base/src/chain_view.cc
@@ -72,6 +72,17 @@ public:
   }
   EntityViewDataWeakPtr entity;
   ResidueViewList residues;
+  std::map<unsigned long, ResidueView> handle_to_view;
+
+  ResidueView ViewForHandle(const ResidueHandle& r)
+  {
+    std::map<unsigned long, ResidueView>::iterator i=handle_to_view.find(r.GetHashCode());
+    if (i!=handle_to_view.end()) {
+      return i->second;
+    }
+    return ResidueView();
+  }
+
   bool            in_sequence;
 };
 
@@ -184,10 +195,7 @@ ResidueView ChainView::FindResidue(const ResidueHandle& residue) const {
 
 ResidueView ChainView::ViewForHandle(const ResidueHandle& handle) const {
   this->CheckValidity();  
-  const ResidueViewList& l=data_->residues;
-  ResidueViewList::const_iterator i;
-  i=std::find_if(l.begin(), l.end(), bind(&ResidueView::GetHandle, _1)==handle);
-  return i==data_->residues.end() ? ResidueView() : *i;
+  return data_->ViewForHandle(handle);
 }
 
 
@@ -209,6 +217,7 @@ ResidueView ChainView::AddResidue(const ResidueHandle& residue_handle,
       data_->in_sequence=false;
   }  
   data_->residues.push_back(rv);
+  data_->handle_to_view[rv.GetHandle().GetHashCode()] = rv;
   if (flags & ViewAddFlag::INCLUDE_ATOMS) {
     const impl::AtomImplList& l=residue_handle.Impl()->GetAtomList();
     for (impl::AtomImplList::const_iterator i=l.begin(); i!=l.end(); ++i) {
@@ -267,6 +276,7 @@ void ChainView::RemoveResidue(ResidueView view) {
     }
   }
   data_->residues.erase(to_del);
+  data_->handle_to_view.erase(view.GetHandle().GetHashCode());
 }
 
 ResidueView ChainView::AddResidue(const ResidueView& residue_view, 
@@ -287,6 +297,7 @@ ResidueView ChainView::AddResidue(const ResidueView& residue_view,
       data_->in_sequence=false;
   }
   data_->residues.push_back(rv);
+  data_->handle_to_view[rv.GetHandle().GetHashCode()] = rv;
   if (flags & ViewAddFlag::INCLUDE_ATOMS) {
     AtomViewList::const_iterator i=residue_view.GetAtomList().begin();
     for (; i!=residue_view.GetAtomList().end(); ++i) {
@@ -301,6 +312,7 @@ void ChainView::RemoveResidues() {
   std::for_each(data_->residues.begin(), data_->residues.end(),
                 bind(&ResidueView::RemoveAtoms, _1));
   data_->residues.clear();
+  data_->handle_to_view.clear();
 }
 
 
-- 
GitLab