support tinyxml's (const string *) return types.

This commit is contained in:
David Rose 2009-08-11 17:24:56 +00:00
parent 0c4b08731a
commit 383a6e512c
8 changed files with 229 additions and 1 deletions

View File

@ -18,7 +18,9 @@
interfaceMakerPythonSimple.h \
interfaceMakerPythonNative.h \
interrogate.h interrogateBuilder.h parameterRemap.I \
parameterRemap.h parameterRemapBasicStringRefToString.h \
parameterRemap.h \
parameterRemapBasicStringPtrToString.h \
parameterRemapBasicStringRefToString.h \
parameterRemapBasicStringToString.h \
parameterRemapCharStarToString.h \
parameterRemapConcreteToPointer.h \
@ -40,6 +42,7 @@
interfaceMakerPythonSimple.cxx \
interfaceMakerPythonNative.cxx \
interrogate.cxx interrogateBuilder.cxx parameterRemap.cxx \
parameterRemapBasicStringPtrToString.cxx \
parameterRemapBasicStringRefToString.cxx \
parameterRemapBasicStringToString.cxx \
parameterRemapCharStarToString.cxx \

View File

@ -28,6 +28,7 @@
#include "parameterRemapCharStarToString.h"
#include "parameterRemapBasicStringToString.h"
#include "parameterRemapBasicStringRefToString.h"
#include "parameterRemapBasicStringPtrToString.h"
#include "parameterRemapPTToPointer.h"
#include "interrogateDatabase.h"
@ -354,11 +355,20 @@ remap_parameter(CPPType *struct_type, CPPType *param_type) {
} else if (TypeManager::is_const_ref_to_basic_string_char(param_type)) {
return new ParameterRemapBasicStringRefToString(param_type);
} else if (TypeManager::is_const_ptr_to_basic_string_char(param_type)) {
return new ParameterRemapBasicStringPtrToString(param_type);
} else if (TypeManager::is_basic_string_wchar(param_type)) {
return new ParameterRemapBasicWStringToWString(param_type);
} else if (TypeManager::is_const_ref_to_basic_string_wchar(param_type)) {
return new ParameterRemapBasicWStringRefToWString(param_type);
} else if (TypeManager::is_const_ptr_to_basic_string_char(param_type)) {
return new ParameterRemapBasicStringPtrToString(param_type);
} else if (TypeManager::is_const_ptr_to_basic_string_wchar(param_type)) {
return new ParameterRemapBasicWStringPtrToWString(param_type);
}
}
}

View File

@ -2383,6 +2383,29 @@ write_function_instance(ostream &out, InterfaceMaker::Object *obj,
param_name + "_len)";
extra_cleanup += " delete[] " + param_name + "_str;";
} else if (TypeManager::is_const_ptr_to_basic_string_wchar(orig_type)) {
indent(out,indent_level) << "PyUnicodeObject *" << param_name << "\n";
format_specifiers += "U";
parameter_list += ", &" + param_name;
extra_convert += " int " + param_name + "_len = PyUnicode_GetSize((PyObject *)" + param_name + "); wchar_t *" + param_name + "_str = new wchar_t[" + param_name + "_len]; PyUnicode_AsWideChar(" + param_name + ", " + param_name + "_str, " + param_name + "_len);";
pexpr_string = "&basic_string<wchar_t>((wchar_t *)" +
param_name + "_str, " +
param_name + "_len)";
extra_cleanup += " delete[] " + param_name + "_str;";
} else if (TypeManager::is_const_ptr_to_basic_string_char(orig_type)) {
indent(out,indent_level) << "char *" << param_name
<< "_str; int " << param_name << "_len";
format_specifiers += "s#";
parameter_list += ", &" + param_name
+ "_str, &" + param_name + "_len";
pexpr_string = "&basic_string<char>(" +
param_name + "_str, " +
param_name + "_len)";
} else {
indent(out,indent_level) << "char *" << param_name
@ -2767,6 +2790,28 @@ void InterfaceMakerPythonNative::pack_return_value(ostream &out, int indent_leve
<< "return PyUnicode_FromWideChar("
<< return_expr << ".data(), (int)" << return_expr << ".length());\n";
} else if (TypeManager::is_const_ptr_to_basic_string_wchar(orig_type)) {
indent(out, indent_level)<<"if("<< return_expr<< " == NULL)\n";
indent(out, indent_level)<<"{\n";
indent(out, indent_level)<<" Py_INCREF(Py_None);\n";
indent(out, indent_level)<<" return Py_None;\n";
indent(out, indent_level)<<"}\n";
indent(out, indent_level)
<< "return PyUnicode_FromWideChar("
<< return_expr << "->data(), (int)" << return_expr << "->length());\n";
} else if (TypeManager::is_const_ptr_to_basic_string_char(orig_type)) {
indent(out, indent_level)<<"if("<< return_expr<< " == NULL)\n";
indent(out, indent_level)<<"{\n";
indent(out, indent_level)<<" Py_INCREF(Py_None);\n";
indent(out, indent_level)<<" return Py_None;\n";
indent(out, indent_level)<<"}\n";
indent(out, indent_level)
<< "return PyString_FromStringAndSize("
<< return_expr << "->data(), (int)" << return_expr << "->length());\n";
} else {
indent(out, indent_level)
<< "return PyString_FromStringAndSize("

View File

@ -2,6 +2,7 @@
#include "interrogate.cxx"
#include "typeManager.cxx"
#include "parameterRemap.cxx"
#include "parameterRemapBasicStringPtrToString.cxx"
#include "parameterRemapBasicStringRefToString.cxx"
#include "parameterRemapBasicStringToString.cxx"
#include "parameterRemapCharStarToString.cxx"

View File

@ -0,0 +1,85 @@
// Filename: parameterRemapBasicStringPtrToString.cxx
// Created by: drose (11Aug09)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) Carnegie Mellon University. All rights reserved.
//
// All use of this software is subject to the terms of the revised BSD
// license. You should have received a copy of this license along
// with this source code in a file named "LICENSE."
//
////////////////////////////////////////////////////////////////////
#include "parameterRemapBasicStringPtrToString.h"
////////////////////////////////////////////////////////////////////
// Function: ParameterRemapBasicStringPtrToString::Constructor
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
ParameterRemapBasicStringPtrToString::
ParameterRemapBasicStringPtrToString(CPPType *orig_type) :
ParameterRemapToString(orig_type)
{
}
////////////////////////////////////////////////////////////////////
// Function: ParameterRemapBasicStringPtrToString::pass_parameter
// Access: Public, Virtual
// Description: Outputs an expression that converts the indicated
// variable from the original type to the new type, for
// passing into the actual C++ function.
////////////////////////////////////////////////////////////////////
void ParameterRemapBasicStringPtrToString::
pass_parameter(ostream &out, const string &variable_name) {
out << "&" << variable_name;
}
////////////////////////////////////////////////////////////////////
// Function: ParameterRemapBasicStringPtrToString::get_return_expr
// Access: Public, Virtual
// Description: Returns an expression that evalutes to the
// appropriate value type for returning from the
// function, given an expression of the original type.
////////////////////////////////////////////////////////////////////
string ParameterRemapBasicStringPtrToString::
get_return_expr(const string &expression) {
return "(" + expression + ")->c_str()";
}
////////////////////////////////////////////////////////////////////
// Function: ParameterRemapBasicWStringPtrToWString::Constructor
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
ParameterRemapBasicWStringPtrToWString::
ParameterRemapBasicWStringPtrToWString(CPPType *orig_type) :
ParameterRemapToWString(orig_type)
{
}
////////////////////////////////////////////////////////////////////
// Function: ParameterRemapBasicWStringPtrToWString::pass_parameter
// Access: Public, Virtual
// Description: Outputs an expression that converts the indicated
// variable from the original type to the new type, for
// passing into the actual C++ function.
////////////////////////////////////////////////////////////////////
void ParameterRemapBasicWStringPtrToWString::
pass_parameter(ostream &out, const string &variable_name) {
out << "&" << variable_name;
}
////////////////////////////////////////////////////////////////////
// Function: ParameterRemapBasicWStringPtrToWString::get_return_expr
// Access: Public, Virtual
// Description: Returns an expression that evalutes to the
// appropriate value type for returning from the
// function, given an expression of the original type.
////////////////////////////////////////////////////////////////////
string ParameterRemapBasicWStringPtrToWString::
get_return_expr(const string &expression) {
return "(" + expression + ")->c_str()";
}

View File

@ -0,0 +1,48 @@
// Filename: parameterRemapBasicStringPtrToString.h
// Created by: drose (11Aug09)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) Carnegie Mellon University. All rights reserved.
//
// All use of this software is subject to the terms of the revised BSD
// license. You should have received a copy of this license along
// with this source code in a file named "LICENSE."
//
////////////////////////////////////////////////////////////////////
#ifndef PARAMETERREMAPBASICSTRINGPTRTOSTRING_H
#define PARAMETERREMAPBASICSTRINGPTRTOSTRING_H
#include "dtoolbase.h"
#include "parameterRemapToString.h"
////////////////////////////////////////////////////////////////////
// Class : ParameterRemapBasicStringPtrToString
// Description : Maps a const pointer to a basic_string<char> to an
// atomic string.
////////////////////////////////////////////////////////////////////
class ParameterRemapBasicStringPtrToString : public ParameterRemapToString {
public:
ParameterRemapBasicStringPtrToString(CPPType *orig_type);
virtual void pass_parameter(ostream &out, const string &variable_name);
virtual string get_return_expr(const string &expression);
};
////////////////////////////////////////////////////////////////////
// Class : ParameterRemapBasicWStringPtrToWString
// Description : Maps a const pointer to a basic_string<wchar_t> to an
// atomic string.
////////////////////////////////////////////////////////////////////
class ParameterRemapBasicWStringPtrToWString : public ParameterRemapToWString {
public:
ParameterRemapBasicWStringPtrToWString(CPPType *orig_type);
virtual void pass_parameter(ostream &out, const string &variable_name);
virtual string get_return_expr(const string &expression);
};
#endif

View File

@ -529,6 +529,23 @@ is_const_ref_to_basic_string_char(CPPType *type) {
}
}
////////////////////////////////////////////////////////////////////
// Function: TypeManager::is_const_ptr_to_basic_string_char
// Access: Public, Static
// Description: Returns true if the indicated type is a const
// pointer to basic_string<char>.
////////////////////////////////////////////////////////////////////
bool TypeManager::
is_const_ptr_to_basic_string_char(CPPType *type) {
switch (type->get_subtype()) {
case CPPDeclaration::ST_pointer:
return is_const_basic_string_char(type->as_pointer_type()->_pointing_at);
default:
return false;
}
}
////////////////////////////////////////////////////////////////////
// Function: TypeManager::is_string
// Access: Public, Static
@ -607,6 +624,23 @@ is_const_ref_to_basic_string_wchar(CPPType *type) {
}
}
////////////////////////////////////////////////////////////////////
// Function: TypeManager::is_const_ptr_to_basic_string_wchar
// Access: Public, Static
// Description: Returns true if the indicated type is a const
// pointer to basic_string<wchar_t>.
////////////////////////////////////////////////////////////////////
bool TypeManager::
is_const_ptr_to_basic_string_wchar(CPPType *type) {
switch (type->get_subtype()) {
case CPPDeclaration::ST_pointer:
return is_const_basic_string_wchar(type->as_pointer_type()->_pointing_at);
default:
return false;
}
}
////////////////////////////////////////////////////////////////////
// Function: TypeManager::is_wstring
// Access: Public, Static

View File

@ -67,10 +67,12 @@ public:
static bool is_basic_string_char(CPPType *type);
static bool is_const_basic_string_char(CPPType *type);
static bool is_const_ref_to_basic_string_char(CPPType *type);
static bool is_const_ptr_to_basic_string_char(CPPType *type);
static bool is_string(CPPType *type);
static bool is_basic_string_wchar(CPPType *type);
static bool is_const_basic_string_wchar(CPPType *type);
static bool is_const_ref_to_basic_string_wchar(CPPType *type);
static bool is_const_ptr_to_basic_string_wchar(CPPType *type);
static bool is_wstring(CPPType *type);
static bool is_bool(CPPType *type);
static bool is_integer(CPPType *type);