diff --git a/isis/src/core/swig/isiscore.i b/isis/src/core/swig/isiscore.i new file mode 100644 index 0000000000000000000000000000000000000000..85143fe9bf1127eebf01cf42a82c1640464ba854 --- /dev/null +++ b/isis/src/core/swig/isiscore.i @@ -0,0 +1,163 @@ +%module isiscore + +%{ + #include <QString> + #include <array> + #include <vector> + #include <string> + #include <sstream> +%} + +%include "std_vector.i" +%include "std_string.i" +%include "std_array.i" +%include "std_map.i" +%include "carrays.i" +%include "std_pair.i" +%include "exception.i" + +#include <nlohmann/json.hpp> +#include <QVector> +#include <QString> + +%typemap(in) nlohmann::json { + if (PyDict_Check($input) || PyList_Check($input)) { + PyObject* module = PyImport_ImportModule("json"); + PyObject* jsonDumps = PyUnicode_FromString("dumps"); + PyObject* pythonJsonString = PyObject_CallMethodObjArgs(module, jsonDumps, $input, NULL); + $1 = nlohmann::json::parse(PyUnicode_AsUTF8(pythonJsonString)); + } + else { + PyErr_SetString(PyExc_TypeError, "not a json serializable type"); + SWIG_fail; + } +} + +%typemap(typecheck, precedence=SWIG_TYPECHECK_MAP) nlohmann::json { + $1 = PyDict_Check($input) ? 1 : 0; +} + +%typemap(out) nlohmann::json { + PyObject* module = PyImport_ImportModule("json"); + PyObject* jsonLoads = PyUnicode_FromString("loads"); + std::string jsonString = ($1).dump(); + PyObject* pythonJsonString = PyUnicode_DecodeUTF8(jsonString.c_str(), jsonString.size(), NULL); + $result = PyObject_CallMethodObjArgs(module, jsonLoads, pythonJsonString, NULL); +} + +%typemap(in) QVector<QString> & { + int i; + if (!PySequence_Check($input)) { + PyErr_SetString(PyExc_ValueError,"Expected a List"); + SWIG_fail; + } + + int size = PySequence_Length($input); + $1 = new QVector<QString>(size); + + for (i = 0; i < size; i++) { + PyObject *o = PySequence_GetItem($input,i); + if (PyUnicode_Check(o)) { + QString s = QString::fromUtf8(PyUnicode_AsUTF8(o)); + (*$1)[i] = s; + } else { + PyErr_SetString(PyExc_ValueError,"Sequence elements must be string"); + SWIG_fail; + } + } +} + + + +%typemap(out) QVector<QString> & { + $result = PyList_New($1_dim0); + for (i = 0; i < $1_dim0; i++) { + PyObject *o = PyString_AsString($1->at(i)); + PyList_SetItem($result,i,o); + } +} + + +%typemap(in) QString const & { + if (!PyUnicode_Check($input)) { + PyErr_SetString(PyExc_ValueError,"Expected a String"); + SWIG_fail; + } + $1 = new QString(QString::fromUtf8(PyUnicode_AsUTF8($input))); +} + + +%typemap(out) QString const & { + $result = Py_BuildValue("s#", $1.toStdString().c_str(), $1.size()); +} + + +%typemap(in) QString { + if (!PyUnicode_Check($input)) { + std::cout << "TANGERINE" << std::endl; + PyErr_SetString(PyExc_ValueError,"Expected a String"); + SWIG_fail; + } + $1 = QString::fromUtf8(PyUnicode_AsUTF8($input)); +} + +%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) QString { + $1 = !PyUnicode_Check($input); + std::cout << PyUnicode_AsUTF8($input) << std::endl; +} + +%typemap(out) QString = QString const &; + +%typemap(in) QVector<QString> { + int i; + if (!PySequence_Check($input)) { + PyErr_SetString(PyExc_ValueError,"Expected a List"); + SWIG_fail; + } + + int size = PySequence_Length($input); + $1 = new QVector<QString>(size); + + for (i = 0; i < size; i++) { + PyObject *o = PySequence_GetItem($input,i); + if (PyUnicode_Check(o)) { + QString s = QString::fromUtf8(PyUnicode_AsUTF8(o)); + (*$1)[i] = s; + } else { + PyErr_SetString(PyExc_ValueError,"Sequence elements must be string"); + SWIG_fail; + } + } +} + + +%typemap(out) QVector<QString> = QVector<QString> &; + +namespace std { + %template(IntVector) vector<int>; + %template(DoubleVector) vector<double>; + %template(VectorDoubleVector) vector< vector<double> >; + %template(StringVector) vector<string>; + %template(ConstCharVector) vector<const char*>; + %template(PairDoubleVector) vector<pair<double, double>>; + %template(DoubleArray6) array<double, 6>; +} + +%exception { + try { + $action + } catch (std::exception const& e) { + SWIG_exception(SWIG_RuntimeError, (std::string("std::exception: ") + e.what()).c_str()); + } catch (...) { + SWIG_exception(SWIG_UnknownError, "Unknown error"); + } +} + +%include "pvlKeyword.i" +%include "PvlContainer.h" +%include "pvlGroup.i" +%include "pvlObject.i" +%nodefaultdtor Isis::PvlObject; +// %include "UserInterface.i" +%include "isisblob.i" +%include "isispvl.i"