While many predefined functors exist it is not difficult to find a situation which calls for a new functor. Acquiring a complete understanding of functors can be daunting, but generating a functor to pass to OEChem functions is less difficult.
The following example shows a user defined functor which screens for atoms whose atomic mass is greater than 15.
#include "oechem.h"
#include "oesystem.h"
#include <iostream>
using namespace OESystem;
using namespace OEChem;
using namespace std;
class WeightGT15 : public OEUnaryPredicate<OEAtomBase>
{
public:
bool operator()(const OEAtomBase &atom) const
{
return OEGetAverageWeight(atom.GetAtomicNum()) > 15;
}
OEUnaryFunction<OEAtomBase,bool> *CreateCopy() const
{
return new WeightGT15;
}
protected:
bool Eval(const OEAtomBase &atom) const { return operator()(atom); }
bool Eval(const OEAtomBase &) { return false; }
};
int main()
{
OEGraphMol mol;
OEParseSmiles(mol, "c1c(O)c(O)c(Cl)cc1CCCBr");
OEIter<OEAtomBase> atom;
for(atom = mol.GetAtoms(WeightGT15());atom;++atom)
cout << atom->GetName() << " has weight > 15." << endl;
return 0;
}