Define void* and void** Arguments - MATLAB & Simulink (original) (raw)
MATLAB® supports C++ signatures that have void*
inputs or that returnvoid*
outputs. A void*
return type and avoid**
parameter type are opaque objects.
You cannot create void*
and void**
types in MATLAB. Instead, you can use C++ library functions with these types:
- If
void*
is defined with atypedef
(orusing
) keyword, then MATLAB assigns thetypedef
name as theMLTYPE
. - Publishers can assign a MATLAB type to a
void*
type by specifyingMLTYPE
in the library definition file. - MATLAB users can pass a
void*
return argument as input to a function that takes the appropriatevoid*
input.
MATLAB returns a void*
return type for void**
parameters. For more information, see void** Input Argument Types.
MATLAB does not support type-casting void*
to MATLAB data types.
void*
Return Types
MATLAB defines void*
output in the library definition file by specifying the argument MLTYPE
as one of these:
- A
typedef
from the library. Use for scalar output only.
Ifvoid*
has atypedef
defined in the library, MATLAB specifiesMLTYPE
as the new type name in thetypedef
statement. - If there is no
typedef
, chose a MATLAB type of the format clib.InterfaceName
.TypeName
, whereTypeName
can include a namespace.
If the library does not have an appropriatetypedef
statement, you can definevoid*
with a MATLAB type.
This sample header file contains functions with void*
types. You can define these types by using statements from the generated library definition file for the example. Assumptions about the argument types are based on the library documentation.
typedef void* handle;
handle getHandle();
using ghandle = void*;
ghandle getGHandle();
void* getImagData(const int* pa);
typedef void* data;
void* getData();
Define Output Argument by Using typedef
from Library
handle
is defined by typedef
. MATLAB creates the opaque type typedef void* handle
.
addOpaqueType(libnameDef, ... "typedef void* handle", "MATLABName", ... "clib.libname.handle", ... "Description", "clib.libname.handle Representation of C++ type void*.")
MATLAB automatically uses this type to define MLTYPE
asclib.libname.handle
in the return argument.
defineOutput(getHandleDefinition, "RetVal", "clib.lib.handle");
Define Output Argument from using
Statement
ghandle
is defined with a using
statement. As with handle
in the previous example, MATLAB automatically creates type typedef void* ghandle
and uses it to define MLTYPE
as clib.libname.ghandle
in the return argument.
addOpaqueType(libnameDef, ... "typedef void* ghandle", "MATLABName", ... "clib.libname.ghandle", ... "Description", "clib.libname.ghandle Representation of C++ type void*.") defineOutput(getGHandleDefinition, "RetVal", "clib.libname.ghandle");
Define Output Argument from New Type Name
The output of getImagData
needs definition.
%defineOutput(getImagDataDefinition, "RetVal", , ); ... %'' can be an existing typedef name for void* or a new typedef name to void*.
You can specify a new type, for example clib.libname.ImagData
and use it to define RetVal
as a scalar value of this type.
defineOutput(getImagDataDefinition, "RetVal", "clib.libname.ImagData", 1);
Define Output Argument from Existing typedef
The output of getData
needs definition.
%defineOutput(getDataDefinition, "RetVal", , ); %'' can be an existing typedef name for void* or a new typedef name to void*.
Because there is a typedef
for void*
nameddata
, you can use this to define RetVal
as a scalar value of type clib.libname.data
.
defineOutput(getDataDefinition, "RetVal", "clib.libname.data", 1);
void*
Input Argument Types
MATLAB attempts to convert the underlying C++ data of a void*
argument to the corresponding C++ type. For information about the C++ to MATLAB data type mapping, see void* Argument Types.
- Fundamental types
clib.array
types- Types for C++ classes in the library
void*
typedef
Following are sample header file statements containing functions that havevoid*
input arguments. Assumptions about the argument types are based on the library documentation. The defineArgument
statements in the generated library definition file definelibname.m
show you how to treat each case.
Define Input Argument as Fundamental Type
The documentation for getAttribute
indicates that void *value
points to C++ data of fundamental type uint64_t
and that this value is passed as a return argument.
class TaskHandle; int32 getAttribute(TaskHandle tHandle, int32 attribute, void *value);
MATLAB generates this statement for defining input argumentvalue
.
%defineArgument(getAttributeDefinition, "value", , , ); %'' can be primitive type, user-defined type, clib.array type, or %a list of existing typedef names for void*.
Define value
as a scalar return value of typeuint64
.
defineArgument(getAttributeDefinition, "value", "uint64", "output", 1);
Define Input Argument as clib.array
Type
You can define the readArray
argument in thisreadRaw
function as a clib.array
type.
class TaskHandle; int32 readRaw (TaskHandle tHandle, void *readArray, uInt32 arraySizeInBytes);
Define argument void *readArray
as an input of typeclib.array.libname.Int
with a size ofarraySizeInBytes
.
defineArgument(readRawDefinition, "readArray", "clib.array.libname.Int", ... "input", "arraySizeInBytes");
Define Input Argument as C++ Class in Library
You can define the userdata
argument in thissetDrawCallback
function as a class in the library.
void setDrawCallback(const String& winname, OpenGlDrawCallback onOpenGlDraw, void* userdata = 0) void on_opengl(void* param) { cv::ogl::Texture2D* backgroundTex = (cv::ogl::Texture2D*)param; .... }
Define argument void *userdata
as an input scalar of classclib.lib.cv.ogl.Texture2D
.
defineArgument(setDrawCallbackDefinition, "userdata", "clib.lib.cv.ogl.Texture2D", ... "input", 1);
Define Input Argument as Existing void*
typedef
You can define the in
argument in thissetRemoteTimeout
function by using an existingtypedef
for void*
.
typedef void* sessionHandle; void setRemoteTimeout(sessionHandle in);
Define argument in
as an input scalar of typedef
sessionHandle
.
defineArgument(setRemoteTimeoutDefinition, "in", "clib.libname.sessionHandle", "input", 1);
void**
Input Argument Types
MATLAB returns a void*
argument for void**
parameters. If void *
is defined by using a typedef
or a using
statement, then MATLAB automatically assigns the typedef
orusing
name as the MLTYPE
. Otherwise, you can assign a MATLAB type to an existing void*
type in the library by specifyingMLTYPE
in the library definition file.
This sample header file contains functions with void**
parameters. The following topics show you how you can define these types by using statements from the generated library definition file for the example. Assumptions about the argument types are based on the library documentation.
class HClass{};
typedef void* handle;
void getHandle(handle* out){
*out = new HClass();
}
using ghandle = void*;
void getGHandle(ghandle* out){
*out = new HClass();
}
void getNewHandle(void** out){
*out = new int(1);
}
typedef void* ptr;
void getPointer(void** out){
*out = new int(2);
}
Define Argument With void*
typedef
or using
Statement From Library
The out
argument in the getHandle
function is defined as a pointer to the void*
type handle
. For interface library lib
, MATLAB uses the existing typedef
statement to defineout
as an output scalar of typeclib.lib.handle
.
defineArgument(getHandleDefinition, "out", "clib.lib.handle", "output", 1);
The out
argument in the getGHandle
function is defined as a pointer to the void*
variable ghandle
defined by a using
statement. MATLAB uses the existing using
statement to defineout
as an output scalar of typeclib.lib.ghandle
.
defineArgument(getGHandleDefinition, "out", "clib.lib.ghandle", "output", 1);
Define Argument From New Type Name for void*
The void**
parameter of getNewHandle
needs definition.
%defineArgument(getNewHandleDefinition, "out", , "output", 1);
You can specify a new type, for example clib.lib.NewHandle
.
defineArgument(getNewHandleDefinition, "out", "clib.lib.NewHandle", "output", 1);
Define Argument From Existing void*
typedef
The void**
parameter of getNewHandle
needs definition.
%defineArgument(getPointerDefinition, "out", , "output", 1);
Because there is a typedef
for void*
namedptr
, you can use this to define the out
parameter as a scalar value of typeclib.lib.ptr
.
defineArgument(getPointerDefinition, "out", "clib.lib.ptr", "output", 1);
MATLABType
as Object of Class
MATLAB displays a message about an object not available without constructing an object of the class and suggests other values for MATLABType
. Alternatively, consider using a MATLABType
that is outside the scope of the class.
For example, suppose that you create a library definition file definelib.m
from this class A
.
class A {
public:
typedef void* handle;
A(void* arg1, handle arg2) {}
void* task1() {
int* x = new int(10);
return x;
}
handle task2() {
int* x = new int(10);
return x;
}
};
MATLAB creates an opaque type for typedef void* handle
and definestask2
. The publisher creates an opaque typeclib.lib.A.NewHandle
for void* task1
and theA
class constructor argument void* arg1
.
addOpaqueType(libDef, "typedef void* A::handle", "MATLABName", "clib.lib.A.handle ", ... "Description", "clib.lib.A.handle Representation of C++ opaque type.");
AConstructor1Definition = addConstructor(ADefinition, ... "A::A(void * in)", ... "Description", "clib.lib.A.A Constructor of C++ class A."); defineArgument(AConstructor1Definition, "arg1", "clib.lib.A.NewHandle", "input", 1); % '' can be primitive type, user-defined type, clib.array type, or a list of existing typedef names for void*. defineArgument(AConstructor1Definition, "arg2", "clib.lib.A.handle", "input", 1); % '' can be clib.lib.A.handle, primitive type, user-defined type, or a clib.array type. validate(AConstructor1Definition);
task1Definition = addMethod(ADefinition, ... "A::handle A::task1()", ... "Description", "clib.lib.A.task1 Method of C++ class A."); defineOutput(task1Definition, "RetVal", "clib.lib.A.NewHandle", 1); % '' can be an existing typedef name for void* or a new typedef name to void*. validate(task1Definition);
task2Definition = addMethod(ADefinition, ... "A::handle A::task2()", ... "Description", "clib.lib.A.task2 Method of C++ class A."); defineOutput(task2Definition, "RetVal", "clib.lib.A.handle", 1); validate(task2Definition);
Because there is more than one void*
input argument for constructorA
, MATLAB displays this message:
clib.lib.A(clib.lib.A.Newhandle,clib.lib.A.handle) Note: This constructor cannot create object clib.lib.A, if object clib.lib.A.Newhandle/ clib.lib.A.handle is not available without constructing object of clib.lib.A. Consider using a MATLABType which is outside the scope of clib.lib.A.
To create a clib.lib.A
object for this constructor, specifyMATLABType
as one of these:
- Primitive type, user-defined type, or
clib.array
type forarg1
. - Primitive type, user-defined type,
clib.array
type forarg2
. MATLABType
, which is outside the scope ofclib.lib.A
.
Memory Management for void*
and void**
Arguments
You can pass the ownership of the memory of a void*
argument to the library by using the ReleaseOnCall
name-value argument in defineArgument (FunctionDefinition) or defineArgument (MethodDefinition).
You can transfer ownership of the memory of a void*
output to MATLAB by using the DeleteFcn
name-value argument in defineOutput (FunctionDefinition) or defineOutput (MethodDefinition). The deleter can be a user-defined function or the C++ standard delete
operator for void*
return types.
For scalar void**
output arguments, use theDeleteFcn
argument in defineArgument (FunctionDefinition) or defineArgument (MethodDefinition). For an example, see Manage Memory of Double Pointer Input Argument.
If you have multiple void*
typedef statements, it is possible to define a deleter function that takes a list of these typedef arguments as theMLTYPE
for void*
input. If you assignDeleteFcn
to only one void*
typedef returned by a function, then the MATLAB user cannot directly call this deleter function by using that argument. MATLAB calls this function when the user calls the MATLABdelete
function. The user can, however, directly call the deleter function by using any of the other void*
typedef arguments.
For more information, see Lifetime Management of C++ Objects in MATLAB.