Add the macros %typemap_asfromcheck() %typemap_asfrom() that can be used to defined all the different typemaps for types where the As/From/Check methods are provided. All the basic type (int, char,...) typemaps are implemented using them. The std::string and std::complex<T> are reimplemented using the new %typemap_asfrom/check macros too. This helps to complete all the previously missing typemaps (consttab, varin, varout,..) and also ilustrates how to define the As/From/Check methods to use with the %typemap_asfrom/check macros. As a byproduct, the C complex typemap was added, and the file complex.i can be used to load the complex support for either C or C++. The original C++ std_complex.i is still there, and the corresponding C ccomplex.i too, if they need to be included explicitly. Also, the As/From methods are declared via %fragment, so, they can be reused as needed, and only appear in the wrapped code if they corresponding typemap is invoked, making the typemaps and the entire code shorter and simpler. Marcelo. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5691 626c5289-ae23-0410-ae9c-e8d60b6d4f22
61 lines
1.7 KiB
OpenEdge ABL
61 lines
1.7 KiB
OpenEdge ABL
//
|
|
// SWIG typemaps for std::string
|
|
// Luigi Ballabio
|
|
// Apr 8, 2002
|
|
//
|
|
// Python implementation
|
|
|
|
// ------------------------------------------------------------------------
|
|
// std::string is typemapped by value
|
|
// This can prevent exporting methods which return a string
|
|
// in order for the user to modify it.
|
|
// However, I think I'll wait until someone asks for it...
|
|
// ------------------------------------------------------------------------
|
|
|
|
%{
|
|
#include <string>
|
|
%}
|
|
|
|
/* defining the std::string as/from converters */
|
|
|
|
%fragment("SWIG_PyObj_AsStdString","header") %{
|
|
static inline std::string
|
|
SWIG_PyObj_AsStdString(PyObject* obj) {
|
|
static swig_type_info* pchar_info = SWIG_TypeQuery("char *");
|
|
char* buf = 0 ; size_t size = 0;
|
|
SWIG_PyObj_AsCharPtrAndSize(obj, pchar_info, &buf, &size);
|
|
if (PyErr_Occurred() || !buf) {
|
|
PyErr_Clear();
|
|
PyErr_SetString(PyExc_TypeError,"a string is expected");
|
|
return std::string();
|
|
}
|
|
return std::string(buf, size);
|
|
}
|
|
%}
|
|
|
|
%fragment("SWIG_PyObj_CheckStdString","header") %{
|
|
static inline void
|
|
SWIG_PyObj_CheckStdString(PyObject* obj) {
|
|
static swig_type_info* pchar_info = SWIG_TypeQuery("char *");
|
|
char* buf = 0; size_t size = 0;
|
|
SWIG_PyObj_AsCharPtrAndSize(obj, pchar_info, &buf, &size);
|
|
if (PyErr_Occurred() || !buf) {
|
|
PyErr_Clear();
|
|
PyErr_SetString(PyExc_TypeError,"a string is expected");
|
|
}
|
|
}
|
|
%}
|
|
|
|
%fragment("SWIG_PyObj_FromStdString","header") %{
|
|
static inline PyObject*
|
|
SWIG_PyObj_FromStdString(const std::string& s) {
|
|
return SWIG_PyObj_FromCharArray(s.data(), s.size());
|
|
}
|
|
%}
|
|
|
|
|
|
/* declaring the typemaps */
|
|
|
|
%typemap_asfromcheck(std::string, STRING,
|
|
SWIG_PyObj_AsStdString, SWIG_PyObj_FromStdString,
|
|
SWIG_PyObj_CheckStdString);
|