diff --git a/modules/mol/base/src/chain_handle.cc b/modules/mol/base/src/chain_handle.cc index b50917c1084aeabc898542f953176d64f26f33b0..842017ae4ba00bee32ec4238239f211a39786f90 100644 --- a/modules/mol/base/src/chain_handle.cc +++ b/modules/mol/base/src/chain_handle.cc @@ -125,23 +125,26 @@ bool ChainHandle::operator!=(const ChainHandle& ref) const ResidueHandleIter ChainHandle::ResiduesBegin() const { this->CheckValidity(); impl::ChainImplPtr c=Impl(); - impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName()); - return ResidueHandleIter(cc, c->GetResidueList().begin(), + return ResidueHandleIter(c->GetEntity()->GetChainIter(this->GetName()), + impl::begin(c->GetResidueList()), c->GetEntity(), true); } ResidueHandleIter ChainHandle::ResiduesEnd() const { this->CheckValidity(); impl::ChainImplPtr c=Impl(); - impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName()); - impl::ChainImplList::iterator nc=cc; ++nc; - if (nc!=c->GetEntity()->GetChainList().end()) { + impl::pointer_it<impl::ChainImplPtr> cc=c->GetEntity()->GetChainIter(this->GetName()); + /*impl::pointer_it<impl::ChainImplPtr> nc=cc; ++nc; + + if (nc!=impl::end(c->GetEntity()->GetChainList())) { return ResidueHandleIter(nc, (*nc)->GetResidueList().begin(), c->GetEntity(), true); } else { return ResidueHandleIter(cc, c->GetResidueList().end(), c->GetEntity(), true); - } + }*/ + return ResidueHandleIter(cc, impl::end(c->GetResidueList()), + c->GetEntity(), true); } AtomHandleIter ChainHandle::AtomsBegin() const @@ -152,9 +155,9 @@ AtomHandleIter ChainHandle::AtomsBegin() const return AtomHandleIter(); } - impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName()); - return AtomHandleIter(cc, c->GetResidueList().begin(), - c->GetResidueList().front()->GetAtomList().begin(), + impl::pointer_it<impl::ChainImplPtr> cc=c->GetEntity()->GetChainIter(this->GetName()); + return AtomHandleIter(cc, impl::begin(c->GetResidueList()), + impl::begin(c->GetResidueList().front()->GetAtomList()), c->GetEntity(), true); } @@ -165,15 +168,16 @@ AtomHandleIter ChainHandle::AtomsEnd() const { if (c->GetResidueList().empty()) { return AtomHandleIter(); } - impl::ChainImplList::iterator cc=c->GetEntity()->GetChain(this->GetName()); - impl::ChainImplList::iterator nc=cc; ++nc; + impl::pointer_it<impl::ChainImplPtr> cc=c->GetEntity()->GetChainIter(this->GetName()); + impl::pointer_it<impl::ChainImplPtr> nc=cc; ++nc; impl::ResidueImplList& rc=(*nc)->GetResidueList(); - if (nc!=c->GetEntity()->GetChainList().end()) { - return AtomHandleIter(nc, rc.begin(), rc.front()->GetAtomList().begin(), + if (nc!=impl::end(c->GetEntity()->GetChainList())) { + return AtomHandleIter(nc, impl::begin(rc), + impl::begin(rc.front()->GetAtomList()), c->GetEntity(), false); } else { - return AtomHandleIter(cc, c->GetResidueList().end(), - c->GetResidueList().back()->GetAtomList().end(), + return AtomHandleIter(cc, impl::end(c->GetResidueList()), + impl::end(c->GetResidueList().back()->GetAtomList()), c->GetEntity(), false); } } diff --git a/modules/mol/base/src/entity_handle.cc b/modules/mol/base/src/entity_handle.cc index 600c479ce9e6df2d578c1aa933e7756b3d6dbc8c..b7fad67139096c0e07aa5323cb0fcf1929870b72 100644 --- a/modules/mol/base/src/entity_handle.cc +++ b/modules/mol/base/src/entity_handle.cc @@ -262,8 +262,8 @@ ResidueHandleIter EntityHandle::ResiduesBegin() const { } impl::EntityImplPtr i=Impl(); impl::ChainImplPtr chain=i->GetChainList().front(); - return ResidueHandleIter(i->GetChainList().begin(), - chain->GetResidueList().begin(), i, true); + return ResidueHandleIter(impl::begin(i->GetChainList()), + impl::begin(chain->GetResidueList()), i, true); } ResidueHandleIter EntityHandle::ResiduesEnd() const { @@ -273,8 +273,8 @@ ResidueHandleIter EntityHandle::ResiduesEnd() const { } impl::EntityImplPtr i=Impl(); impl::ChainImplPtr chain=i->GetChainList().back(); - return ResidueHandleIter(i->GetChainList().end(), - chain->GetResidueList().end(), i, false); + return ResidueHandleIter(impl::end(i->GetChainList()), + impl::end(chain->GetResidueList()), i, false); } ChainHandleIter EntityHandle::ChainsBegin() const { @@ -298,8 +298,8 @@ AtomHandleIter EntityHandle::AtomsBegin() const { if (r.empty()) { return AtomHandleIter(); } - return AtomHandleIter(ent->GetChainList().begin(), r.begin(), - r.front()->GetAtomList().begin(), ent, true); + return AtomHandleIter(impl::begin(ent->GetChainList()), impl::begin(r), + impl::begin(r.front()->GetAtomList()), ent, true); } AtomHandleIter EntityHandle::AtomsEnd() const @@ -313,8 +313,8 @@ AtomHandleIter EntityHandle::AtomsEnd() const if (r.empty()) { return AtomHandleIter(); } - return AtomHandleIter(ent->GetChainList().end(), r.end(), - r.back()->GetAtomList().end(), ent, false); + return AtomHandleIter(impl::end(ent->GetChainList()), impl::end(r), + impl::end(r.back()->GetAtomList()), ent, false); } XCSEditor EntityHandle::RequestXCSEditor(EditMode mode) const diff --git a/modules/mol/base/src/entity_view.cc b/modules/mol/base/src/entity_view.cc index 639c1e2bd24d3040072af87e50175e3bf64007eb..b6c5deabc1defba0b2c8cf3976b449fd53d0ff4c 100644 --- a/modules/mol/base/src/entity_view.cc +++ b/modules/mol/base/src/entity_view.cc @@ -472,8 +472,9 @@ AtomViewIter EntityView::AtomsBegin() const if (rvl.empty()) { return AtomViewIter(); } - return AtomViewIter(data_->chains.begin(), rvl.begin(), - rvl.front().GetAtomList().begin(), *this, true); + return AtomViewIter(impl::begin(data_->chains), impl::begin(rvl), + impl::begin(rvl.front().GetAtomList()), + *this, true); } AtomViewIter EntityView::AtomsEnd() const { @@ -485,8 +486,8 @@ AtomViewIter EntityView::AtomsEnd() const { if (rvl.empty()) { return AtomViewIter(); } - return AtomViewIter(data_->chains.end(), rvl.end(), - rvl.back().GetAtomList().end(), *this, false); + return AtomViewIter(impl::end(data_->chains), impl::end(rvl), + impl::end(rvl.back().GetAtomList()), *this, false); } ResidueViewIter EntityView::ResiduesBegin() const @@ -496,7 +497,8 @@ ResidueViewIter EntityView::ResiduesBegin() const return ResidueViewIter(); } const ResidueViewList& rvl=data_->chains.front().GetResidueList(); - return ResidueViewIter(data_->chains.begin(), rvl.begin(), *this, true); + return ResidueViewIter(impl::begin(data_->chains), + impl::begin(rvl), *this, true); } ResidueViewIter EntityView::ResiduesEnd() const @@ -506,7 +508,8 @@ ResidueViewIter EntityView::ResiduesEnd() const return ResidueViewIter(); } const ResidueViewList& rvl=data_->chains.back().GetResidueList(); - return ResidueViewIter(data_->chains.end(), rvl.end(), *this, false); + return ResidueViewIter(impl::end(data_->chains), + impl::end(rvl), *this, false); } diff --git a/modules/mol/base/src/impl/CMakeLists.txt b/modules/mol/base/src/impl/CMakeLists.txt index 3de4864e7a11e9dd29904fd60f997bab8cec2e51..41ddeb0b5672a5081a97b63ec1a6a5c3cdc497d5 100644 --- a/modules/mol/base/src/impl/CMakeLists.txt +++ b/modules/mol/base/src/impl/CMakeLists.txt @@ -14,6 +14,7 @@ PARENT_SCOPE ) set(OST_MOL_IMPL_HEADERS +pointer_iterator.hh atom_group.hh atom_impl.hh atom_impl_fw.hh diff --git a/modules/mol/base/src/impl/entity_impl.cc b/modules/mol/base/src/impl/entity_impl.cc index c7eb101630db5e9723d848b50fa4abec29d3f2f7..e717342227cc929559b261a672fed9ea26b181f4 100644 --- a/modules/mol/base/src/impl/entity_impl.cc +++ b/modules/mol/base/src/impl/entity_impl.cc @@ -1191,6 +1191,18 @@ impl::ChainImplList::iterator EntityImpl::GetChain(const String& name) } return cc.end(); } + +pointer_it<ChainImplPtr> EntityImpl::GetChainIter(const String& name) +{ + impl::ChainImplList& cc=this->GetChainList(); + for (size_t i=0; i<cc.size(); ++i) { + if (cc[i]->GetName()==name) { + return &cc.front()+i; + } + } + return pointer_it<ChainImplPtr>(NULL); +} + void EntityImpl::RenameChain(ChainImplPtr chain, const String& new_name) { ChainImplList::iterator i; diff --git a/modules/mol/base/src/impl/entity_impl.hh b/modules/mol/base/src/impl/entity_impl.hh index 81f533bf0a9f3c696276b7e5e487e14a7125bfaa..ca83cf254b3b0c6c8315260a719261105c488a1f 100644 --- a/modules/mol/base/src/impl/entity_impl.hh +++ b/modules/mol/base/src/impl/entity_impl.hh @@ -39,7 +39,7 @@ #include <ost/mol/impl/connector_impl_fw.hh> #include <ost/mol/impl/torsion_impl_fw.hh> #include <ost/mol/impl/fragment_impl_fw.hh> - +#include <ost/mol/impl/pointer_iterator.hh> #include <ost/mol/entity_visitor_fw.hh> #include <ost/mol/entity_observer_fw.hh> #include <ost/mol/entity_view.hh> @@ -242,6 +242,7 @@ public: impl::ChainImplList::iterator GetChain(const String& name); + pointer_it<ChainImplPtr> GetChainIter(const String& name); void SetName(const String& ent_name); private: diff --git a/modules/mol/base/src/impl/pointer_iterator.hh b/modules/mol/base/src/impl/pointer_iterator.hh new file mode 100644 index 0000000000000000000000000000000000000000..63a5676ca6f22381e5edcf9f2325d2a778718c06 --- /dev/null +++ b/modules/mol/base/src/impl/pointer_iterator.hh @@ -0,0 +1,79 @@ +//------------------------------------------------------------------------------ +// This file is part of the OpenStructure project <www.openstructure.org> +// +// Copyright (C) 2008-2010 by the OpenStructure authors +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation; either version 3.0 of the License, or (at your option) +// any later version. +// This library is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +// details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this library; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +//------------------------------------------------------------------------------ +#ifndef OST_MOL_IMPL_POINTER_ITERATOR_HH +#define OST_MOL_IMPL_POINTER_ITERATOR_HH + +#include <vector> + +namespace ost { namespace mol { namespace impl { + +template <typename T> +class pointer_it : public std::iterator<std::forward_iterator_tag, T>{ +public: + pointer_it(T* s): s_(s) { } + + pointer_it<T>& operator++() + { + ++s_; + return *this; + } + pointer_it<T>& operator+(int rhs) + { + s_+=rhs; + return *this; + } + + bool operator==(const pointer_it<T>& rhs) const + { + return rhs.s_==s_; + } + + bool operator!=(const pointer_it<T>&rhs) const + { + return !(*this==rhs); + } + + T& operator*() + { + return *s_; + } + + T* operator->() + { + return s_; + } +private: + T* s_; +}; + +template <typename T> +inline pointer_it<T> begin(const std::vector<T>& values) +{ + return pointer_it<T>(values.empty() ? NULL : const_cast<T*>(&values.front())); +} + +template <typename T> +inline pointer_it<T> end(const std::vector<T>& values) +{ + return pointer_it<T>(values.empty() ? NULL : const_cast<T*>(&values.back()+1)); +} + +}}} + +#endif diff --git a/modules/mol/base/src/iterator.cc b/modules/mol/base/src/iterator.cc index c5df5394482a7853ec207b67b94e31088c38baa2..05fc8f59e981cd6f7867e60bbbd76b44374dbdc6 100644 --- a/modules/mol/base/src/iterator.cc +++ b/modules/mol/base/src/iterator.cc @@ -27,18 +27,19 @@ namespace ost { namespace mol { void ResidueHandleIter::SkipEmpty() { - if (cur_res_==(*cur_chain_)->GetResidueList().end()) { + if (cur_res_==impl::end((*cur_chain_)->GetResidueList())) { // we have to skip over empty chains otherwise we end up pointing to an // invalid residue. do { ++cur_chain_; - if (ent_->GetChainList().end()==cur_chain_) { + if (impl::end(ent_->GetChainList())==cur_chain_) { break; } - cur_res_=(*cur_chain_)->GetResidueList().begin(); + cur_res_=impl::begin((*cur_chain_)->GetResidueList()); } while ((*cur_chain_)->GetResidueList().empty()); } } + ResidueHandleIter& ResidueHandleIter::operator++() { ++cur_res_; @@ -46,8 +47,8 @@ ResidueHandleIter& ResidueHandleIter::operator++() return *this; } -ResidueHandleIter::ResidueHandleIter(impl::ChainImplList::iterator chain_it, - impl::ResidueImplList::iterator res_it, +ResidueHandleIter::ResidueHandleIter(impl::pointer_it<impl::ChainImplPtr> chain_it, + impl::pointer_it<impl::ResidueImplPtr> res_it, impl::EntityImplPtr ent, bool skip_empty) : cur_chain_(chain_it), cur_res_(res_it), ent_(ent) { @@ -68,15 +69,15 @@ ResidueView ResidueViewIter::operator*() { void ResidueViewIter::SkipEmpty() { - if (cur_res_==cur_chain_->GetResidueList().end()) { + if (cur_res_==impl::end(cur_chain_->GetResidueList())) { // we have to skip over empty chains otherwise we end up pointing to an // invalid residue. do { ++cur_chain_; - if (ent_.GetChainList().end()==cur_chain_) { + if (impl::end(ent_.GetChainList())==cur_chain_) { break; } - cur_res_=cur_chain_->GetResidueList().begin(); + cur_res_=impl::begin(cur_chain_->GetResidueList()); } while (cur_chain_->GetResidueList().empty()); } } @@ -86,16 +87,8 @@ ResidueViewIter& ResidueViewIter::operator++() { return *this; } -ResidueViewIter::ResidueViewIter() -#ifdef _MSC_VER - : cur_res_() -#else - : cur_res_(NULL) -#endif -{} - -ResidueViewIter::ResidueViewIter(ChainViewList::const_iterator chain_it, - ResidueViewList::const_iterator res_it, +ResidueViewIter::ResidueViewIter(impl::pointer_it<ChainView> chain_it, + impl::pointer_it<ResidueView> res_it, EntityView ent, bool skip_empty) : cur_chain_(chain_it), cur_res_(res_it), ent_(ent) { @@ -104,17 +97,9 @@ ResidueViewIter::ResidueViewIter(ChainViewList::const_iterator chain_it, } } -AtomHandleIter::AtomHandleIter() -#ifdef _MSC_VER - : cur_atom_() -#else - : cur_atom_(NULL) -#endif -{} - -AtomHandleIter::AtomHandleIter(impl::ChainImplList::iterator chain_it, - impl::ResidueImplList::iterator res_it, - impl::AtomImplList::iterator atom_it, +AtomHandleIter::AtomHandleIter(impl::pointer_it<impl::ChainImplPtr> chain_it, + impl::pointer_it<impl::ResidueImplPtr> res_it, + impl::pointer_it<impl::AtomImplPtr> atom_it, impl::EntityImplPtr ent, bool skip_empty) : cur_chain_(chain_it), cur_res_(res_it), cur_atom_(atom_it), ent_(ent) @@ -130,26 +115,26 @@ AtomHandle AtomHandleIter::operator*() { void AtomHandleIter::SkipEmpty() { - if ((*cur_res_)->GetAtomList().end()==cur_atom_) { + if (impl::end((*cur_res_)->GetAtomList())==cur_atom_) { // we have to skip over empty chains and residues otherwise we end up // pointing to an invalid atom. do { ++cur_res_; - if ((*cur_chain_)->GetResidueList().end()==cur_res_) { + if (impl::end((*cur_chain_)->GetResidueList())==cur_res_) { do { ++cur_chain_; - if (ent_->GetChainList().end()==cur_chain_) { + if (impl::end(ent_->GetChainList())==cur_chain_) { return; } - cur_res_=(*cur_chain_)->GetResidueList().begin(); + cur_res_=impl::begin((*cur_chain_)->GetResidueList()); if (!(*cur_chain_)->GetResidueList().empty()) - cur_atom_=(*cur_res_)->GetAtomList().begin(); + cur_atom_=impl::begin((*cur_res_)->GetAtomList()); else - cur_atom_=impl::AtomImplList::iterator(); + cur_atom_=impl::pointer_it<impl::AtomImplPtr>(NULL); } while ((*cur_chain_)->GetResidueList().empty()); } else { - cur_atom_=(*cur_res_)->GetAtomList().begin(); + cur_atom_=impl::begin((*cur_res_)->GetAtomList()); } } while ((*cur_res_)->GetAtomList().empty()); } @@ -162,17 +147,9 @@ AtomHandleIter& AtomHandleIter::operator++() return *this; } -AtomViewIter::AtomViewIter() -#ifdef _MSC_VER - : cur_atom_() -#else - : cur_atom_(NULL) -#endif -{} - -AtomViewIter::AtomViewIter(ChainViewList::const_iterator chain_it, - ResidueViewList::const_iterator res_it, - AtomViewList::const_iterator atom_it, +AtomViewIter::AtomViewIter(impl::pointer_it<ChainView> chain_it, + impl::pointer_it<ResidueView> res_it, + impl::pointer_it<AtomView> atom_it, EntityView ent, bool skip_empty) : cur_chain_(chain_it), cur_res_(res_it), cur_atom_(atom_it), ent_(ent) { @@ -183,23 +160,24 @@ AtomViewIter::AtomViewIter(ChainViewList::const_iterator chain_it, void AtomViewIter::SkipEmpty() { - if (cur_res_->GetAtomList().end()==cur_atom_) { + if (impl::end(cur_res_->GetAtomList())==cur_atom_) { do { ++cur_res_; - if (cur_chain_->GetResidueList().end()==cur_res_) { + if (impl::end(cur_chain_->GetResidueList())==cur_res_) { do { ++cur_chain_; - if (ent_.GetChainList().end()==cur_chain_) { + if (impl::end(ent_.GetChainList())==cur_chain_) { return; } - cur_res_=cur_chain_->GetResidueList().begin(); - if (!cur_chain_->GetResidueList().empty()) - cur_atom_=cur_res_->GetAtomList().begin(); - else - cur_atom_=AtomViewList::const_iterator(); + cur_res_=impl::begin(cur_chain_->GetResidueList()); + if (!cur_chain_->GetResidueList().empty()) { + cur_atom_=impl::begin(cur_res_->GetAtomList()); + } else { + cur_atom_=impl::pointer_it<AtomView>(NULL); + } } while (cur_chain_->GetResidueList().empty()); } else { - cur_atom_=cur_res_->GetAtomList().begin(); + cur_atom_=impl::begin(cur_res_->GetAtomList()); } } while (cur_res_->GetAtomList().empty()); } diff --git a/modules/mol/base/src/iterator.hh b/modules/mol/base/src/iterator.hh index 04b4387f9b445171555b516bc6eb50f8220cb7f1..d127985538c923ff3cfac08e80485989f84da085 100644 --- a/modules/mol/base/src/iterator.hh +++ b/modules/mol/base/src/iterator.hh @@ -21,9 +21,7 @@ #include <map> -#include <ost/mol/impl/entity_impl_fw.hh> -#include <ost/mol/impl/chain_impl_fw.hh> -#include <ost/mol/impl/residue_impl_fw.hh> + #include <ost/mol/chain_handle.hh> #include <ost/mol/chain_view.hh> #include <ost/mol/residue_handle.hh> @@ -32,6 +30,10 @@ #include <ost/mol/atom_view.hh> #include <ost/mol/entity_handle.hh> #include <ost/mol/entity_view.hh> +#include <ost/mol/impl/entity_impl_fw.hh> +#include <ost/mol/impl/chain_impl_fw.hh> +#include <ost/mol/impl/residue_impl_fw.hh> +#include <ost/mol/impl/pointer_iterator.hh> namespace ost { namespace mol { @@ -78,10 +80,12 @@ private: I cur_; }; + namespace impl { - // forward declearation of chain impl map. + // forward declearation of chain impl list. typedef std::vector<ChainImplPtr> ChainImplList; } + class DLLEXPORT_OST_MOL ChainHandleIter : public std::iterator<std::forward_iterator_tag, ChainHandle> { public: // internally used constructors @@ -112,20 +116,20 @@ private: class DLLEXPORT_OST_MOL ResidueHandleIter : public std::iterator<std::forward_iterator_tag, ResidueHandle> { public: - ResidueHandleIter() { - } - ResidueHandleIter(impl::ChainImplList::iterator chain_it, - impl::ResidueImplList::iterator res_it, + ResidueHandleIter(): cur_chain_(NULL), cur_res_(NULL) { } + ResidueHandleIter(impl::pointer_it<impl::ChainImplPtr> chain_it, + impl::pointer_it<impl::ResidueImplPtr> res_it, 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_; -#else + + bool operator==(const ResidueHandleIter& rhs) const + { return cur_res_==rhs.cur_res_; -#endif } + void SkipEmpty(); - bool operator!=(const ResidueHandleIter& rhs) const { + + bool operator!=(const ResidueHandleIter& rhs) const + { return !this->operator==(rhs); } ResidueHandleIter& operator++(); @@ -133,28 +137,25 @@ public: ResidueHandle operator*(); private: - impl::ChainImplList::iterator cur_chain_; - impl::ResidueImplList::iterator cur_res_; + impl::pointer_it<impl::ChainImplPtr> cur_chain_; + impl::pointer_it<impl::ResidueImplPtr> cur_res_; impl::EntityImplPtr ent_; }; class DLLEXPORT_OST_MOL ResidueViewIter : public std::iterator<std::forward_iterator_tag, ResidueView> { public: - ResidueViewIter(); + ResidueViewIter(): cur_chain_(NULL), cur_res_(NULL) { } - ResidueViewIter(ChainViewList::const_iterator chain_it, - ResidueViewList::const_iterator res_it, + ResidueViewIter(impl::pointer_it<ChainView> chain_it, + impl::pointer_it<ResidueView> res_it, 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 } void SkipEmpty(); + bool operator!=(const ResidueViewIter& rhs) const { return !this->operator==(rhs); } @@ -163,72 +164,70 @@ public: ResidueView operator*(); private: - ChainViewList::const_iterator cur_chain_; - ResidueViewList::const_iterator cur_res_; - EntityView ent_; + impl::pointer_it<ChainView> cur_chain_; + impl::pointer_it<ResidueView> cur_res_; + EntityView ent_; }; class DLLEXPORT_OST_MOL AtomHandleIter : public std::iterator<std::forward_iterator_tag, AtomHandle> { public: - AtomHandleIter(); + AtomHandleIter(): cur_chain_(NULL), cur_res_(NULL), cur_atom_(NULL) { } - AtomHandleIter(impl::ChainImplList::iterator chain_it, - impl::ResidueImplList::iterator res_it, - impl::AtomImplList::iterator atom_it, + AtomHandleIter(impl::pointer_it<impl::ChainImplPtr> chain_it, + impl::pointer_it<impl::ResidueImplPtr> res_it, + impl::pointer_it<impl::AtomImplPtr> atom_it, impl::EntityImplPtr ent, bool skip_empty); - bool operator==(const AtomHandleIter& rhs) const { -#if defined(_MSC_VER) - return cur_chain_==rhs.cur_chain_ && cur_res_==rhs.cur_res_ && - cur_atom_==rhs.cur_atom_; -#else + bool operator==(const AtomHandleIter& rhs) const + { return cur_atom_==rhs.cur_atom_; -#endif } - bool operator!=(const AtomHandleIter& rhs) const { - return !this->operator==(rhs); + + bool operator!=(const AtomHandleIter& rhs) const + { + return !this->operator==(rhs); } + AtomHandleIter& operator++(); AtomHandle operator*(); private: void SkipEmpty(); - impl::ChainImplList::iterator cur_chain_; - impl::ResidueImplList::iterator cur_res_; - impl::AtomImplList::iterator cur_atom_; + impl::pointer_it<impl::ChainImplPtr> cur_chain_; + impl::pointer_it<impl::ResidueImplPtr> cur_res_; + impl::pointer_it<impl::AtomImplPtr> cur_atom_; impl::EntityImplPtr ent_; }; class DLLEXPORT_OST_MOL AtomViewIter : public std::iterator<std::forward_iterator_tag, AtomView> { public: - AtomViewIter(); + AtomViewIter(): cur_chain_(NULL), cur_res_(NULL), cur_atom_(NULL) { } - AtomViewIter(ChainViewList::const_iterator chain_it, - ResidueViewList::const_iterator res_it, - AtomViewList::const_iterator atom_it, + AtomViewIter(impl::pointer_it<ChainView> chain_it, + impl::pointer_it<ResidueView> res_it, + impl::pointer_it<AtomView> atom_it, EntityView ent, bool skip_empty); - bool operator==(const AtomViewIter& rhs) const { -#if defined(_MSC_VER) - return cur_chain_==rhs.cur_chain_ && cur_res_==rhs.cur_res_ && - cur_atom_==rhs.cur_atom_; -#else + bool operator==(const AtomViewIter& rhs) const + { return cur_atom_==rhs.cur_atom_; -#endif } - bool operator!=(const AtomViewIter& rhs) const { + + bool operator!=(const AtomViewIter& rhs) const + { return !this->operator==(rhs); } + AtomViewIter& operator++(); AtomView operator*(); private: void SkipEmpty(); - ChainViewList::const_iterator cur_chain_; - ResidueViewList::const_iterator cur_res_; - AtomViewList::const_iterator cur_atom_; + impl::pointer_it<ChainView> cur_chain_; + impl::pointer_it<ResidueView> cur_res_; + impl::pointer_it<AtomView> cur_atom_; EntityView ent_; }; diff --git a/modules/mol/base/src/residue_handle.cc b/modules/mol/base/src/residue_handle.cc index bfc57c1949c209f753e0592730669f82f179c020..1719708c9a0e52b9a6892bfc9b8b3560150547d0 100644 --- a/modules/mol/base/src/residue_handle.cc +++ b/modules/mol/base/src/residue_handle.cc @@ -181,9 +181,9 @@ AtomHandleIter ResidueHandle::AtomsBegin() const impl::ResidueImplPtr r=Impl(); int index=this->GetIndex(); impl::ChainImplPtr c=r->GetChain(); - impl::ChainImplList::iterator cc=r->GetEntity()->GetChain(c->GetName()); - return AtomHandleIter(cc, c->GetResidueList().begin()+index, - r->GetAtomList().begin(), r->GetEntity(), true); + impl::pointer_it<impl::ChainImplPtr> cc=r->GetEntity()->GetChainIter(c->GetName()); + return AtomHandleIter(cc, impl::begin(c->GetResidueList())+index, + impl::begin(r->GetAtomList()), r->GetEntity(), true); } AtomHandleIter ResidueHandle::AtomsEnd() const @@ -192,14 +192,15 @@ AtomHandleIter ResidueHandle::AtomsEnd() const impl::ResidueImplPtr r=Impl(); int index=this->GetIndex(); impl::ChainImplPtr c=r->GetChain(); - impl::ChainImplList::iterator cc=r->GetEntity()->GetChain(c->GetName()); + impl::pointer_it<impl::ChainImplPtr> cc=r->GetEntity()->GetChainIter(c->GetName()); if (c->GetResidueList().begin()+index+1==c->GetResidueList().end()) { - return AtomHandleIter(cc, c->GetResidueList().begin()+index, - r->GetAtomList().end(), r->GetEntity(), false); + return AtomHandleIter(cc, impl::begin(c->GetResidueList())+index, + impl::begin(r->GetAtomList()), r->GetEntity(), false); } else { - impl::ResidueImplList::iterator x=(c->GetResidueList().begin()+index+1); - return AtomHandleIter(cc, c->GetResidueList().begin()+index+1, - (*x)->GetAtomList().begin(), r->GetEntity(), false); + impl::pointer_it<impl::ResidueImplPtr> x=(impl::begin(c->GetResidueList())+index+1); + return AtomHandleIter(cc, impl::begin(c->GetResidueList())+index+1, + impl::begin((*x)->GetAtomList()), + r->GetEntity(), false); } }