diff --git a/modules/mol/base/src/chain_view.cc b/modules/mol/base/src/chain_view.cc index bb6562c9cd5c248f9e239176cbfff617ac0a5d2d..fac143b8527ef1c880c615f9fc5ff47808516fb9 100644 --- a/modules/mol/base/src/chain_view.cc +++ b/modules/mol/base/src/chain_view.cc @@ -221,17 +221,21 @@ void ChainView::RemoveResidue(ResidueView view) { if (!view.IsValid()) return; view.RemoveAtoms(); - int index = view.GetIndex(); ResidueViewList::iterator i=data_->residues.begin(); for (; i!=data_->residues.end(); ++i) { - int res_index = (*i).GetIndex(); if (*i==view) { - data_->residues.erase(i); + break; } - else if(index < res_index){ + } + ResidueViewList::iterator to_del = i; + int index = view.GetIndex(); + for(; i!=data_->residues.end(); ++i) { + int res_index = (*i).GetIndex(); + if(index < res_index){ (*i).SetIndex(res_index-1); } } + data_->residues.erase(to_del); } ResidueView ChainView::AddResidue(const ResidueView& residue_view, diff --git a/modules/mol/base/tests/test_residue.cc b/modules/mol/base/tests/test_residue.cc index 5b5dea5ebb813f3d100bc6fccc67618bb868fe92..332d60edd6534837b9511314b4a3aecceadbffae 100644 --- a/modules/mol/base/tests/test_residue.cc +++ b/modules/mol/base/tests/test_residue.cc @@ -45,4 +45,30 @@ BOOST_AUTO_TEST_CASE(test_in_sequence) BOOST_CHECK(!InSequence(rA,rC)); } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_CASE(test_res_index) +{ + EntityHandle eh=CreateEntity(); + XCSEditor e=eh.RequestXCSEditor(); + ChainHandle ch1=e.InsertChain("A"); + ResidueHandle rA = e.AppendResidue(ch1, "A"); + ResidueHandle rB = e.AppendResidue(ch1, "B"); + ResidueHandle rC = e.AppendResidue(ch1, "C"); + EntityView v(eh); + ChainView cv1(v, ch1); + ResidueView rvA = cv1.AddResidue(rA); + ResidueView rvB = cv1.AddResidue(rB); + ResidueView rvC = cv1.AddResidue(rC); + BOOST_CHECK_EQUAL(rvA.GetIndex(),0); + BOOST_CHECK_EQUAL(rvA.GetIndex(),cv1.GetResidueIndex(rvA.GetNumber())); + BOOST_CHECK_EQUAL(rvB.GetIndex(),1); + BOOST_CHECK_EQUAL(rvB.GetIndex(),cv1.GetResidueIndex(rvB.GetNumber())); + BOOST_CHECK_EQUAL(rvC.GetIndex(),2); + BOOST_CHECK_EQUAL(rvC.GetIndex(),cv1.GetResidueIndex(rvC.GetNumber())); + cv1.RemoveResidue(rvB); + BOOST_CHECK_EQUAL(rvA.GetIndex(),0); + BOOST_CHECK_EQUAL(rvA.GetIndex(),cv1.GetResidueIndex(rvA.GetNumber())); + BOOST_CHECK_EQUAL(rvC.GetIndex(),1); + BOOST_CHECK_EQUAL(rvC.GetIndex(),cv1.GetResidueIndex(rvC.GetNumber())); +} + +BOOST_AUTO_TEST_SUITE_END()