Perl module now fully supports operator overloading

added script for testing overloading support which uses Perl test harness: Test::More

updated HTML docs for operators


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8246 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Jason Stewart 2006-01-06 10:59:27 +00:00
commit 18771f8267
4 changed files with 282 additions and 52 deletions

View file

@ -10,7 +10,7 @@ see bottom for a set of possible tests
%warnfilter(362,389,383,384);
#endif
#if !defined(SWIGLUA)
#if !defined(SWIGLUA) || !defined(SWIGPERL)
%rename(Equal) operator =;
%rename(PlusEqual) operator +=;
%rename(MinusEqual) operator -=;
@ -60,6 +60,7 @@ see bottom for a set of possible tests
class Op{
public:
int i;
int j;
Op(int a=0):i(a)
{}
Op(const Op& o):i(o.i)
@ -88,6 +89,8 @@ public:
// unary operators
Op operator++() {i++; return *this;}
Op operator--() {i--; return *this;}
Op operator-() const {return Op(-i);}
bool operator !() const {return !(i);}
@ -105,6 +108,9 @@ public:
int operator()(int a=0){return i+a;}
int operator()(int a,int b){return i+a+b;}
<<<<<<< operator_overload.i
// TODO: <<,<<=
=======
// increment/decrement operators
Op& operator++(){++i; return *this;} // prefix ++
Op& operator++(int){i++; return *this;} // postfix ++
@ -112,6 +118,7 @@ public:
Op& operator--(int){i--; return *this;} // postfix --
// TODO: <<,<<=
>>>>>>> 1.6
};
// just to complicate matters
@ -129,6 +136,9 @@ inline bool operator>=(const Op& a,const Op& b){return a.i>=b.i;}
// we need to extend the class
// to make the friends & non members part of the class
%extend Op{
Op operator and(const Op& b){return Op(self->i&&b.i);}
Op operator or(const Op& b){return Op(self->i||b.i);}
Op operator+(const Op& b){return Op(self->i+b.i);}
Op operator-(const Op& b){return Op(self->i-b.i);}
Op operator*(const Op& b){return Op(self->i*b.i);}

View file

@ -0,0 +1,137 @@
#!/usr/bin/perl -w
use strict;
use Test::More tests => 24;
use operator_overload;
pass("loaded");
my $op = operator_overload::Op->new();
isa_ok($op, "operator_overload::Op");
my $op2 = operator_overload::Op->new();
isa_ok($op2, "operator_overload::Op");
# operator equal
$op->{i} = 5;
$op2->{i} = 3;
ok(not ($op == $op2), "operator equal: not equal");
$op->{i} = 3;
ok(($op == $op2), "operator equal: equal");
# operator equal
$op->{i} = 5;
$op2->{i} = 3;
ok(($op != $op2), "operator not equal: not equal");
$op->{i} = 3;
ok(not ($op != $op2), "operator not equal: equal");
# stringify operator
$op->{i} = 3;
is("Op(3)", "$op", "operator stringify");
# addition operator
$op->{i} = 3;
$op2->{i} = 3;
my $op3 = $op + $op2;
is($op3->{i}, 6, "operator addition");
# addition assignment operator
$op->{i} = 3;
$op2->{i} = 3;
$op += $op2;
is($op->{i}, 6, "operator additive assignment");
# subtraction operator
$op3->{i} = 6;
$op2->{i} = 3;
$op = $op3 - $op2;
is($op->{i}, 3, "operator subtration");
# subtractive assignment operator
$op->{i} = 6;
$op2->{i} = 3;
$op -= $op2;
is($op->{i}, 3, "operator subtrative assignment");
# multiplication operator
$op->{i} = 3;
$op2->{i} = 3;
$op3 = $op * $op2;
is($op3->{i}, 9, "operator multiplication");
# division operator
$op->{i} = 9;
$op2->{i} = 3;
$op3 = $op / $op2;
is($op3->{i}, 3, "operator division");
# modulus operator
$op->{i} = 8;
$op2->{i} = 3;
$op3 = $op % $op2;
is($op3->{i}, 2, "operator modulus");
# greater than operator
$op->{i} = 8;
$op2->{i} = 3;
ok($op > $op2, "operator greater than");
ok(not ($op2 > $op), "operator greater than");
$op->{i} = 3;
ok(not ($op2 > $op), "operator greater than");
ok(not ($op > $op2), "operator greater than");
# lesser than operator
$op2->{i} = 8;
$op->{i} = 3;
ok($op < $op2, "operator lesser than");
ok(not ($op2 < $op), "operator lesser than");
$op2->{i} = 3;
ok(not ($op2 < $op), "operator lesser than");
ok(not ($op < $op2), "operator lesser than");
TODO : {
local $TODO = "I can't get Perl to trigger overloaded 'and' and 'or'";
# operator and
$op->{i} = 0;
$op2->{i} = 1;
ok(not ($op && $op2), "operator and");
$op->{i} = 0;
$op2->{i} = 0;
ok(not ($op && $op2), "operator and");
$op->{i} = 1;
$op2->{i} = 1;
ok(($op && $op2), "operator and");
# operator or
$op->{i} = 0;
$op2->{i} = 1;
ok(($op || $op2), "operator or");
$op->{i} = 1;
ok(($op || $op2), "operator or");
$op->{i} = 0;
$op2->{i} = 0;
ok(not ($op || $op2), "operator or");
};
# increment operator
$op->{i} = 7;
$op++;
is($op->{i}, 8, "operator increment");
# decrement operator
$op->{i} = 7;
$op--;
is($op->{i}, 6, "operator decrement");
# inverse operator
$op->{i} = 3;
$op2 = -$op;
is($op2->{i}, -3, "operator inverse");