Coverage Report

Created: 2026-11-12 07:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/rdkit/Code/GraphMol/FileParsers/FileParserUtils.h
Line
Count
Source
1
//
2
//  Copyright (C) 2010-2025 Greg Landrum and other RDKit contributors
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_FILEPARSERUTILS_H
12
#define RD_FILEPARSERUTILS_H
13
14
#include <string>
15
#include <iostream>
16
#include <RDGeneral/BoostStartInclude.h>
17
#include <boost/lexical_cast.hpp>
18
#include <boost/algorithm/string.hpp>
19
#include <boost/format.hpp>
20
#include <RDGeneral/BoostEndInclude.h>
21
#include "FileParsers.h"
22
#include <string_view>
23
24
namespace RDKit {
25
class RWMol;
26
class Conformer;
27
28
namespace FileParserUtils {
29
RDKIT_FILEPARSERS_EXPORT inline std::string_view strip(
30
193k
    std::string_view orig, std::string stripChars = " \t\r\n") {
31
193k
  std::string_view res = orig;
32
193k
  auto start = res.find_first_not_of(stripChars);
33
193k
  if (start != std::string_view::npos) {
34
179k
    auto end = res.find_last_not_of(stripChars) + 1;
35
179k
    res = res.substr(start, end - start);
36
179k
  } else {
37
13.7k
    res = "";
38
13.7k
  }
39
193k
  return res;
40
193k
}
41
42
template <typename T>
43
131k
T stripSpacesAndCast(std::string_view input, bool acceptSpaces = false) {
44
131k
  auto trimmed = strip(input, " ");
45
131k
  if (acceptSpaces && trimmed.empty()) {
46
0
    return 0;
47
131k
  } else {
48
131k
    return boost::lexical_cast<T>(trimmed);
49
131k
  }
50
131k
}
unsigned int RDKit::FileParserUtils::stripSpacesAndCast<unsigned int>(std::__1::basic_string_view<char, std::__1::char_traits<char> >, bool)
Line
Count
Source
43
127k
T stripSpacesAndCast(std::string_view input, bool acceptSpaces = false) {
44
127k
  auto trimmed = strip(input, " ");
45
127k
  if (acceptSpaces && trimmed.empty()) {
46
0
    return 0;
47
127k
  } else {
48
127k
    return boost::lexical_cast<T>(trimmed);
49
127k
  }
50
127k
}
int RDKit::FileParserUtils::stripSpacesAndCast<int>(std::__1::basic_string_view<char, std::__1::char_traits<char> >, bool)
Line
Count
Source
43
4.06k
T stripSpacesAndCast(std::string_view input, bool acceptSpaces = false) {
44
4.06k
  auto trimmed = strip(input, " ");
45
4.06k
  if (acceptSpaces && trimmed.empty()) {
46
0
    return 0;
47
4.06k
  } else {
48
4.06k
    return boost::lexical_cast<T>(trimmed);
49
4.06k
  }
50
4.06k
}
51
template <typename T>
52
131k
T stripSpacesAndCast(const std::string &input, bool acceptSpaces = false) {
53
131k
  return stripSpacesAndCast<T>(std::string_view(input.c_str()), acceptSpaces);
54
131k
}
unsigned int RDKit::FileParserUtils::stripSpacesAndCast<unsigned int>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool)
Line
Count
Source
52
127k
T stripSpacesAndCast(const std::string &input, bool acceptSpaces = false) {
53
127k
  return stripSpacesAndCast<T>(std::string_view(input.c_str()), acceptSpaces);
54
127k
}
int RDKit::FileParserUtils::stripSpacesAndCast<int>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool)
Line
Count
Source
52
4.06k
T stripSpacesAndCast(const std::string &input, bool acceptSpaces = false) {
53
4.06k
  return stripSpacesAndCast<T>(std::string_view(input.c_str()), acceptSpaces);
54
4.06k
}
55
RDKIT_FILEPARSERS_EXPORT int toInt(const std::string &input,
56
                                   bool acceptSpaces = true);
57
RDKIT_FILEPARSERS_EXPORT unsigned int toUnsigned(const std::string &input,
58
                                                 bool acceptSpaces = true);
59
RDKIT_FILEPARSERS_EXPORT double toDouble(const std::string &input,
60
                                         bool acceptSpaces = true);
61
RDKIT_FILEPARSERS_EXPORT int toInt(const std::string_view input,
62
                                   bool acceptSpaces = true);
63
RDKIT_FILEPARSERS_EXPORT unsigned int toUnsigned(std::string_view input,
64
                                                 bool acceptSpaces = true);
65
RDKIT_FILEPARSERS_EXPORT double toDouble(const std::string_view input,
66
                                         bool acceptSpaces = true);
67
68
// gets a V3000 CTAB for a molecule
69
RDKIT_FILEPARSERS_EXPORT std::string getV3000CTAB(
70
    const ROMol &tmol, const boost::dynamic_bitset<> &wasAromatic,
71
    int confId = -1, unsigned int precision = 6);
72
//! \overload
73
inline std::string getV3000CTAB(const ROMol &tmol, int confId = -1,
74
0
                                unsigned int precision = 6) {
75
0
  boost::dynamic_bitset<> wasAromatic(tmol.getNumBonds());
76
0
  return getV3000CTAB(tmol, wasAromatic, confId, precision);
77
0
};
78
// reads a line from an MDL v3K CTAB
79
RDKIT_FILEPARSERS_EXPORT std::string getV3000Line(std::istream *inStream,
80
                                                  unsigned int &line);
81
82
// nAtoms and nBonds are ignored on input, set on output
83
RDKIT_FILEPARSERS_EXPORT bool ParseV3000CTAB(
84
    std::istream *inStream, unsigned int &line, RWMol *mol, Conformer *&conf,
85
    bool &chiralityPossible, unsigned int &nAtoms, unsigned int &nBonds,
86
    bool strictParsing = true, bool expectMEND = true,
87
    bool expectMacroAtoms = false);
88
89
// nAtoms and nBonds are used
90
RDKIT_FILEPARSERS_EXPORT bool ParseV2000CTAB(
91
    std::istream *inStream, unsigned int &line, RWMol *mol, Conformer *&conf,
92
    bool &chiralityPossible, unsigned int &nAtoms, unsigned int &nBonds,
93
    bool strictParsing = true);
94
95
//! finishes up the processing (sanitization, etc.) of a molecule read from
96
//! CTAB
97
RDKIT_FILEPARSERS_EXPORT void finishMolProcessing(
98
    RWMol *res, bool chiralityPossible,
99
    const v2::FileParsers::MolFileParserParams &ps);
100
//! \overload
101
inline void finishMolProcessing(RWMol *res, bool chiralityPossible,
102
0
                                bool sanitize, bool removeHs) {
103
0
  v2::FileParsers::MolFileParserParams ps;
104
0
  ps.sanitize = sanitize;
105
0
  ps.removeHs = removeHs;
106
0
  finishMolProcessing(res, chiralityPossible, ps);
107
0
}
108
109
//! Deprecated, please use QueryOps::replaceAtomWithQueryAtom instead
110
RDKIT_FILEPARSERS_EXPORT Atom *replaceAtomWithQueryAtom(RWMol *mol, Atom *atom);
111
112
//! applies a particular property to the atoms as an atom property list
113
template <typename T, typename U>
114
void applyMolListProp(ROMol &mol, const std::string &pn,
115
                      const std::string &prefix,
116
                      const std::string &missingValueMarker, size_t nItems,
117
0
                      U getter) {
118
0
  std::string itempn = pn.substr(prefix.size());
119
0
  std::string strVect = mol.getProp<std::string>(pn);
120
0
  std::vector<std::string> tokens;
121
0
  boost::split(tokens, strVect, boost::is_any_of(" \t\n"),
122
0
               boost::token_compress_on);
123
0
  std::string mv = missingValueMarker;
124
0
  size_t first_token = 0;
125
0
  if (tokens.size() == nItems + 1 && tokens[0].front() == '[' &&
126
0
      tokens[0].back() == ']') {
127
0
    mv = std::string(tokens[0].begin() + 1, tokens[0].end() - 1);
128
0
    first_token = 1;
129
0
  }
130
0
  if (mv.empty()) {
131
0
    BOOST_LOG(rdWarningLog) << "Missing value marker for property " << pn
132
0
                            << " is empty." << std::endl;
133
0
  }
134
0
  if(tokens.size() - first_token != nItems) {
135
0
    BOOST_LOG(rdWarningLog) << "Property list " << pn << " has incompatible size, "
136
0
                            << tokens.size() << " elements found; expecting "
137
0
                            << nItems << ". Ignoring it." << std::endl;
138
0
    return;
139
0
  }
140
0
  for (size_t i = first_token; i < tokens.size(); ++i) {
141
0
    if (tokens[i] != mv) {
142
0
      unsigned int itemid = i - first_token;
143
0
      try {
144
0
        T apv = boost::lexical_cast<T>(tokens[i]);
145
0
        getter(itemid)->setProp(itempn, apv);
146
0
      } catch (const boost::bad_lexical_cast &) {
147
0
        BOOST_LOG(rdWarningLog)
148
0
            << "Value " << tokens[i] << " for property " << pn << " of item "
149
0
            << itemid << " can not be parsed. Ignoring it." << std::endl;
150
0
      }
151
0
    }
152
0
  }
153
0
}
Unexecuted instantiation: void RDKit::FileParserUtils::applyMolListProp<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#1}>(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#1})
Unexecuted instantiation: void RDKit::FileParserUtils::applyMolListProp<int, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#1}>(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#1})
Unexecuted instantiation: void RDKit::FileParserUtils::applyMolListProp<double, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#1}>(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#1})
Unexecuted instantiation: void RDKit::FileParserUtils::applyMolListProp<bool, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#1}>(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#1})
Unexecuted instantiation: void RDKit::FileParserUtils::applyMolListProp<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#2}>(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#2})
Unexecuted instantiation: void RDKit::FileParserUtils::applyMolListProp<int, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#2}>(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#2})
Unexecuted instantiation: void RDKit::FileParserUtils::applyMolListProp<double, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#2}>(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#2})
Unexecuted instantiation: void RDKit::FileParserUtils::applyMolListProp<bool, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#2}>(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#2})
154
155
//! applies a particular property to the atoms as an atom property list
156
template <typename T>
157
[[deprecated("use applyMolListProp instead")]]
158
void applyMolListPropToAtoms(ROMol &mol, const std::string &pn,
159
                             const std::string &prefix,
160
                             const std::string &missingValueMarker = "n/a") {
161
  auto getter = [&mol](size_t which) { return mol.getAtomWithIdx(which); };
162
  applyMolListProp<T>(mol, pn, prefix, missingValueMarker, mol.getNumAtoms(),
163
                      getter);
164
}
165
166
template <typename T, typename U>
167
void applyMolListProps(ROMol &mol, const std::string &prefix, size_t nItems,
168
                       U getter, const std::string missingValueMarker = "n/a") {
169
  for (auto pn : mol.getPropList()) {
170
    if (pn.find(prefix) == 0 && pn.length() > prefix.length()) {
171
      applyMolListProp<T>(mol, pn, prefix, missingValueMarker, nItems, getter);
172
    }
173
  }
174
}
175
176
//! applies all properties matching a particular prefix as an atom property
177
//! list
178
template <typename T>
179
[[deprecated("use applyMolListProps instead")]]
180
void applyMolListPropsToAtoms(ROMol &mol, const std::string &prefix,
181
                              const std::string missingValueMarker = "n/a") {
182
  auto getter = [&mol](size_t which) { return mol.getAtomWithIdx(which); };
183
  auto nItems = mol.getNumAtoms();
184
  for (auto pn : mol.getPropList()) {
185
    if (pn.find(prefix) == 0 && pn.length() > prefix.length()) {
186
      applyMolListProp<T>(mol, pn, prefix, missingValueMarker, nItems, getter);
187
    }
188
  }
189
}
190
191
static constexpr std::string_view atomPropPrefixView = "atom.";
192
static constexpr size_t atomPropPrefixLength = atomPropPrefixView.length();
193
static const std::string atomPropPrefix = std::string(atomPropPrefixView);
194
static constexpr std::string_view bondPropPrefixView = "bond.";
195
static constexpr size_t bondPropPrefixLength = bondPropPrefixView.length();
196
static const std::string bondPropPrefix = std::string(bondPropPrefixView);
197
198
//! if the property name matches our rules for atom property lists, we'll
199
//! apply it to the atoms
200
inline void processMolPropertyList(
201
    ROMol &mol, const std::string &pn,
202
0
    const std::string &missingValueMarker = "n/a") {
203
0
  auto propSetter = [&](const std::string &propPrefix, auto getter,
204
0
                        size_t nItems) {
205
0
    std::string prefix = propPrefix + "prop.";
206
0
    if (pn.find(prefix) == 0 && pn.length() > prefix.length()) {
207
0
      applyMolListProp<std::string>(mol, pn, prefix, missingValueMarker, nItems,
208
0
                                    getter);
209
0
    } else {
210
0
      prefix = propPrefix + "iprop.";
211
0
      if (pn.find(prefix) == 0 && pn.length() > prefix.length()) {
212
0
        applyMolListProp<int>(mol, pn, prefix, missingValueMarker, nItems,
213
0
                              getter);
214
0
      } else {
215
0
        prefix = propPrefix + "dprop.";
216
0
        if (pn.find(prefix) == 0 && pn.length() > prefix.length()) {
217
0
          applyMolListProp<double>(mol, pn, prefix, missingValueMarker, nItems,
218
0
                                   getter);
219
0
        } else {
220
0
          prefix = propPrefix + "bprop.";
221
0
          if (pn.find(prefix) == 0 && pn.length() > prefix.length()) {
222
0
            applyMolListProp<bool>(mol, pn, prefix, missingValueMarker, nItems,
223
0
                                   getter);
224
0
          }
225
0
        }
226
0
      }
227
0
    }
228
0
  };
Unexecuted instantiation: auto RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, auto:1, unsigned long)#1}::operator()<RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#1}>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#1}, unsigned long) const
Unexecuted instantiation: auto RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, auto:1, unsigned long)#1}::operator()<RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#2}>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, RDKit::FileParserUtils::processMolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(unsigned long)#2}, unsigned long) const
229
0
230
0
  if (pn.find(atomPropPrefix) == 0 && pn.length() > atomPropPrefixLength) {
231
0
    propSetter(
232
0
        atomPropPrefix,
233
0
        [&mol](size_t which) { return mol.getAtomWithIdx(which); },
234
0
        mol.getNumAtoms());
235
0
  } else if (pn.find(bondPropPrefix) == 0 &&
236
0
             pn.length() > bondPropPrefixLength) {
237
0
    propSetter(
238
0
        bondPropPrefix,
239
0
        [&mol](size_t which) { return mol.getBondWithIdx(which); },
240
0
        mol.getNumBonds());
241
0
  }
242
0
}
243
//! loops over all properties and applies the ones that match the rules for
244
//! atom property lists to the atoms and bonds
245
inline void processMolPropertyLists(
246
0
    ROMol &mol, const std::string &missingValueMarker = "n/a") {
247
0
  for (const auto &pn : mol.getPropList()) {
248
0
    processMolPropertyList(mol, pn, missingValueMarker);
249
0
  }
250
0
}
251
252
static constexpr unsigned int DEFAULT_LINESIZE = 190;
253
254
template <typename T, typename U>
255
std::string getPropertyList(U getter, const std::string &propName,
256
                            std::string missingValueMarker = "",
257
0
                            unsigned int lineSize = DEFAULT_LINESIZE) {
258
0
  std::string res;
259
0
  std::string propVal;
260
0
  if (!missingValueMarker.empty()) {
261
0
    propVal += boost::str(boost::format("[%s] ") % missingValueMarker);
262
0
  } else {
263
0
    missingValueMarker = "n/a";
264
0
  }
265
0
  for (const auto item : getter()) {
266
0
    std::string apVal = missingValueMarker;
267
0
    T tVal;
268
0
    if (item->getPropIfPresent(propName, tVal)) {
269
0
      apVal = boost::lexical_cast<std::string>(tVal);
270
0
    }
271
0
    if (propVal.length() + apVal.length() + 1 >= lineSize) {
272
0
      // remove trailing space:
273
0
      propVal.pop_back();
274
0
      res += propVal + "\n";
275
0
      propVal = "";
276
0
    }
277
0
    propVal += apVal + " ";
278
0
  }
279
0
  if (!propVal.empty()) {
280
0
    // remove the trailing space:
281
0
    propVal.pop_back();
282
0
    res += propVal;
283
0
  }
284
0
  return res;
285
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > RDKit::FileParserUtils::getPropertyList<int, RDKit::FileParserUtils::createAtomIntPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::FileParserUtils::createAtomIntPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, unsigned int)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > RDKit::FileParserUtils::getPropertyList<double, RDKit::FileParserUtils::createAtomDoublePropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::FileParserUtils::createAtomDoublePropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, unsigned int)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > RDKit::FileParserUtils::getPropertyList<bool, RDKit::FileParserUtils::createAtomBoolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::FileParserUtils::createAtomBoolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, unsigned int)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > RDKit::FileParserUtils::getPropertyList<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, RDKit::FileParserUtils::createAtomStringPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::FileParserUtils::createAtomStringPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, unsigned int)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > RDKit::FileParserUtils::getPropertyList<int, RDKit::FileParserUtils::createBondIntPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::FileParserUtils::createBondIntPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, unsigned int)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > RDKit::FileParserUtils::getPropertyList<double, RDKit::FileParserUtils::createBondDoublePropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::FileParserUtils::createBondDoublePropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, unsigned int)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > RDKit::FileParserUtils::getPropertyList<bool, RDKit::FileParserUtils::createBondBoolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::FileParserUtils::createBondBoolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, unsigned int)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > RDKit::FileParserUtils::getPropertyList<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, RDKit::FileParserUtils::createBondStringPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::FileParserUtils::createBondStringPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, unsigned int)
286
287
template <typename T>
288
[[deprecated("use getPropertyList() instead")]]
289
std::string getAtomPropertyList(ROMol &mol, const std::string &atomPropName,
290
                                std::string missingValueMarker = "",
291
                                unsigned int lineSize = DEFAULT_LINESIZE) {
292
  return getPropertyList<T>([&mol]() { return mol.atoms(); }, atomPropName,
293
                            missingValueMarker, lineSize);
294
}
295
296
template <typename T, typename U>
297
void createPropertyList(ROMol &mol, U getter, const std::string &prefix,
298
                        const std::string &typeMarker,
299
                        const std::string &propName,
300
                        const std::string &missingValueMarker = "",
301
0
                        unsigned int lineSize = DEFAULT_LINESIZE) {
302
0
  std::string molPropName = prefix + "." + typeMarker + "." + propName;
303
0
  mol.setProp(molPropName, getPropertyList<T>(getter, propName,
304
0
                                              missingValueMarker, lineSize));
305
0
}
Unexecuted instantiation: void RDKit::FileParserUtils::createPropertyList<int, RDKit::FileParserUtils::createAtomIntPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::ROMol&, RDKit::FileParserUtils::createAtomIntPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)
Unexecuted instantiation: void RDKit::FileParserUtils::createPropertyList<double, RDKit::FileParserUtils::createAtomDoublePropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::ROMol&, RDKit::FileParserUtils::createAtomDoublePropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)
Unexecuted instantiation: void RDKit::FileParserUtils::createPropertyList<bool, RDKit::FileParserUtils::createAtomBoolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::ROMol&, RDKit::FileParserUtils::createAtomBoolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)
Unexecuted instantiation: void RDKit::FileParserUtils::createPropertyList<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, RDKit::FileParserUtils::createAtomStringPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::ROMol&, RDKit::FileParserUtils::createAtomStringPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)
Unexecuted instantiation: void RDKit::FileParserUtils::createPropertyList<int, RDKit::FileParserUtils::createBondIntPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::ROMol&, RDKit::FileParserUtils::createBondIntPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)
Unexecuted instantiation: void RDKit::FileParserUtils::createPropertyList<double, RDKit::FileParserUtils::createBondDoublePropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::ROMol&, RDKit::FileParserUtils::createBondDoublePropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)
Unexecuted instantiation: void RDKit::FileParserUtils::createPropertyList<bool, RDKit::FileParserUtils::createBondBoolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::ROMol&, RDKit::FileParserUtils::createBondBoolPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)
Unexecuted instantiation: void RDKit::FileParserUtils::createPropertyList<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, RDKit::FileParserUtils::createBondStringPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}>(RDKit::ROMol&, RDKit::FileParserUtils::createBondStringPropertyList(RDKit::ROMol&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)::{lambda()#1}, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)
306
307
inline void createAtomIntPropertyList(
308
    ROMol &mol, const std::string &atomPropName,
309
    const std::string &missingValueMarker = "",
310
0
    unsigned int lineSize = DEFAULT_LINESIZE) {
311
0
  createPropertyList<int>(
312
0
      mol, [&mol]() { return mol.atoms(); }, "atom", "iprop", atomPropName,
313
0
      missingValueMarker, lineSize);
314
0
}
315
inline void createAtomDoublePropertyList(
316
    ROMol &mol, const std::string &atomPropName,
317
    const std::string &missingValueMarker = "",
318
0
    unsigned int lineSize = DEFAULT_LINESIZE) {
319
0
  createPropertyList<double>(
320
0
      mol, [&mol]() { return mol.atoms(); }, "atom", "dprop", atomPropName,
321
0
      missingValueMarker, lineSize);
322
0
}
323
inline void createAtomBoolPropertyList(
324
    ROMol &mol, const std::string &atomPropName,
325
    const std::string &missingValueMarker = "",
326
0
    unsigned int lineSize = DEFAULT_LINESIZE) {
327
0
  createPropertyList<bool>(
328
0
      mol, [&mol]() { return mol.atoms(); }, "atom", "bprop", atomPropName,
329
0
      missingValueMarker, lineSize);
330
0
}
331
inline void createAtomStringPropertyList(
332
    ROMol &mol, const std::string &atomPropName,
333
    const std::string &missingValueMarker = "",
334
0
    unsigned int lineSize = DEFAULT_LINESIZE) {
335
0
  createPropertyList<std::string>(
336
0
      mol, [&mol]() { return mol.atoms(); }, "atom", "prop", atomPropName,
337
0
      missingValueMarker, lineSize);
338
0
}
339
340
inline void createBondIntPropertyList(
341
    ROMol &mol, const std::string &bondPropName,
342
    const std::string &missingValueMarker = "",
343
0
    unsigned int lineSize = DEFAULT_LINESIZE) {
344
0
  createPropertyList<int>(
345
0
      mol, [&mol]() { return mol.bonds(); }, "bond", "iprop", bondPropName,
346
0
      missingValueMarker, lineSize);
347
0
}
348
inline void createBondDoublePropertyList(
349
    ROMol &mol, const std::string &bondPropName,
350
    const std::string &missingValueMarker = "",
351
0
    unsigned int lineSize = DEFAULT_LINESIZE) {
352
0
  createPropertyList<double>(
353
0
      mol, [&mol]() { return mol.bonds(); }, "bond", "dprop", bondPropName,
354
0
      missingValueMarker, lineSize);
355
0
}
356
inline void createBondBoolPropertyList(
357
    ROMol &mol, const std::string &bondPropName,
358
    const std::string &missingValueMarker = "",
359
0
    unsigned int lineSize = DEFAULT_LINESIZE) {
360
0
  createPropertyList<bool>(
361
0
      mol, [&mol]() { return mol.bonds(); }, "bond", "bprop", bondPropName,
362
0
      missingValueMarker, lineSize);
363
0
}
364
inline void createBondStringPropertyList(
365
    ROMol &mol, const std::string &bondPropName,
366
    const std::string &missingValueMarker = "",
367
0
    unsigned int lineSize = DEFAULT_LINESIZE) {
368
0
  createPropertyList<std::string>(
369
0
      mol, [&mol]() { return mol.bonds(); }, "bond", "prop", bondPropName,
370
0
      missingValueMarker, lineSize);
371
0
}
372
373
RDKIT_FILEPARSERS_EXPORT void moveAdditionalPropertiesToSGroups(RWMol &mol);
374
375
}  // namespace FileParserUtils
376
}  // namespace RDKit
377
378
#endif