Added %aggregate_check macro.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@5314 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
306683fc3c
commit
4599e77844
1 changed files with 50 additions and 0 deletions
|
|
@ -335,4 +335,54 @@ private:
|
|||
%}
|
||||
%enddef
|
||||
|
||||
/*
|
||||
|
||||
This macro performs constant aggregation. Basically the idea of
|
||||
constant aggregation is that you can group a collection of constants
|
||||
together. For example, suppose you have some code like this:
|
||||
|
||||
#define UP 1
|
||||
#define DOWN 2
|
||||
#define LEFT 3
|
||||
#define RIGHT 4
|
||||
|
||||
Now, suppose you had a function like this:
|
||||
|
||||
int move(int direction)
|
||||
|
||||
In this case, you might want to restrict the direction argument to one of the supplied
|
||||
constant names. To do this, you could write some typemap code by hand. Alternatively,
|
||||
you can use the %aggregate_check macro defined here to create a simple check function
|
||||
for you. Here is an example:
|
||||
|
||||
%aggregate_check(int, check_direction, UP, DOWN, LEFT, RIGHT);
|
||||
|
||||
Now, using a typemap
|
||||
|
||||
%typemap(check) int direction {
|
||||
if (!check_direction($1)) SWIG_exception(SWIG_ValueError,"Bad direction.");
|
||||
}
|
||||
|
||||
or a contract (better)
|
||||
|
||||
%contract move(int x) {
|
||||
require:
|
||||
check_direction(x);
|
||||
}
|
||||
*/
|
||||
|
||||
%define %aggregate_check(TYPE, NAME, FIRST, ...)
|
||||
%wrapper %{
|
||||
static int NAME(TYPE x) {
|
||||
static TYPE values[] = { FIRST, ##__VA_ARGS__ };
|
||||
static int size = sizeof(values);
|
||||
int i,j;
|
||||
for (i = 0, j = 0; i < size; i+=sizeof(TYPE),j++) {
|
||||
if (x == values[j]) return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
%}
|
||||
%enddef
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue