File: Wrap.cpp

package info (click to toggle)
rdkit 202503.1-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 220,160 kB
  • sloc: cpp: 399,240; python: 77,453; ansic: 25,517; java: 8,173; javascript: 4,005; sql: 2,389; yacc: 1,565; lex: 1,263; cs: 1,081; makefile: 580; xml: 229; fortran: 183; sh: 105
file content (141 lines) | stat: -rw-r--r-- 4,038 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// $Id$
//
// Copyright (c) 2003-2006 greg Landrum and Rational Discovery LLC
//
//   @@ 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.
//

//
// Generic Wrapper utility functionality
//
#include "Wrap.h"
#include "pyint_api.h"
#include <RDBoost/PySequenceHolder.h>
#include <sstream>
#include <iostream>

// A helper function for dealing with errors. Throw a Python IndexError
void throw_index_error(int key) {
  PyErr_SetObject(PyExc_IndexError, PyInt_FromLong(key));
  python::throw_error_already_set();
}

// A helper function for dealing with errors. Throw a Python ValueError
void throw_value_error(const std::string err) {
  PyErr_SetString(PyExc_ValueError, err.c_str());
  python::throw_error_already_set();
}

// A helper function for dealing with errors. Throw a Python KeyError
void throw_key_error(const std::string key) {
  PyErr_SetString(PyExc_KeyError, key.c_str());
  python::throw_error_already_set();
}

void translate_index_error(IndexErrorException const &e) {
  throw_index_error(e.index());
}

void translate_value_error(ValueErrorException const &e) {
  throw_value_error(e.what());
}

void translate_key_error(KeyErrorException const &e) {
  throw_key_error(e.key());
}

#ifdef INVARIANT_EXCEPTION_METHOD
// A helper function for dealing with errors. Throw a Python RuntimeError
void throw_runtime_error(const std::string err) {
  PyErr_SetString(PyExc_RuntimeError, err.c_str());
  python::throw_error_already_set();
}

void translate_invariant_error(Invar::Invariant const &e) {
  throw_runtime_error(e.toUserString());
}

boost::dynamic_bitset<> pythonObjectToDynBitset(
    const python::object &obj, boost::dynamic_bitset<>::size_type maxV) {
  boost::dynamic_bitset<> res(maxV);
  if (obj) {
    python::stl_input_iterator<boost::dynamic_bitset<>::size_type> beg(obj),
        end;
    while (beg != end) {
      auto v = *beg;
      if (v >= maxV) {
        throw_value_error("list element larger than allowed value");
      }
      res.set(v);
      ++beg;
    }
  }
  return res;
}

std::vector<std::pair<int, int>> *translateAtomMap(
    const python::object &atomMap) {
  PySequenceHolder<python::object> pyAtomMap(atomMap);
  std::vector<std::pair<int, int>> *res;
  res = nullptr;
  unsigned int i;
  unsigned int n = pyAtomMap.size();
  if (n > 0) {
    res = new std::vector<std::pair<int, int>>;
    for (i = 0; i < n; ++i) {
      PySequenceHolder<int> item(pyAtomMap[i]);
      if (item.size() != 2) {
        delete res;
        res = nullptr;
        throw_value_error("Incorrect format for an atomMap");
      }
      res->push_back(std::pair<int, int>(item[0], item[1]));
    }
  }
  return res;
}

std::vector<std::vector<std::pair<int, int>>> translateAtomMapSeq(
    const python::object &atomMapSeq) {
  std::vector<std::vector<std::pair<int, int>>> aMapVec;
  PySequenceHolder<python::object> pyAtomMapSeq(atomMapSeq);
  for (size_t i = 0; i < pyAtomMapSeq.size(); ++i) {
    std::vector<std::pair<int, int>> *res = translateAtomMap(pyAtomMapSeq[i]);
    aMapVec.push_back(*res);
    delete res;
  }
  return aMapVec;
}

RDNumeric::DoubleVector *translateDoubleSeq(const python::object &doubleSeq) {
  PySequenceHolder<double> doubles(doubleSeq);
  unsigned int nDoubles = doubles.size();
  RDNumeric::DoubleVector *doubleVec;
  doubleVec = nullptr;
  unsigned int i;
  if (nDoubles > 0) {
    doubleVec = new RDNumeric::DoubleVector(nDoubles);
    for (i = 0; i < nDoubles; ++i) {
      doubleVec->setVal(i, doubles[i]);
    }
  }
  return doubleVec;
}

std::vector<unsigned int> *translateIntSeq(const python::object &intSeq) {
  PySequenceHolder<unsigned int> ints(intSeq);
  std::vector<unsigned int> *intVec = nullptr;
  if (ints.size() > 0) {
    intVec = new std::vector<unsigned int>;
    for (unsigned int i = 0; i < ints.size(); ++i) {
      intVec->push_back(ints[i]);
    }
  }
  return intVec;
}

#endif