// $Id$ // // Copyright (C) 2004-2008 Greg Landrum and Rational Discovery LLC // // @@ All Rights Reserved @@ // This file is part of the RDKit. // The contents are covered by the terms of the BSD license // which is included in the file license.txt, found at the root // of the RDKit source tree. // #include "RingInfo.h" #include #include namespace RDKit { bool RingInfo::isAtomInRingOfSize(unsigned int idx, unsigned int size) const { PRECONDITION(df_init, "RingInfo not initialized"); if (idx < d_atomMembers.size()) { return std::find(d_atomMembers[idx].begin(), d_atomMembers[idx].end(), static_cast(size)) != d_atomMembers[idx].end(); } else { return false; } } unsigned int RingInfo::minAtomRingSize(unsigned int idx) const { PRECONDITION(df_init, "RingInfo not initialized"); if (idx < d_atomMembers.size() && d_atomMembers[idx].size()) { return *std::min_element(d_atomMembers[idx].begin(), d_atomMembers[idx].end()); } else { return 0; } } unsigned int RingInfo::numAtomRings(unsigned int idx) const { PRECONDITION(df_init, "RingInfo not initialized"); if (idx < d_atomMembers.size()) { return rdcast(d_atomMembers[idx].size()); } else { return 0; } } bool RingInfo::isBondInRingOfSize(unsigned int idx, unsigned int size) const { PRECONDITION(df_init, "RingInfo not initialized"); if (idx < d_bondMembers.size()) { return std::find(d_bondMembers[idx].begin(), d_bondMembers[idx].end(), static_cast(size)) != d_bondMembers[idx].end(); } else { return false; } } unsigned int RingInfo::minBondRingSize(unsigned int idx) const { PRECONDITION(df_init, "RingInfo not initialized"); if (idx < d_bondMembers.size() && d_bondMembers[idx].size()) { return *std::min_element(d_bondMembers[idx].begin(), d_bondMembers[idx].end()); } else { return 0; } } unsigned int RingInfo::numBondRings(unsigned int idx) const { PRECONDITION(df_init, "RingInfo not initialized"); if (idx < d_bondMembers.size()) { return rdcast(d_bondMembers[idx].size()); } else { return 0; } } unsigned int RingInfo::numRings() const { PRECONDITION(df_init, "RingInfo not initialized"); PRECONDITION(d_atomRings.size() == d_bondRings.size(), "length mismatch"); return rdcast(d_atomRings.size()); } unsigned int RingInfo::addRing(const INT_VECT &atomIndices, const INT_VECT &bondIndices) { PRECONDITION(df_init, "RingInfo not initialized"); PRECONDITION(atomIndices.size() == bondIndices.size(), "length mismatch"); int sz = rdcast(atomIndices.size()); for (auto i : atomIndices) { if (i >= static_cast(d_atomMembers.size())) d_atomMembers.resize((i) + 1); d_atomMembers[i].push_back(sz); } for (auto i : bondIndices) { if (i >= static_cast(d_bondMembers.size())) d_bondMembers.resize((i) + 1); d_bondMembers[i].push_back(sz); } d_atomRings.push_back(atomIndices); d_bondRings.push_back(bondIndices); POSTCONDITION(d_atomRings.size() == d_bondRings.size(), "length mismatch"); return rdcast(d_atomRings.size()); } void RingInfo::initialize() { PRECONDITION(!df_init, "already initialized"); df_init = true; }; void RingInfo::reset() { if (!df_init) return; df_init = false; d_atomMembers.clear(); d_bondMembers.clear(); d_atomRings.clear(); d_bondRings.clear(); } void RingInfo::preallocate(unsigned int numAtoms, unsigned int numBonds) { d_atomMembers.resize(numAtoms); d_bondMembers.resize(numBonds); } }