20 #ifndef PYTHONCPPTYPESCONVERTERS_H
21 #define PYTHONCPPTYPESCONVERTERS_H
23 #include <tulip/Coord.h>
24 #include <tulip/Color.h>
25 #include <tulip/ColorScale.h>
26 #include <tulip/StringCollection.h>
27 #include <tulip/Size.h>
28 #include <tulip/Node.h>
29 #include <tulip/Edge.h>
30 #include <tulip/BooleanProperty.h>
31 #include <tulip/ColorProperty.h>
32 #include <tulip/DoubleProperty.h>
33 #include <tulip/IntegerProperty.h>
34 #include <tulip/LayoutProperty.h>
35 #include <tulip/SizeProperty.h>
36 #include <tulip/StringProperty.h>
40 static std::string demangleClassName(
const char* className) {
41 static char demangleBuffer[256];
44 abi::__cxa_demangle((
char *) className, (
char *) demangleBuffer,
46 return std::string(demangleBuffer);
48 #elif defined(_MSC_VER)
49 static std::string demangleClassName(
const char* className) {
50 std::string s(className);
52 if (s.find(
"class ") == 0) {
53 return std::string(className + 6);
61 TLP_PYTHON_SCOPE
void *convertSipWrapperToCppType(PyObject *sipWrapper,
const std::string &cppTypename,
const bool transferTo=
false);
62 TLP_PYTHON_SCOPE PyObject *convertCppTypeToSipWrapper(
void *cppObj,
const std::string &cppTypename,
bool fromNew=
false);
64 TLP_PYTHON_SCOPE
bool convertPyObjectToBool(PyObject *pyObject,
bool &cppObject);
65 TLP_PYTHON_SCOPE PyObject *convertBoolToPyObject(
bool cppObject);
67 TLP_PYTHON_SCOPE
bool convertPyObjectToDouble(PyObject *pyObject,
double &cppObject);
68 TLP_PYTHON_SCOPE PyObject *convertDoubleToPyObject(
double cppObject);
70 TLP_PYTHON_SCOPE
bool convertPyObjectToLong(PyObject *pyObject,
long &cppObject);
71 TLP_PYTHON_SCOPE PyObject *convertLongToPyObject(
long cppObject);
73 TLP_PYTHON_SCOPE
bool convertPyObjectToUnsignedLong(PyObject *pyObject,
unsigned long &cppObject);
74 TLP_PYTHON_SCOPE PyObject *convertUnsignedLongToPyObject(
unsigned long cppObject);
76 class TLP_PYTHON_SCOPE ValueSetter {
81 dataSet(dataSet), graph(NULL), key(key) {}
83 ValueSetter(
tlp::Graph *graph, std::string key) :
84 dataSet(NULL), graph(graph), key(key) {}
87 void setValue(
const T &value) {
89 dataSet->set(key, value);
103 TLP_PYTHON_SCOPE PyObject *getPyObjectFromDataType(
const tlp::DataType *dataType,
bool noCopy=
false);
105 TLP_PYTHON_SCOPE
bool setCppValueFromPyObject(PyObject *pyObj, ValueSetter &valSetter,
tlp::DataType *dataType=NULL);
107 template <
typename T>
108 class PyObjectToCppObjectConvertor {
112 bool convert(PyObject *pyObject, T &cppObject) {
113 std::string className = demangleClassName(
typeid(T).name());
115 void *cppObjPointer = convertSipWrapperToCppType(pyObject, className);
118 cppObject = *
reinterpret_cast<T*
>(cppObjPointer);
127 template <
typename T>
128 class PyObjectToCppObjectConvertor<T*> {
132 bool convert(PyObject *pyObject, T *&cppObject) {
133 std::string className = demangleClassName(
typeid(T).name());
135 void *cppObjPointer = convertSipWrapperToCppType(pyObject, className,
true);
138 cppObject =
reinterpret_cast<T*
>(cppObjPointer);
147 class PyObjectToCppObjectConvertor<bool> {
149 bool convert(PyObject *pyObject,
bool &cppObject) {
150 return convertPyObjectToBool(pyObject, cppObject);
155 class PyObjectToCppObjectConvertor<double> {
157 bool convert(PyObject *pyObject,
double &cppObject) {
158 return convertPyObjectToDouble(pyObject, cppObject);
163 class PyObjectToCppObjectConvertor<float> {
165 bool convert(PyObject *pyObject,
float &cppObject) {
167 PyObjectToCppObjectConvertor<double> convertor;
168 bool ok = convertor.convert(pyObject, val);
175 class PyObjectToCppObjectConvertor<long> {
178 bool convert(PyObject *pyObject,
long &cppObject) {
179 return convertPyObjectToLong(pyObject, cppObject);
184 class PyObjectToCppObjectConvertor<int> {
186 bool convert(PyObject *pyObject,
int &cppObject) {
188 PyObjectToCppObjectConvertor<long> convertor;
189 bool ok = convertor.convert(pyObject, val);
196 class PyObjectToCppObjectConvertor<unsigned long> {
198 bool convert(PyObject *pyObject,
unsigned long &cppObject) {
199 return convertPyObjectToUnsignedLong(pyObject, cppObject);
204 class PyObjectToCppObjectConvertor<unsigned int> {
206 bool convert(PyObject *pyObject,
unsigned int &cppObject) {
208 PyObjectToCppObjectConvertor<unsigned long> convertor;
209 bool ok = convertor.convert(pyObject, val);
215 template <
typename T>
216 class CppObjectToPyObjectConvertor {
220 bool convert(
const T &cppObject, PyObject *&pyObject) {
221 std::string className = demangleClassName(
typeid(T).name());
223 T *objCopy =
new T(cppObject);
224 PyObject *pyObj = convertCppTypeToSipWrapper(objCopy, className,
true);
238 template <
typename T>
239 class CppObjectToPyObjectConvertor<T*> {
243 bool convert(T *cppObject, PyObject *&pyObject) {
244 std::string className = demangleClassName(
typeid(T).name());
246 PyObject *pyObj = convertCppTypeToSipWrapper(cppObject, className);
259 class CppObjectToPyObjectConvertor<bool> {
261 bool convert(
const bool &cppObject, PyObject *&pyObject) {
262 pyObject = convertBoolToPyObject(cppObject);
268 class CppObjectToPyObjectConvertor<long> {
270 bool convert(
const long &cppObject, PyObject *&pyObject) {
271 pyObject = convertLongToPyObject(cppObject);
277 class CppObjectToPyObjectConvertor<int> {
279 bool convert(
const int &cppObject, PyObject *&pyObject) {
280 pyObject = convertLongToPyObject(cppObject);
286 class CppObjectToPyObjectConvertor<unsigned int> {
288 bool convert(
const unsigned int &cppObject, PyObject *&pyObject) {
289 pyObject = convertUnsignedLongToPyObject(cppObject);
295 class CppObjectToPyObjectConvertor<unsigned long> {
297 bool convert(
const unsigned long &cppObject, PyObject *&pyObject) {
298 pyObject = convertUnsignedLongToPyObject(cppObject);
304 class CppObjectToPyObjectConvertor<double> {
306 bool convert(
const double &cppObject, PyObject *&pyObject) {
307 pyObject = convertDoubleToPyObject(cppObject);
313 class CppObjectToPyObjectConvertor<float> {
315 bool convert(
const float &cppObject, PyObject *&pyObject) {
316 pyObject = convertDoubleToPyObject(cppObject);
323 #endif // PYTHONCPPTYPESCONVERTERS_H