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>
37 #include <tulip/TlpTools.h>
39 TLP_PYTHON_SCOPE
void *convertSipWrapperToCppType(PyObject *sipWrapper,
const std::string &cppTypename,
const bool transferTo=
false);
40 TLP_PYTHON_SCOPE PyObject *convertCppTypeToSipWrapper(
void *cppObj,
const std::string &cppTypename,
bool fromNew=
false);
42 TLP_PYTHON_SCOPE
bool convertPyObjectToBool(PyObject *pyObject,
bool &cppObject);
43 TLP_PYTHON_SCOPE PyObject *convertBoolToPyObject(
bool cppObject);
45 TLP_PYTHON_SCOPE
bool convertPyObjectToDouble(PyObject *pyObject,
double &cppObject);
46 TLP_PYTHON_SCOPE PyObject *convertDoubleToPyObject(
double cppObject);
48 TLP_PYTHON_SCOPE
bool convertPyObjectToLong(PyObject *pyObject,
long &cppObject);
49 TLP_PYTHON_SCOPE PyObject *convertLongToPyObject(
long cppObject);
51 TLP_PYTHON_SCOPE
bool convertPyObjectToUnsignedLong(PyObject *pyObject,
unsigned long &cppObject);
52 TLP_PYTHON_SCOPE PyObject *convertUnsignedLongToPyObject(
unsigned long cppObject);
54 class TLP_PYTHON_SCOPE ValueSetter {
59 dataSet(dataSet), graph(NULL), key(key) {}
61 ValueSetter(
tlp::Graph *graph, std::string key) :
62 dataSet(NULL), graph(graph), key(key) {}
65 void setValue(
const T &value) {
67 dataSet->set(key, value);
81 TLP_PYTHON_SCOPE PyObject *getPyObjectFromDataType(
const tlp::DataType *dataType,
bool noCopy=
false);
83 TLP_PYTHON_SCOPE
bool setCppValueFromPyObject(PyObject *pyObj, ValueSetter &valSetter,
tlp::DataType *dataType=NULL);
86 class PyObjectToCppObjectConvertor {
90 bool convert(PyObject *pyObject, T &cppObject) {
93 void *cppObjPointer = convertSipWrapperToCppType(pyObject, className);
96 cppObject = *
reinterpret_cast<T*
>(cppObjPointer);
105 template <
typename T>
106 class PyObjectToCppObjectConvertor<T*> {
110 bool convert(PyObject *pyObject, T *&cppObject) {
113 void *cppObjPointer = convertSipWrapperToCppType(pyObject, className,
true);
116 cppObject =
reinterpret_cast<T*
>(cppObjPointer);
125 class PyObjectToCppObjectConvertor<bool> {
127 bool convert(PyObject *pyObject,
bool &cppObject) {
128 return convertPyObjectToBool(pyObject, cppObject);
133 class PyObjectToCppObjectConvertor<double> {
135 bool convert(PyObject *pyObject,
double &cppObject) {
136 return convertPyObjectToDouble(pyObject, cppObject);
141 class PyObjectToCppObjectConvertor<float> {
143 bool convert(PyObject *pyObject,
float &cppObject) {
145 PyObjectToCppObjectConvertor<double> convertor;
146 bool ok = convertor.convert(pyObject, val);
153 class PyObjectToCppObjectConvertor<long> {
156 bool convert(PyObject *pyObject,
long &cppObject) {
157 return convertPyObjectToLong(pyObject, cppObject);
162 class PyObjectToCppObjectConvertor<int> {
164 bool convert(PyObject *pyObject,
int &cppObject) {
166 PyObjectToCppObjectConvertor<long> convertor;
167 bool ok = convertor.convert(pyObject, val);
174 class PyObjectToCppObjectConvertor<unsigned long> {
176 bool convert(PyObject *pyObject,
unsigned long &cppObject) {
177 return convertPyObjectToUnsignedLong(pyObject, cppObject);
182 class PyObjectToCppObjectConvertor<unsigned int> {
184 bool convert(PyObject *pyObject,
unsigned int &cppObject) {
186 PyObjectToCppObjectConvertor<unsigned long> convertor;
187 bool ok = convertor.convert(pyObject, val);
193 template <
typename T>
194 class CppObjectToPyObjectConvertor {
198 bool convert(
const T &cppObject, PyObject *&pyObject) {
201 T *objCopy =
new T(cppObject);
202 PyObject *pyObj = convertCppTypeToSipWrapper(objCopy, className,
true);
216 template <
typename T>
217 class CppObjectToPyObjectConvertor<T*> {
221 bool convert(T *cppObject, PyObject *&pyObject) {
224 PyObject *pyObj = convertCppTypeToSipWrapper(cppObject, className);
237 class CppObjectToPyObjectConvertor<bool> {
239 bool convert(
const bool &cppObject, PyObject *&pyObject) {
240 pyObject = convertBoolToPyObject(cppObject);
246 class CppObjectToPyObjectConvertor<long> {
248 bool convert(
const long &cppObject, PyObject *&pyObject) {
249 pyObject = convertLongToPyObject(cppObject);
255 class CppObjectToPyObjectConvertor<int> {
257 bool convert(
const int &cppObject, PyObject *&pyObject) {
258 pyObject = convertLongToPyObject(cppObject);
264 class CppObjectToPyObjectConvertor<unsigned int> {
266 bool convert(
const unsigned int &cppObject, PyObject *&pyObject) {
267 pyObject = convertUnsignedLongToPyObject(cppObject);
273 class CppObjectToPyObjectConvertor<unsigned long> {
275 bool convert(
const unsigned long &cppObject, PyObject *&pyObject) {
276 pyObject = convertUnsignedLongToPyObject(cppObject);
282 class CppObjectToPyObjectConvertor<double> {
284 bool convert(
const double &cppObject, PyObject *&pyObject) {
285 pyObject = convertDoubleToPyObject(cppObject);
291 class CppObjectToPyObjectConvertor<float> {
293 bool convert(
const float &cppObject, PyObject *&pyObject) {
294 pyObject = convertDoubleToPyObject(cppObject);
301 #endif // PYTHONCPPTYPESCONVERTERS_H