Program Listing for File PyImports.cpp¶
↰ Return to documentation for file (PyImports.cpp
)
// This file is part of necsim project which is released under MIT license.
// See file **LICENSE.txt** or visit https://opensource.org/licenses/MIT) for full license details
#include <cstring>
#ifndef WIN_INSTALL
#include <unistd.h>
#endif
#include <csignal>
#include "PyImports.h"
bool importPyListToVectorString(PyObject *list_input, vector<string> &output, const string &err_msg)
{
Py_ssize_t n = PyList_Size(list_input);
PyObject * item;
for(int i=0; i<n; i++)
{
item = PyList_GetItem(list_input, i);
#if PY_MAJOR_VERSION >= 3
if(!PyUnicode_Check(item))
#else
if(!PyString_Check(item))
#endif
{
PyErr_SetString(PyExc_TypeError, err_msg.c_str());
return false;
}
#if PY_MAJOR_VERSION >= 3
const char * tmpspec = PyUnicode_AsUTF8(item);
#else
char * tmpspec = PyString_AsString(item);
#endif
output.emplace_back(tmpspec);
}
return true;
}
bool importPyListToVectorULong(PyObject *list_input, vector<unsigned long> &output, const string &err_msg)
{
Py_ssize_t n = PyList_Size(list_input);
PyObject * item;
for(int i=0; i<n; i++)
{
item = PyList_GetItem(list_input, i);
if(!PyLong_Check(item)
#if PY_MAJOR_VERSION < 3
&& !PyInt_Check(item)
#endif // PY_MAJOR_VERSION < 3
)
{
PyErr_SetString(PyExc_TypeError, err_msg.c_str());
return false;
}
unsigned long tmpspec = PyLong_AsUnsignedLong(item);
output.emplace_back(tmpspec);
}
return true;
}
bool importPyListToVectorDouble(PyObject *list_input, vector<double> &output, const string &err_msg)
{
if(list_input == nullptr)
{
return true;
}
Py_ssize_t n = PyList_Size(list_input);
PyObject * item;
for(int i=0; i<n; i++)
{
item = PyList_GetItem(list_input, i);
if(!PyFloat_Check(item))
{
PyErr_SetString(PyExc_TypeError, err_msg.c_str());
return false;
}
double tmpspec = PyFloat_AS_DOUBLE(item);
output.push_back(tmpspec);
}
return true;
}
bool importPyListsToVectorCell(PyObject *x_list_input, PyObject *y_list_input, vector<Cell> &output, const string &err_msg)
{
if(x_list_input == nullptr && y_list_input == nullptr)
{
return true;
}
else if (x_list_input == nullptr || y_list_input == nullptr)
{
PyErr_SetString(PyExc_TypeError, err_msg.c_str());
return false;
}
Py_ssize_t n = PyList_Size(x_list_input);
if (n != PyList_Size(y_list_input))
{
PyErr_SetString(PyExc_TypeError, err_msg.c_str());
return false;
}
PyObject * x_item;
PyObject * y_item;
for(int i=0; i<n; i++)
{
x_item = PyList_GetItem(x_list_input, i);
y_item = PyList_GetItem(y_list_input, i);
if(!PyLong_Check(x_item)
#if PY_MAJOR_VERSION < 3
&& !PyInt_Check(x_item)
#endif // PY_MAJOR_VERSION < 3
)
{
PyErr_SetString(PyExc_TypeError, err_msg.c_str());
return false;
}
if(!PyLong_Check(y_item)
#if PY_MAJOR_VERSION < 3
&& !PyInt_Check(y_item)
#endif // PY_MAJOR_VERSION < 3
)
{
PyErr_SetString(PyExc_TypeError, err_msg.c_str());
return false;
}
long x = PyLong_AsLong(x_item);
long y = PyLong_AsLong(y_item);
output.push_back((Cell){.x = x, .y = y});
}
return true;
}