RDKit
Open-source cheminformatics and machine learning.
Loading...
Searching...
No Matches
SetQuery.h
Go to the documentation of this file.
1//
2// Copyright (c) 2003-2020 Greg Landrum and Rational Discovery LLC
3//
4// @@ All Rights Reserved @@
5// This file is part of the RDKit.
6// The contents are covered by the terms of the BSD license
7// which is included in the file license.txt, found at the root
8// of the RDKit source tree.
9//
10#include <RDGeneral/export.h>
11#ifndef RD_SETQUERY_H
12#define RD_SETQUERY_H
13#include <set>
14#include "Query.h"
15#include <sstream>
16#include <algorithm>
17#include <iterator>
18
19namespace Queries {
20//! \brief a Query implementing a set: arguments must
21//! one of a set of values
22//!
23template <class MatchFuncArgType, class DataFuncArgType = MatchFuncArgType,
24 bool needsConversion = false>
26 : public Query<MatchFuncArgType, DataFuncArgType, needsConversion> {
27 public:
28 typedef std::set<MatchFuncArgType> CONTAINER_TYPE;
29
30 SetQuery() : Query<MatchFuncArgType, DataFuncArgType, needsConversion>() {}
31
32 //! insert an entry into our \c set
33 void insert(const MatchFuncArgType what) {
34 if (d_set.find(what) == this->d_set.end()) {
35 this->d_set.insert(what);
36 }
37 }
38
39 //! clears our \c set
40 void clear() { this->d_set.clear(); }
41
42 bool Match(const DataFuncArgType what) const override {
43 MatchFuncArgType mfArg =
44 this->TypeConvert(what, Int2Type<needsConversion>());
45 return (this->d_set.find(mfArg) != this->d_set.end()) ^ this->getNegation();
46 }
47
49 const override {
52 res->setDataFunc(this->d_dataFunc);
53 typename std::set<MatchFuncArgType>::const_iterator i;
54 for (i = this->d_set.begin(); i != this->d_set.end(); ++i) {
55 res->insert(*i);
56 }
57 res->setNegation(this->getNegation());
58 res->d_description = this->d_description;
59 res->d_queryType = this->d_queryType;
60 return res;
61 }
62
63 typename CONTAINER_TYPE::const_iterator beginSet() const {
64 return d_set.begin();
65 }
66 typename CONTAINER_TYPE::const_iterator endSet() const { return d_set.end(); }
67 unsigned int size() const { return rdcast<unsigned int>(d_set.size()); }
68
69 std::string getFullDescription() const override {
70 std::ostringstream res;
71 res << this->getDescription() << " val";
72 if (this->getNegation()) {
73 res << " not in ";
74 } else {
75 res << " in (";
76 }
77 std::copy(d_set.begin(), d_set.end(),
78 std::ostream_iterator<MatchFuncArgType>(res, ", "));
79 res << ")";
80 return res.str();
81 }
82
83 protected:
85};
86} // namespace Queries
87#endif
class to allow integer values to pick templates
Definition Query.h:26
Base class for all queries.
Definition Query.h:45
std::string d_queryType
Definition Query.h:153
void setDataFunc(MatchFuncArgType(*what)(DataFuncArgType))
sets our data function
Definition Query.h:94
void setNegation(bool what)
sets whether or not we are negated
Definition Query.h:59
std::string d_description
Definition Query.h:152
a Query implementing a set: arguments must one of a set of values
Definition SetQuery.h:26
CONTAINER_TYPE::const_iterator beginSet() const
Definition SetQuery.h:63
Query< MatchFuncArgType, DataFuncArgType, needsConversion > * copy() const override
returns a copy of this Query
Definition SetQuery.h:48
void clear()
clears our set
Definition SetQuery.h:40
std::set< MatchFuncArgType > CONTAINER_TYPE
Definition SetQuery.h:28
void insert(const MatchFuncArgType what)
insert an entry into our set
Definition SetQuery.h:33
unsigned int size() const
Definition SetQuery.h:67
CONTAINER_TYPE d_set
Definition SetQuery.h:84
bool Match(const DataFuncArgType what) const override
returns whether or not we match the argument
Definition SetQuery.h:42
CONTAINER_TYPE::const_iterator endSet() const
Definition SetQuery.h:66
std::string getFullDescription() const override
returns a fuller text description
Definition SetQuery.h:69
#define RDKIT_QUERY_EXPORT
Definition export.h:629