ENH: Here is test for swig module
This commit is contained in:
parent
257daa4635
commit
a828368232
|
@ -0,0 +1,45 @@
|
||||||
|
SET(language "python")
|
||||||
|
|
||||||
|
|
||||||
|
PROJECT(example_${language}_class)
|
||||||
|
|
||||||
|
FIND_PACKAGE(SWIG)
|
||||||
|
IF(SWIG_FOUND)
|
||||||
|
INCLUDE(${SWIG_USE_FILE})
|
||||||
|
|
||||||
|
IF(${language} MATCHES python)
|
||||||
|
FIND_PACKAGE(PythonLibs)
|
||||||
|
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
|
||||||
|
ENDIF(${language} MATCHES python)
|
||||||
|
IF(${language} MATCHES perl)
|
||||||
|
FIND_PACKAGE(PerlLibs)
|
||||||
|
INCLUDE_DIRECTORIES(${PERL_INCLUDE_PATH})
|
||||||
|
ADD_DEFINITIONS(${PERL_EXTRA_C_FLAGS})
|
||||||
|
ENDIF(${language} MATCHES perl)
|
||||||
|
IF(${language} MATCHES tcl)
|
||||||
|
FIND_PACKAGE(TCL)
|
||||||
|
INCLUDE_DIRECTORIES(${TCL_INCLUDE_PATH})
|
||||||
|
ENDIF(${language} MATCHES tcl)
|
||||||
|
IF(${language} MATCHES ruby)
|
||||||
|
FIND_PACKAGE(Ruby)
|
||||||
|
INCLUDE_DIRECTORIES(${RUBY_INCLUDE_PATH})
|
||||||
|
ENDIF(${language} MATCHES ruby)
|
||||||
|
IF(${language} MATCHES php4)
|
||||||
|
FIND_PACKAGE(PHP4)
|
||||||
|
INCLUDE_DIRECTORIES(${PHP4_INCLUDE_PATH})
|
||||||
|
ENDIF(${language} MATCHES php4)
|
||||||
|
IF(${language} MATCHES pike)
|
||||||
|
FIND_PACKAGE(Pike)
|
||||||
|
INCLUDE_DIRECTORIES(${PIKE_INCLUDE_PATH})
|
||||||
|
ENDIF(${language} MATCHES pike)
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
|
SET(CMAKE_SWIG_FLAGS "")
|
||||||
|
|
||||||
|
SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES CPLUSPLUS ON)
|
||||||
|
SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES SWIG_FLAGS "-includeall")
|
||||||
|
SWIG_ADD_MODULE(example "${language}"
|
||||||
|
example.i example.cxx)
|
||||||
|
SWIG_LINK_LIBRARIES(example ${PYTHON_LIBRARY})
|
||||||
|
ENDIF(SWIG_FOUND)
|
|
@ -0,0 +1,28 @@
|
||||||
|
/* File : example.c */
|
||||||
|
|
||||||
|
#include "example.h"
|
||||||
|
#define M_PI 3.14159265358979323846
|
||||||
|
|
||||||
|
/* Move the shape to a new location */
|
||||||
|
void Shape::move(double dx, double dy) {
|
||||||
|
x += dx;
|
||||||
|
y += dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Shape::nshapes = 0;
|
||||||
|
|
||||||
|
double Circle::area(void) {
|
||||||
|
return M_PI*radius*radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Circle::perimeter(void) {
|
||||||
|
return 2*M_PI*radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Square::area(void) {
|
||||||
|
return width*width;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Square::perimeter(void) {
|
||||||
|
return 4*width;
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/* File : example.h */
|
||||||
|
|
||||||
|
class Shape {
|
||||||
|
public:
|
||||||
|
Shape() {
|
||||||
|
nshapes++;
|
||||||
|
}
|
||||||
|
virtual ~Shape() {
|
||||||
|
nshapes--;
|
||||||
|
};
|
||||||
|
double x, y;
|
||||||
|
void move(double dx, double dy);
|
||||||
|
virtual double area(void) = 0;
|
||||||
|
virtual double perimeter(void) = 0;
|
||||||
|
static int nshapes;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Circle : public Shape {
|
||||||
|
private:
|
||||||
|
double radius;
|
||||||
|
public:
|
||||||
|
Circle(double r) : radius(r) { };
|
||||||
|
virtual double area(void);
|
||||||
|
virtual double perimeter(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
class Square : public Shape {
|
||||||
|
private:
|
||||||
|
double width;
|
||||||
|
public:
|
||||||
|
Square(double w) : width(w) { };
|
||||||
|
virtual double area(void);
|
||||||
|
virtual double perimeter(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
/* File : example.i */
|
||||||
|
%module example
|
||||||
|
|
||||||
|
%{
|
||||||
|
#include "example.h"
|
||||||
|
%}
|
||||||
|
|
||||||
|
/* Let's just grab the original header file here */
|
||||||
|
%include "example.h"
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
# This file illustrates the low-level C++ interface
|
||||||
|
# created by SWIG. In this case, all of our C++ classes
|
||||||
|
# get converted into function calls.
|
||||||
|
|
||||||
|
require("example.php");
|
||||||
|
|
||||||
|
# ----- Object creation -----
|
||||||
|
|
||||||
|
print "Creating some objects:\n";
|
||||||
|
$c = new_Circle(10);
|
||||||
|
print " Created circle $c\n";
|
||||||
|
$s = new_Square(10);
|
||||||
|
print " Created square $s\n";
|
||||||
|
|
||||||
|
# ----- Access a static member -----
|
||||||
|
|
||||||
|
print "\nA total of " . nshapes() . " shapes were created\n";
|
||||||
|
|
||||||
|
# ----- Member data access -----
|
||||||
|
|
||||||
|
# Set the location of the object.
|
||||||
|
# Note: methods in the base class Shape are used since
|
||||||
|
# x and y are defined there.
|
||||||
|
|
||||||
|
Shape_x_set($c, 20);
|
||||||
|
Shape_y_set($c, 30);
|
||||||
|
Shape_x_set($s,-10);
|
||||||
|
Shape_y_set($s,5);
|
||||||
|
|
||||||
|
print "\nHere is their current position:\n";
|
||||||
|
print " Circle = (" . Shape_x_get($c) . "," . Shape_y_get($c) . ")\n";
|
||||||
|
print " Square = (" . Shape_x_get($s) . "," . Shape_y_get($s) . ")\n";
|
||||||
|
|
||||||
|
# ----- Call some methods -----
|
||||||
|
|
||||||
|
print "\nHere are some properties of the shapes:\n";
|
||||||
|
foreach (array($c,$s) as $o) {
|
||||||
|
print " $o\n";
|
||||||
|
print " area = " . Shape_area($o) . "\n";
|
||||||
|
print " perimeter = " . Shape_perimeter($o) . "\n";
|
||||||
|
}
|
||||||
|
# Notice how the Shape_area() and Shape_perimeter() functions really
|
||||||
|
# invoke the appropriate virtual method on each object.
|
||||||
|
|
||||||
|
# ----- Delete everything -----
|
||||||
|
|
||||||
|
print "\nGuess I'll clean up now\n";
|
||||||
|
|
||||||
|
# Note: this invokes the virtual destructor
|
||||||
|
delete_Shape($c);
|
||||||
|
delete_Shape($s);
|
||||||
|
|
||||||
|
print nshapes() . " shapes remain\n";
|
||||||
|
print "Goodbye\n";
|
||||||
|
|
||||||
|
?>
|
|
@ -0,0 +1,53 @@
|
||||||
|
import .example;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// ----- Object creation -----
|
||||||
|
|
||||||
|
write("Creating some objects:\n");
|
||||||
|
Circle c = Circle(10.0);
|
||||||
|
write(" Created circle.\n");
|
||||||
|
Square s = Square(10.0);
|
||||||
|
write(" Created square.\n");
|
||||||
|
|
||||||
|
// ----- Access a static member -----
|
||||||
|
|
||||||
|
write("\nA total of " + Shape_nshapes_get() + " shapes were created\n");
|
||||||
|
|
||||||
|
// ----- Member data access -----
|
||||||
|
|
||||||
|
// Set the location of the object
|
||||||
|
|
||||||
|
c->x_set(20.0);
|
||||||
|
c->y_set(30.0);
|
||||||
|
|
||||||
|
s->x_set(-10.0);
|
||||||
|
s->y_set(5.0);
|
||||||
|
|
||||||
|
write("\nHere is their current position:\n");
|
||||||
|
write(" Circle = (%f, %f)\n", c->x_get(), c->y_get());
|
||||||
|
write(" Square = (%f, %f)\n", s->x_get(), s->y_get());
|
||||||
|
|
||||||
|
// ----- Call some methods -----
|
||||||
|
|
||||||
|
write("\nHere are some properties of the shapes:\n");
|
||||||
|
write(" The circle:\n");
|
||||||
|
write(" area = %f.\n", c->area());
|
||||||
|
write(" perimeter = %f.\n", c->perimeter());
|
||||||
|
write(" The square:\n");
|
||||||
|
write(" area = %f.\n", s->area());
|
||||||
|
write(" perimeter = %f.\n", s->perimeter());
|
||||||
|
|
||||||
|
write("\nGuess I'll clean up now\n");
|
||||||
|
|
||||||
|
/* See if we can force 's' to be garbage-collected */
|
||||||
|
s = 0;
|
||||||
|
|
||||||
|
/* Now we should be down to only 1 shape */
|
||||||
|
write("%d shapes remain\n", Shape_nshapes_get());
|
||||||
|
|
||||||
|
/* Done */
|
||||||
|
write("Goodbye\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
# file: runme.pl
|
||||||
|
|
||||||
|
# This file illustrates the low-level C++ interface
|
||||||
|
# created by SWIG. In this case, all of our C++ classes
|
||||||
|
# get converted into function calls.
|
||||||
|
|
||||||
|
use example;
|
||||||
|
|
||||||
|
# ----- Object creation -----
|
||||||
|
|
||||||
|
print "Creating some objects:\n";
|
||||||
|
$c = examplec::new_Circle(10);
|
||||||
|
print " Created circle $c\n";
|
||||||
|
$s = examplec::new_Square(10);
|
||||||
|
print " Created square $s\n";
|
||||||
|
|
||||||
|
# ----- Access a static member -----
|
||||||
|
|
||||||
|
print "\nA total of $examplec::Shape_nshapes shapes were created\n";
|
||||||
|
|
||||||
|
# ----- Member data access -----
|
||||||
|
|
||||||
|
# Set the location of the object.
|
||||||
|
# Note: methods in the base class Shape are used since
|
||||||
|
# x and y are defined there.
|
||||||
|
|
||||||
|
examplec::Shape_x_set($c, 20);
|
||||||
|
examplec::Shape_y_set($c, 30);
|
||||||
|
examplec::Shape_x_set($s,-10);
|
||||||
|
examplec::Shape_y_set($s,5);
|
||||||
|
|
||||||
|
print "\nHere is their current position:\n";
|
||||||
|
print " Circle = (",examplec::Shape_x_get($c),",", examplec::Shape_y_get($c),")\n";
|
||||||
|
print " Square = (",examplec::Shape_x_get($s),",", examplec::Shape_y_get($s),")\n";
|
||||||
|
|
||||||
|
# ----- Call some methods -----
|
||||||
|
|
||||||
|
print "\nHere are some properties of the shapes:\n";
|
||||||
|
foreach $o ($c,$s) {
|
||||||
|
print " $o\n";
|
||||||
|
print " area = ", examplec::Shape_area($o), "\n";
|
||||||
|
print " perimeter = ", examplec::Shape_perimeter($o), "\n";
|
||||||
|
}
|
||||||
|
# Notice how the Shape_area() and Shape_perimeter() functions really
|
||||||
|
# invoke the appropriate virtual method on each object.
|
||||||
|
|
||||||
|
# ----- Delete everything -----
|
||||||
|
|
||||||
|
print "\nGuess I'll clean up now\n";
|
||||||
|
|
||||||
|
# Note: this invokes the virtual destructor
|
||||||
|
examplec::delete_Shape($c);
|
||||||
|
examplec::delete_Shape($s);
|
||||||
|
|
||||||
|
print $examplec::Shape_nshapes," shapes remain\n";
|
||||||
|
print "Goodbye\n";
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
# file: runme.py
|
||||||
|
|
||||||
|
# This file illustrates the shadow-class C++ interface generated
|
||||||
|
# by SWIG.
|
||||||
|
|
||||||
|
import example
|
||||||
|
|
||||||
|
# ----- Object creation -----
|
||||||
|
|
||||||
|
print "Creating some objects:"
|
||||||
|
c = example.Circle(10)
|
||||||
|
print " Created circle", c
|
||||||
|
s = example.Square(10)
|
||||||
|
print " Created square", s
|
||||||
|
|
||||||
|
# ----- Access a static member -----
|
||||||
|
|
||||||
|
print "\nA total of", example.cvar.Shape_nshapes,"shapes were created"
|
||||||
|
|
||||||
|
# ----- Member data access -----
|
||||||
|
|
||||||
|
# Set the location of the object
|
||||||
|
|
||||||
|
c.x = 20
|
||||||
|
c.y = 30
|
||||||
|
|
||||||
|
s.x = -10
|
||||||
|
s.y = 5
|
||||||
|
|
||||||
|
print "\nHere is their current position:"
|
||||||
|
print " Circle = (%f, %f)" % (c.x,c.y)
|
||||||
|
print " Square = (%f, %f)" % (s.x,s.y)
|
||||||
|
|
||||||
|
# ----- Call some methods -----
|
||||||
|
|
||||||
|
print "\nHere are some properties of the shapes:"
|
||||||
|
for o in [c,s]:
|
||||||
|
print " ", o
|
||||||
|
print " area = ", o.area()
|
||||||
|
print " perimeter = ", o.perimeter()
|
||||||
|
|
||||||
|
print "\nGuess I'll clean up now"
|
||||||
|
|
||||||
|
# Note: this invokes the virtual destructor
|
||||||
|
del c
|
||||||
|
del s
|
||||||
|
|
||||||
|
s = 3
|
||||||
|
print example.cvar.Shape_nshapes,"shapes remain"
|
||||||
|
print "Goodbye"
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
# file: runme.rb
|
||||||
|
|
||||||
|
# This file illustrates the C++ interface created by SWIG.
|
||||||
|
# All of our C++ classes get converted into Ruby classes.
|
||||||
|
|
||||||
|
require 'example'
|
||||||
|
|
||||||
|
# ----- Object creation -----
|
||||||
|
|
||||||
|
print "Creating some objects:\n"
|
||||||
|
c = Example::Circle.new(10)
|
||||||
|
print " Created circle #{c}\n"
|
||||||
|
s = Example::Square.new(10)
|
||||||
|
print " Created square #{s}\n"
|
||||||
|
|
||||||
|
# ----- Access a static member -----
|
||||||
|
|
||||||
|
print "\nA total of #{Example::Shape.nshapes} shapes were created\n"
|
||||||
|
|
||||||
|
# ----- Member data access -----
|
||||||
|
|
||||||
|
# Set the location of the object
|
||||||
|
|
||||||
|
# Notice how we can do this using functions specific to
|
||||||
|
# the 'Circle' class.
|
||||||
|
c.x = 20
|
||||||
|
c.y = 30
|
||||||
|
|
||||||
|
# Now use the same functions in the base class
|
||||||
|
s.x = -10
|
||||||
|
s.y = 5
|
||||||
|
|
||||||
|
print "\nHere is their current position:\n"
|
||||||
|
print " Circle = (", c.x, ",", c.y, ")\n"
|
||||||
|
print " Square = (", s.x, ",", s.y, ")\n"
|
||||||
|
|
||||||
|
# ----- Call some methods -----
|
||||||
|
|
||||||
|
print "\nHere are some properties of the shapes:\n"
|
||||||
|
for o in [c, s]
|
||||||
|
print " #{o}\n"
|
||||||
|
print " area = ", o.area, "\n"
|
||||||
|
print " perimeter = ", o.perimeter, "\n"
|
||||||
|
end
|
||||||
|
# Notice how the Shape#area() and Shape#perimeter() functions really
|
||||||
|
# invoke the appropriate virtual method on each object.
|
||||||
|
|
||||||
|
print "\n", Example::Shape.nshapes," shapes remain\n"
|
||||||
|
print "Goodbye\n"
|
|
@ -0,0 +1,50 @@
|
||||||
|
# file: runme.tcl
|
||||||
|
|
||||||
|
# This file illustrates the high level C++ interface.
|
||||||
|
# In this case C++ classes work kind of like Tk widgets
|
||||||
|
|
||||||
|
catch { load ./example[info sharedlibextension] example}
|
||||||
|
|
||||||
|
# ----- Object creation -----
|
||||||
|
|
||||||
|
puts "Creating some objects:"
|
||||||
|
Circle c 10
|
||||||
|
puts " Created circle [c cget -this]"
|
||||||
|
Square s 10
|
||||||
|
puts " Created square [s cget -this]"
|
||||||
|
|
||||||
|
# ----- Access a static member -----
|
||||||
|
|
||||||
|
puts "\nA total of $Shape_nshapes shapes were created"
|
||||||
|
|
||||||
|
# ----- Member data access -----
|
||||||
|
|
||||||
|
# Set the location of the object
|
||||||
|
|
||||||
|
c configure -x 20 -y 30
|
||||||
|
s configure -x -10 -y 5
|
||||||
|
|
||||||
|
puts "\nHere is their current position:"
|
||||||
|
puts " Circle = ([c cget -x], [c cget -y])"
|
||||||
|
puts " Square = ([s cget -x], [s cget -y])"
|
||||||
|
|
||||||
|
# ----- Call some methods -----
|
||||||
|
|
||||||
|
puts "\nHere are some properties of the shapes:"
|
||||||
|
foreach o "c s" {
|
||||||
|
puts " [$o cget -this]"
|
||||||
|
puts " area = [$o area]"
|
||||||
|
puts " perimeter = [$o perimeter]"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----- Delete everything -----
|
||||||
|
|
||||||
|
puts "\nGuess I'll clean up now"
|
||||||
|
|
||||||
|
# Note: this invokes the virtual destructor
|
||||||
|
rename c ""
|
||||||
|
rename s ""
|
||||||
|
|
||||||
|
puts "$Shape_nshapes shapes remain"
|
||||||
|
puts "Goodbye"
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
# file: runme2.tcl
|
||||||
|
|
||||||
|
# This file illustrates the low-level C++ interface
|
||||||
|
# created by SWIG. In this case, all of our C++ classes
|
||||||
|
# get converted into function calls.
|
||||||
|
|
||||||
|
catch { load ./example[info sharedlibextension] example}
|
||||||
|
|
||||||
|
# ----- Object creation -----
|
||||||
|
|
||||||
|
puts "Creating some objects:"
|
||||||
|
set c [new_Circle 10]
|
||||||
|
puts " Created circle $c"
|
||||||
|
set s [new_Square 10]
|
||||||
|
puts " Created square $s"
|
||||||
|
|
||||||
|
# ----- Access a static member -----
|
||||||
|
|
||||||
|
puts "\nA total of $Shape_nshapes shapes were created"
|
||||||
|
|
||||||
|
# ----- Member data access -----
|
||||||
|
|
||||||
|
# Set the location of the object
|
||||||
|
# Note: the base class must be used since that's where x and y
|
||||||
|
# were declared.
|
||||||
|
|
||||||
|
Shape_x_set $c 20
|
||||||
|
Shape_y_set $c 30
|
||||||
|
Shape_x_set $s -10
|
||||||
|
Shape_y_set $s 5
|
||||||
|
|
||||||
|
puts "\nHere is their current position:"
|
||||||
|
puts " Circle = ([Shape_x_get $c], [Shape_y_get $c])"
|
||||||
|
puts " Square = ([Shape_x_get $s], [Shape_y_get $s])"
|
||||||
|
|
||||||
|
# ----- Call some methods -----
|
||||||
|
|
||||||
|
puts "\nHere are some properties of the shapes:"
|
||||||
|
foreach o "$c $s" {
|
||||||
|
puts " $o"
|
||||||
|
puts " area = [Shape_area $o]"
|
||||||
|
puts " perimeter = [Shape_perimeter $o]"
|
||||||
|
}
|
||||||
|
# Notice how the Shape_area() and Shape_perimeter() functions really
|
||||||
|
# invoke the appropriate virtual method on each object.
|
||||||
|
|
||||||
|
# ----- Try to cause a type error -----
|
||||||
|
|
||||||
|
puts "\nI'm going to try and break the type system"
|
||||||
|
|
||||||
|
if { [catch {
|
||||||
|
# Bad script!
|
||||||
|
Square_area $c # Try to invoke Square method on a Circle
|
||||||
|
puts " Bad bad SWIG!"
|
||||||
|
|
||||||
|
}]} {
|
||||||
|
puts " Well, it didn't work. Good SWIG."
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----- Delete everything -----
|
||||||
|
|
||||||
|
puts "\nGuess I'll clean up now"
|
||||||
|
|
||||||
|
# Note: this invokes the virtual destructor
|
||||||
|
delete_Shape $c
|
||||||
|
delete_Shape $s
|
||||||
|
|
||||||
|
puts "$Shape_nshapes shapes remain"
|
||||||
|
puts "Goodbye"
|
||||||
|
|
Loading…
Reference in New Issue