| 385 | //! Wrapper around Index::...::modify that keeps m_peerinfo up to date. |
| 386 | template<typename Tag, typename Modifier> |
| 387 | void Modify(Iter<Tag> it, Modifier modifier) |
| 388 | { |
| 389 | auto peerit = m_peerinfo.find(it->m_peer); |
| 390 | peerit->second.m_completed -= it->GetState() == State::COMPLETED; |
| 391 | peerit->second.m_requested -= it->GetState() == State::REQUESTED; |
| 392 | m_index.get<Tag>().modify(it, std::move(modifier)); |
| 393 | peerit->second.m_completed += it->GetState() == State::COMPLETED; |
| 394 | peerit->second.m_requested += it->GetState() == State::REQUESTED; |
| 395 | } |
| 396 | |
| 397 | //! Convert a CANDIDATE_DELAYED announcement into a CANDIDATE_READY. If this makes it the new best |
| 398 | //! CANDIDATE_READY (and no REQUESTED exists) and better than the CANDIDATE_BEST (if any), it becomes the new |