Added support for C++0x rvalue and move semantics.

Added testcase.


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/branches/gsoc2009-matevz@11450 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Matevz Jekovec 2009-07-25 18:51:37 +00:00
commit a8209bfd68
4 changed files with 58 additions and 3 deletions

View file

@ -407,7 +407,8 @@ CPP0X_TEST_CASES = \
cpp0x_template_explicit \ cpp0x_template_explicit \
cpp0x_uniform_initialization \ cpp0x_uniform_initialization \
cpp0x_function_objects \ cpp0x_function_objects \
cpp0x_strongly_typed_enumerations cpp0x_strongly_typed_enumerations \
cpp0x_rvalue_reference
# cpp0x_alternate_function_syntax # not fully implemented yet # cpp0x_alternate_function_syntax # not fully implemented yet
# cpp0x_hash_types # not fully implemented yet # cpp0x_hash_types # not fully implemented yet
# cpp0x_unrestricted_unions # not supported by any compilers yet # cpp0x_unrestricted_unions # not supported by any compilers yet

View file

@ -0,0 +1,23 @@
%module cpp0x_rvalue_reference
%inline %{
class A {
public:
int getAcopy() { return _a; }
int *getAptr() { return &_a; }
int &getAref() { return _a; }
int &&getAmove() { return _a; }
void setAcopy(int a) { _a = a; }
void setAptr(int *a) { _a = *a; }
void setAref(int &a) { _a = a; }
void setAmove(int &&a) { _a = a; }
void arg(int a);
void arg(int *a);
void arg(int &a);
// void arg(int &&a); // redefinition not allowed
private:
int _a;
};
%}

View file

@ -0,0 +1,22 @@
import cpp0x_rvalue_reference
a = cpp0x_rvalue_reference.A()
a.setAcopy(5)
if a.getAcopy() != 5:
raise RunTimeError, "int A::getAcopy() value is ", a.getAcopy(), " should be 5"
ptr = a.getAptr()
a.setAptr(ptr)
if a.getAcopy() != 5:
raise RunTimeError, "after A::setAptr(): int A::getAcopy() value is ", a.getAcopy(), " should be 5"
a.setAref(ptr)
if a.getAcopy() != 5:
raise RunTimeError, "after A::setAref(): int A::getAcopy() value is ", a.getAcopy(), " should be 5"
a.setAmove(ptr)
if a.getAcopy() != 5:
raise RunTimeError, "after A::setAmove(): int A::getAcopy() value is ", a.getAcopy(), " should be 5"

View file

@ -4804,7 +4804,16 @@ declarator : pointer notso_direct_declarator {
$$ = $1; $$ = $1;
if (!$$.type) $$.type = NewStringEmpty(); if (!$$.type) $$.type = NewStringEmpty();
} }
| AND notso_direct_declarator { | AND notso_direct_declarator {
$$ = $2;
$$.type = NewStringEmpty();
SwigType_add_reference($$.type);
if ($2.type) {
SwigType_push($$.type,$2.type);
Delete($2.type);
}
}
| LAND notso_direct_declarator {
$$ = $2; $$ = $2;
$$.type = NewStringEmpty(); $$.type = NewStringEmpty();
SwigType_add_reference($$.type); SwigType_add_reference($$.type);
@ -5082,7 +5091,7 @@ abstract_declarator : pointer {
Delete($2.type); Delete($2.type);
} }
} }
| AND { | AND {
$$.id = 0; $$.id = 0;
$$.parms = 0; $$.parms = 0;
$$.have_parms = 0; $$.have_parms = 0;