Loading...
Searching...
No Matches
QueryBond.h
Go to the documentation of this file.
//
// Copyright (C) 2001-2022 Greg Landrum and other RDKit contributors
//
// @@ 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 <RDGeneral/export.h>
#ifndef _RD_QUERYBOND_H
#define _RD_QUERYBOND_H
#include <Query/QueryObjects.h>
#include "Bond.h"
#include "QueryOps.h"
namespace RDKit {
//! Class for storing Bond queries
/*!
QueryBond objects are derived from Bond objects, so they can be
added to molecules and the like, but they have much fancier
querying capabilities.
*/
class RDKIT_GRAPHMOL_EXPORT QueryBond : public Bond {
public:
typedef Queries::Query<int, Bond const *, true> QUERYBOND_QUERY;
QueryBond() : Bond() {}
//! initialize with a particular bond order
explicit QueryBond(BondType bT);
//! initialize from a bond
explicit QueryBond(const Bond &other)
: Bond(other), dp_query(makeBondOrderEqualsQuery(other.getBondType())) {}
QueryBond(const QueryBond &other) : Bond(other) {
if (other.dp_query) {
dp_query = other.dp_query->copy();
} else {
dp_query = nullptr;
}
}
QueryBond(QueryBond &&other) noexcept : Bond(std::move(other)) {
dp_query = std::move(other.dp_query);
}
QueryBond &operator=(QueryBond &&other) noexcept {
if (this == &other) {
return *this;
}
QueryBond::operator=(std::move(other));
dp_query = std::move(other.dp_query);
return *this;
}
~QueryBond() override;
//! returns a copy of this query, owned by the caller
Bond *copy() const override;
QueryBond &operator=(const QueryBond &other);
//! sets the BondType of this query:
void setBondType(BondType bT);
//! sets the BondDir of this query:
void setBondDir(BondDir bD);
//! returns true if we match Bond \c what
bool Match(Bond const *what) const override;
//! returns true if our query details match those of QueryBond \c what
bool QueryMatch(QueryBond const *what) const;
// This method can be used to distinguish query bonds from standard bonds
bool hasQuery() const override { return dp_query != nullptr; }
//! returns our current query
QUERYBOND_QUERY *getQuery() const override { return dp_query; }
//! replaces our current query with the value passed in
void setQuery(QUERYBOND_QUERY *what) override {
// free up any existing query (Issue255):
delete dp_query;
dp_query = what;
}
//! expands our current query
/*!
\param what the Queries::Query to be added. The ownership of
the query is passed to the current object, where it
might be deleted, so that the pointer should not be
used again in the calling code.
\param how the operator to be used in the expansion
\param maintainOrder (optional) flags whether the relative order of
the queries needs to be maintained, if this is
false, the order is reversed
<b>Notes:</b>
- \c what should probably be constructed using one of the functions
defined in QueryOps.h
- the \c maintainOrder option can be useful because the combination
operators short circuit when possible.
*/
void expandQuery(QUERYBOND_QUERY *what,
Queries::CompositeQueryType how = Queries::COMPOSITE_AND,
bool maintainOrder = true) override;
//! returns our contribution to the explicit valence of an Atom
/*!
<b>Notes:</b>
- requires an owning molecule
*/
double getValenceContrib(const Atom *at) const override;
protected:
QUERYBOND_QUERY *dp_query{nullptr};
};
namespace detail {
inline std::string qhelper(const Bond::QUERYBOND_QUERY *q, unsigned int depth) {
std::string res;
if (q) {
for (unsigned int i = 0; i < depth; ++i) {
res += " ";
}
res += q->getFullDescription() + "\n";
for (const auto &child :
boost::make_iterator_range(q->beginChildren(), q->endChildren())) {
res += qhelper(child.get(), depth + 1);
}
}
return res;
}
} // namespace detail
inline std::string describeQuery(const Bond *bond) {
PRECONDITION(bond, "bad bond");
std::string res = "";
if (bond->hasQuery()) {
res = detail::qhelper(bond->getQuery(), 0);
}
return res;
}
}; // namespace RDKit
#endif
Bond.h
PRECONDITION
#define PRECONDITION(expr, mess)
Definition Invariant.h:108
QueryObjects.h
Pulls in all the query types.
QueryOps.h
Queries::Query
Base class for all queries.
Definition Query.h:48
Queries::Query::getFullDescription
virtual std::string getFullDescription() const
returns a fuller text description
Definition Query.h:75
Queries::Query::endChildren
CHILD_VECT_CI endChildren() const
returns an iterator for the end of our child vector
Definition Query.h:112
Queries::Query::beginChildren
CHILD_VECT_CI beginChildren() const
returns an iterator for the beginning of our child vector
Definition Query.h:110
RDKit::Atom
The class for representing atoms.
Definition Atom.h:74
RDKit::Bond
class for representing a bond
Definition Bond.h:46
RDKit::Bond::BondType
BondType
the type of Bond
Definition Bond.h:55
RDKit::Bond::getQuery
virtual QUERYBOND_QUERY * getQuery() const
NOT CALLABLE.
RDKit::Bond::hasQuery
virtual bool hasQuery() const
Definition Bond.h:286
RDKit::Bond::QUERYBOND_QUERY
Queries::Query< int, Bond const *, true > QUERYBOND_QUERY
Definition Bond.h:52
RDKit::Bond::getBondType
BondType getBondType() const
returns our bondType
Definition Bond.h:159
RDKit::Bond::Bond
Bond()
RDKit::Bond::BondDir
BondDir
the bond's direction (for chirality)
Definition Bond.h:82
RDKit::QueryBond::setBondDir
void setBondDir(BondDir bD)
sets the BondDir of this query:
RDKit::QueryBond::setBondType
void setBondType(BondType bT)
sets the BondType of this query:
RDKit::QueryBond::QueryBond
QueryBond()
Definition QueryBond.h:32
RDKit::QueryBond::QueryBond
QueryBond(BondType bT)
initialize with a particular bond order
RDKit::QueryBond::hasQuery
bool hasQuery() const override
Definition QueryBond.h:76
RDKit::QueryBond::expandQuery
void expandQuery(QUERYBOND_QUERY *what, Queries::CompositeQueryType how=Queries::COMPOSITE_AND, bool maintainOrder=true) override
expands our current query
RDKit::QueryBond::getQuery
QUERYBOND_QUERY * getQuery() const override
returns our current query
Definition QueryBond.h:79
RDKit::QueryBond::QueryBond
QueryBond(const Bond &other)
initialize from a bond
Definition QueryBond.h:36
RDKit::QueryBond::setQuery
void setQuery(QUERYBOND_QUERY *what) override
replaces our current query with the value passed in
Definition QueryBond.h:81
RDKit::QueryBond::copy
Bond * copy() const override
returns a copy of this query, owned by the caller
RDKit::QueryBond::QUERYBOND_QUERY
Queries::Query< int, Bond const *, true > QUERYBOND_QUERY
Definition QueryBond.h:30
RDKit::QueryBond::getValenceContrib
double getValenceContrib(const Atom *at) const override
returns our contribution to the explicit valence of an Atom
RDKit::QueryBond::QueryBond
QueryBond(const QueryBond &other)
Definition QueryBond.h:38
RDKit::QueryBond::~QueryBond
~QueryBond() override
RDKit::QueryBond::QueryBond
QueryBond(QueryBond &&other) noexcept
Definition QueryBond.h:45
RDKit::QueryBond::QueryMatch
bool QueryMatch(QueryBond const *what) const
returns true if our query details match those of QueryBond what
RDKit::QueryBond::dp_query
QUERYBOND_QUERY * dp_query
Definition QueryBond.h:117
RDKit::QueryBond::Match
bool Match(Bond const *what) const override
returns true if we match Bond what
RDKit::QueryBond::operator=
QueryBond & operator=(const QueryBond &other)
RDKit::QueryBond::operator=
QueryBond & operator=(QueryBond &&other) noexcept
Definition QueryBond.h:48
export.h
RDKIT_GRAPHMOL_EXPORT
#define RDKIT_GRAPHMOL_EXPORT
Definition export.h:257
Queries::CompositeQueryType
CompositeQueryType
Definition QueryObjects.h:36
Queries::COMPOSITE_AND
@ COMPOSITE_AND
Definition QueryObjects.h:36
RDKit::detail::qhelper
std::string qhelper(const Atom::QUERYATOM_QUERY *q, unsigned int depth)
Definition QueryAtom.h:135
RDKit
Std stuff.
Definition Abbreviations.h:19
RDKit::makeBondOrderEqualsQuery
RDKIT_GRAPHMOL_EXPORT BOND_EQUALS_QUERY * makeBondOrderEqualsQuery(Bond::BondType what)
returns a Query for matching bond orders
RDKit::describeQuery
std::string describeQuery(const Atom *atom)
Definition QueryAtom.h:150