34 #ifndef CARTESIANPRODUCT_H
35 #define CARTESIANPRODUCT_H
72 size_t m_numPermutationsProcessed{};
81 m_numPermutationsProcessed = 0;
84 const char *
type()
const override {
return "CartesianProductStrategy"; }
88 if (m_numPermutationsProcessed) {
91 ++m_numPermutationsProcessed;
97 return m_numPermutationsProcessed;
100 operator bool()
const override {
return hasNext(); }
109 ++m_numPermutationsProcessed;
112 bool hasNext()
const {
115 m_numPermutationsProcessed < rdcast<size_t>(m_numPermutations)) {
122 void next(
size_t rowToIncrement) {
123 if (!hasNext())
return;
124 m_permutation[rowToIncrement] += 1;
125 size_t max_index_of_row = m_permutationSizes[rowToIncrement] - 1;
126 if (m_permutation[rowToIncrement] > max_index_of_row) {
127 m_permutation[rowToIncrement] = 0;
128 next(rowToIncrement + 1);
133 #ifdef RDK_USE_BOOST_SERIALIZATION
134 friend class boost::serialization::access;
135 template <
class Archive>
136 void serialize(Archive &ar,
const unsigned int ) {
137 ar &boost::serialization::base_object<EnumerationStrategyBase>(*
this);
138 ar &m_numPermutationsProcessed;
144 #ifdef RDK_USE_BOOST_SERIALIZATION
boost::uint64_t getPermutationIdx() const override
Returns how many permutations have been processed by this strategy.
EnumerationStrategyBase * copy() const override
copy the enumeration strategy complete with current state
const EnumerationTypes::RGROUPS & next() override
The current permutation {r1, r2, ...}.
const char * type() const override
void initializeStrategy(const ChemicalReaction &, const EnumerationTypes::BBS &) override
CartesianProductStrategy()
This is a class for storing and applying general chemical reactions.
static const boost::uint64_t EnumerationOverflow
void initialize(const ChemicalReaction &reaction, const EnumerationTypes::BBS &building_blocks)
#define RDKIT_CHEMREACTIONS_EXPORT
std::vector< boost::uint64_t > RGROUPS
std::vector< MOL_SPTR_VECT > BBS