diff --git a/Examples/java/class/example.cxx b/Examples/java/class/example.cxx
index 1e8e203dd..046304519 100644
--- a/Examples/java/class/example.cxx
+++ b/Examples/java/class/example.cxx
@@ -1,4 +1,4 @@
-/* File : example.c */
+/* File : example.cxx */
#include "example.h"
#define M_PI 3.14159265358979323846
@@ -11,18 +11,18 @@ void Shape::move(double dx, double dy) {
int Shape::nshapes = 0;
-double Circle::area(void) {
+double Circle::area() {
return M_PI*radius*radius;
}
-double Circle::perimeter(void) {
+double Circle::perimeter() {
return 2*M_PI*radius;
}
-double Square::area(void) {
+double Square::area() {
return width*width;
}
-double Square::perimeter(void) {
+double Square::perimeter() {
return 4*width;
}
diff --git a/Examples/java/class/example.h b/Examples/java/class/example.h
index 46d901361..0dff185b2 100644
--- a/Examples/java/class/example.h
+++ b/Examples/java/class/example.h
@@ -7,11 +7,11 @@ public:
}
virtual ~Shape() {
nshapes--;
- };
- double x, y;
+ }
+ double x, y;
void move(double dx, double dy);
- virtual double area(void) = 0;
- virtual double perimeter(void) = 0;
+ virtual double area() = 0;
+ virtual double perimeter() = 0;
static int nshapes;
};
@@ -19,21 +19,16 @@ class Circle : public Shape {
private:
double radius;
public:
- Circle(double r) : radius(r) { };
- virtual double area(void);
- virtual double perimeter(void);
+ Circle(double r) : radius(r) { }
+ virtual double area();
+ virtual double perimeter();
};
class Square : public Shape {
private:
double width;
public:
- Square(double w) : width(w) { };
- virtual double area(void);
- virtual double perimeter(void);
+ Square(double w) : width(w) { }
+ virtual double area();
+ virtual double perimeter();
};
-
-
-
-
-
diff --git a/Examples/java/class/index.html b/Examples/java/class/index.html
index cf9130c62..b0a5e221d 100644
--- a/Examples/java/class/index.html
+++ b/Examples/java/class/index.html
@@ -32,8 +32,8 @@ public:
}
virtual ~Shape() {
nshapes--;
- };
- double x, y;
+ }
+ double x, y;
void move(double dx, double dy);
virtual double area() = 0;
virtual double perimeter() = 0;
@@ -44,7 +44,7 @@ class Circle : public Shape {
private:
double radius;
public:
- Circle(double r) : radius(r) { };
+ Circle(double r) : radius(r) { }
virtual double area();
virtual double perimeter();
};
@@ -53,7 +53,7 @@ class Square : public Shape {
private:
double width;
public:
- Square(double w) : width(w) { };
+ Square(double w) : width(w) { }
virtual double area();
virtual double perimeter();
};
@@ -146,50 +146,15 @@ Shape.setNshapes(13); // Set a static data member
- This high-level interface using proxy classes is not the only way to handle C++ code.
-A low level interface using c functions to access member variables and member functions is the alternative SWIG
-approach. This entails passing around the c pointer or c++ 'this' pointer and as such it is not difficult to crash the JVM.
+A low level interface using C functions to access member variables and member functions is the alternative SWIG
+approach. This entails passing around the C pointer or C++ 'this' pointer and as such it is not difficult to crash the JVM.
The abstraction of the underlying pointer by the java proxy classes far better fits the java programming paradigm.
-
- SWIG *does* know how to properly perform upcasting of objects in an inheritance
+
- SWIG does know how to properly perform upcasting of objects in an inheritance
hierarchy (including multiple inheritance). However Java classes can only derive from one base class so multiple inheritance
is not implemented. Java classes can implement more than one interface so there is scope for improvement in the future.
-
-
- A wide variety of C++ features are not currently supported by SWIG. Here is the
-short and incomplete list:
-
-
-
-- Overloaded methods and functions. SWIG wrappers don't know how to resolve name
-conflicts so you must give an alternative name to any overloaded method name using the
-%name directive like this:
-
-
-
-void foo(int a);
-%name(foo2) void foo(double a, double b);
-
-
-
-
-
- Overloaded operators. Not supported at all. The only workaround for this is
-to write a helper function. For example:
-
-
-
-%inline %{
- Vector *vector_add(Vector *a, Vector *b) {
- ... whatever ...
- }
-%}
-
-
-
-
-
- Namespaces. Not supported at all. Won't be supported until SWIG2.0 (if at all).
-
-
diff --git a/Examples/perl5/class/example.cxx b/Examples/perl5/class/example.cxx
index 1e8e203dd..046304519 100644
--- a/Examples/perl5/class/example.cxx
+++ b/Examples/perl5/class/example.cxx
@@ -1,4 +1,4 @@
-/* File : example.c */
+/* File : example.cxx */
#include "example.h"
#define M_PI 3.14159265358979323846
@@ -11,18 +11,18 @@ void Shape::move(double dx, double dy) {
int Shape::nshapes = 0;
-double Circle::area(void) {
+double Circle::area() {
return M_PI*radius*radius;
}
-double Circle::perimeter(void) {
+double Circle::perimeter() {
return 2*M_PI*radius;
}
-double Square::area(void) {
+double Square::area() {
return width*width;
}
-double Square::perimeter(void) {
+double Square::perimeter() {
return 4*width;
}
diff --git a/Examples/perl5/class/example.h b/Examples/perl5/class/example.h
index b0671d583..fd6943541 100644
--- a/Examples/perl5/class/example.h
+++ b/Examples/perl5/class/example.h
@@ -7,11 +7,11 @@ public:
}
virtual ~Shape() {
nshapes--;
- };
- double x, y;
+ }
+ double x, y;
void move(double dx, double dy);
- virtual double area(void) = 0;
- virtual double perimeter(void) = 0;
+ virtual double area() = 0;
+ virtual double perimeter() = 0;
static int nshapes;
};
@@ -19,29 +19,24 @@ class Circle : public Shape {
private:
double radius;
public:
- Circle(double r) : radius(r) { };
- virtual double area(void);
- virtual double perimeter(void);
+ Circle(double r) : radius(r) { }
+ virtual double area();
+ virtual double perimeter();
};
class Square : public Shape {
private:
double width;
public:
- Square(double w) : width(w) { };
- virtual double area(void);
- virtual double perimeter(void);
+ Square(double w) : width(w) { }
+ virtual double area();
+ virtual double perimeter();
};
typedef Square TSquare;
class CFoo
{
public:
- static Square MakeSquare(void) {return Square(4.0);};
- static TSquare MakeTSquare(void) {return Square(4.0);};
+ static Square MakeSquare(void) {return Square(4.0);}
+ static TSquare MakeTSquare(void) {return Square(4.0);}
};
-
-
-
-
-
diff --git a/Examples/perl5/class/example.i b/Examples/perl5/class/example.i
index 23ee8a822..75700b305 100644
--- a/Examples/perl5/class/example.i
+++ b/Examples/perl5/class/example.i
@@ -6,6 +6,5 @@
%}
/* Let's just grab the original header file here */
-
%include "example.h"
diff --git a/Examples/perl5/class/index.html b/Examples/perl5/class/index.html
index 58a50ad2e..b4f923b5a 100644
--- a/Examples/perl5/class/index.html
+++ b/Examples/perl5/class/index.html
@@ -32,8 +32,8 @@ public:
}
virtual ~Shape() {
nshapes--;
- };
- double x, y;
+ }
+ double x, y;
void move(double dx, double dy);
virtual double area() = 0;
virtual double perimeter() = 0;
@@ -44,7 +44,7 @@ class Circle : public Shape {
private:
double radius;
public:
- Circle(double r) : radius(r) { };
+ Circle(double r) : radius(r) { }
virtual double area();
virtual double perimeter();
};
@@ -53,7 +53,7 @@ class Square : public Shape {
private:
double width;
public:
- Square(double w) : width(w) { };
+ Square(double w) : width(w) { }
virtual double area();
virtual double perimeter();
};
@@ -82,7 +82,7 @@ like this:
Note: when creating a C++ extension, you must run SWIG with the -c++ option like this:
-% swig -c++ -python example.i
+% swig -c++ -perl example.i
@@ -97,60 +97,45 @@ Click here to see a script that calls the C++ functions f
-$c = example::new_Circle(10.0);
+$c = new example::Circle(10.0);
-
To access member data, a pair of accessor functions are used.
-For example:
+You can access member data like so:
-example::Shape_x_set($c,15); # Set member data
-$x = example::Shape_x_get($c); # Get member data
-
-
-
-Note: when accessing member data, the name of the class in which
-the data member is defined is used. For example Shape_x_get().
-
-
-
To invoke a member function, you simply do this
-
-
-
-print "The area is ", example::Shape_area($c);
+$c->{x} = 15; # Set member data
+$x = $c->{x}; # Get member data
-
Type checking knows about the inheritance structure of C++. For example:
+To invoke a member function, you simply do this:
-example::Shape_area($c); # Works (c is a Shape)
-example::Circle_area($c); # Works (c is a Circle)
-example::Square_area($c); # Fails (c is definitely not a Square)
+print "The area is ", $c->area();
-
To invoke a destructor, simply do this
+To invoke a destructor, simply do this:
-example::delete_Shape($c); # Deletes a shape
+$c->DESTROY(); # Deletes a shape
-
Static member variables are wrapped as C global variables. For example:
+Static member variables are wrapped like so:
-$n = $example::Shape_nshapes; # Get a static data member
-$example::Shapes_nshapes = 13; # Set a static data member
+$n = $example::Shape::nshapes; # Get a static data member
+$example::Shapes::nshapes = 13; # Set a static data member
@@ -159,47 +144,11 @@ $example::Shapes_nshapes = 13; # Set a static data member
General Comments
-- This low-level interface is not the only way to handle C++ code. Proxy classes
-provide a much higher-level interface.
-
-
-
- SWIG *does* know how to properly perform upcasting of objects in an inheritance
+
- SWIG does know how to properly perform upcasting of objects in an inheritance
hierarchy (including multiple inheritance). Therefore it is perfectly safe to pass
an object of a derived class to any function involving a base class.
-
-
- A wide variety of C++ features are not currently supported by SWIG. Here is the
-short and incomplete list:
-
-
-
-- Overloaded methods and functions. SWIG wrappers don't know how to resolve name
-conflicts so you must give an alternative name to any overloaded method name using the
-%name directive like this:
-
-
-
-void foo(int a);
-%name(foo2) void foo(double a, double b);
-
-
-
-
-
- Overloaded operators. Not supported at all. The only workaround for this is
-to write a helper function. For example:
-
-
-
-%inline %{
- Vector *vector_add(Vector *a, Vector *b) {
- ... whatever ...
- }
-%}
-
-
-
-
-
- Namespaces. Not supported at all. Won't be supported until SWIG2.0 (if at all).
+
- C++ Namespaces - %nspace isn't yet supported for Perl.
diff --git a/Examples/perl5/class/runme.pl b/Examples/perl5/class/runme.pl
index 076e1437b..e45e2b8ce 100644
--- a/Examples/perl5/class/runme.pl
+++ b/Examples/perl5/class/runme.pl
@@ -40,7 +40,7 @@ foreach $o ($c,$s) {
print " $o\n";
print " area = ", $o->area(), "\n";
print " perimeter = ", $o->perimeter(), "\n";
- }
+}
# ----- Delete everything -----
diff --git a/Examples/php/class/example.cxx b/Examples/php/class/example.cxx
index f171f10e9..046304519 100644
--- a/Examples/php/class/example.cxx
+++ b/Examples/php/class/example.cxx
@@ -1,14 +1,7 @@
-/* File : example.c */
+/* File : example.cxx */
#include "example.h"
-#include
-#ifndef M_PI
-# define M_PI 3.14159265358979323846
-#endif
-
-int Shape::get_nshapes() {
- return nshapes;
-}
+#define M_PI 3.14159265358979323846
/* Move the shape to a new location */
void Shape::move(double dx, double dy) {
@@ -18,22 +11,18 @@ void Shape::move(double dx, double dy) {
int Shape::nshapes = 0;
-void Circle::set_radius( double r ) {
- radius = r;
-}
-
-double Circle::area(void) {
+double Circle::area() {
return M_PI*radius*radius;
}
-double Circle::perimeter(void) {
+double Circle::perimeter() {
return 2*M_PI*radius;
}
-double Square::area(void) {
+double Square::area() {
return width*width;
}
-double Square::perimeter(void) {
+double Square::perimeter() {
return 4*width;
}
diff --git a/Examples/php/class/example.h b/Examples/php/class/example.h
index 02eaf7232..0dff185b2 100644
--- a/Examples/php/class/example.h
+++ b/Examples/php/class/example.h
@@ -10,10 +10,9 @@ public:
}
double x, y;
void move(double dx, double dy);
- virtual double area(void) = 0;
- virtual double perimeter(void) = 0;
+ virtual double area() = 0;
+ virtual double perimeter() = 0;
static int nshapes;
- static int get_nshapes();
};
class Circle : public Shape {
@@ -21,10 +20,8 @@ private:
double radius;
public:
Circle(double r) : radius(r) { }
- ~Circle() { }
- void set_radius( double r );
- virtual double area(void);
- virtual double perimeter(void);
+ virtual double area();
+ virtual double perimeter();
};
class Square : public Shape {
@@ -32,7 +29,6 @@ private:
double width;
public:
Square(double w) : width(w) { }
- ~Square() { }
- virtual double area(void);
- virtual double perimeter(void);
+ virtual double area();
+ virtual double perimeter();
};
diff --git a/Examples/php/class/runme.php b/Examples/php/class/runme.php
index 12b686052..99c253b46 100644
--- a/Examples/php/class/runme.php
+++ b/Examples/php/class/runme.php
@@ -14,7 +14,7 @@ print " Created square\n";
# ----- Access a static member -----
-print "\nA total of " . Shape::get_nshapes() . " shapes were created\n";
+print "\nA total of " . Shape::nshapes() . " shapes were created\n";
# ----- Member data access -----
@@ -54,7 +54,7 @@ $s = NULL;
# the square.
$o = NULL;
-print Shape::get_nshapes() . " shapes remain\n";
+print Shape::nshapes() . " shapes remain\n";
print "Goodbye\n";
?>
diff --git a/Examples/python/class/example.cxx b/Examples/python/class/example.cxx
index 1e8e203dd..046304519 100644
--- a/Examples/python/class/example.cxx
+++ b/Examples/python/class/example.cxx
@@ -1,4 +1,4 @@
-/* File : example.c */
+/* File : example.cxx */
#include "example.h"
#define M_PI 3.14159265358979323846
@@ -11,18 +11,18 @@ void Shape::move(double dx, double dy) {
int Shape::nshapes = 0;
-double Circle::area(void) {
+double Circle::area() {
return M_PI*radius*radius;
}
-double Circle::perimeter(void) {
+double Circle::perimeter() {
return 2*M_PI*radius;
}
-double Square::area(void) {
+double Square::area() {
return width*width;
}
-double Square::perimeter(void) {
+double Square::perimeter() {
return 4*width;
}
diff --git a/Examples/python/class/example.h b/Examples/python/class/example.h
index 46d901361..0dff185b2 100644
--- a/Examples/python/class/example.h
+++ b/Examples/python/class/example.h
@@ -7,11 +7,11 @@ public:
}
virtual ~Shape() {
nshapes--;
- };
- double x, y;
+ }
+ double x, y;
void move(double dx, double dy);
- virtual double area(void) = 0;
- virtual double perimeter(void) = 0;
+ virtual double area() = 0;
+ virtual double perimeter() = 0;
static int nshapes;
};
@@ -19,21 +19,16 @@ class Circle : public Shape {
private:
double radius;
public:
- Circle(double r) : radius(r) { };
- virtual double area(void);
- virtual double perimeter(void);
+ Circle(double r) : radius(r) { }
+ virtual double area();
+ virtual double perimeter();
};
class Square : public Shape {
private:
double width;
public:
- Square(double w) : width(w) { };
- virtual double area(void);
- virtual double perimeter(void);
+ Square(double w) : width(w) { }
+ virtual double area();
+ virtual double perimeter();
};
-
-
-
-
-
diff --git a/Examples/python/class/index.html b/Examples/python/class/index.html
index 12c5eded1..2e1baa395 100644
--- a/Examples/python/class/index.html
+++ b/Examples/python/class/index.html
@@ -12,9 +12,7 @@
Wrapping a simple C++ class
-This example illustrates the most primitive form of C++ class wrapping performed
-by SWIG. In this case, C++ classes are simply transformed into a collection of
-C-style functions that provide access to class members.
+This example illustrates wrapping a simple C++ class to give a Python class.
The C++ Code
@@ -32,8 +30,8 @@ public:
}
virtual ~Shape() {
nshapes--;
- };
- double x, y;
+ }
+ double x, y;
void move(double dx, double dy);
virtual double area() = 0;
virtual double perimeter() = 0;
@@ -44,7 +42,7 @@ class Circle : public Shape {
private:
double radius;
public:
- Circle(double r) : radius(r) { };
+ Circle(double r) : radius(r) { }
virtual double area();
virtual double perimeter();
};
@@ -53,7 +51,7 @@ class Square : public Shape {
private:
double width;
public:
- Square(double w) : width(w) { };
+ Square(double w) : width(w) { }
virtual double area();
virtual double perimeter();
};
@@ -102,51 +100,34 @@ c = example.new_Circle(10.0)
-
- To access member data, a pair of accessor functions are used.
+
- Member variables of the C++ class are wrapped as attributes of the Python class.
For example:
-example.Shape_x_set(c,15) # Set member data
-x = example.Shape_x_get(c) # Get member data
-
-
-
-Note: when accessing member data, the name of the class in which
-the member data was must be used. In this case, Shape_x_get()
-and Shape_x_set() are used since 'x' was defined in Shape.
-
-
-
- To invoke a member function, you simply do this
-
-
-
-print "The area is ", example.Shape_area(c)
+c.x = 15 # Set member data
+x = c.x # Get member data
-
- Type checking knows about the inheritance structure of C++. For example:
+
- Member function are invoked as you would expect:
-example.Shape_area(c) # Works (c is a Shape)
-example.Circle_area(c) # Works (c is a Circle)
-example.Square_area(c) # Fails (c is definitely not a Square)
+print "The area is ", c.area()
-
- To invoke a destructor, simply do this
+
- To invoke a destructor, simply call
del on the object:
-example.delete_Shape(c) # Deletes a shape
+del c # Deletes a shape
-(Note: destructors are currently not inherited. This might change later).
-
- Static member variables are wrapped as C global variables. For example:
@@ -162,52 +143,12 @@ example.cvar.Shapes_nshapes = 13 # Set a static data member
General Comments