mirror of
https://github.com/boostorg/python.git
synced 2026-01-24 06:02:14 +00:00
This commit was manufactured by cvs2svn to create tag
'Version_1_21_2'. [SVN r9983]
This commit is contained in:
24
example/README
Normal file
24
example/README
Normal file
@@ -0,0 +1,24 @@
|
||||
To get started with the Boost Python Library, use the examples
|
||||
getting_started1.cpp and getting_started2.cpp.
|
||||
|
||||
Examples for providing pickle support can be found in:
|
||||
pickle1.cpp
|
||||
pickle2.cpp
|
||||
pickle3.cpp
|
||||
See also: libs/python/doc/pickle.html
|
||||
|
||||
Other advanced concepts are introduced by:
|
||||
abstract.cpp
|
||||
simple_vector.cpp
|
||||
do_it_yourself_converters.cpp
|
||||
|
||||
Examples for the cross-module support are provided by:
|
||||
noncopyable_export.cpp
|
||||
noncopyable_import.cpp
|
||||
dvect.cpp
|
||||
ivect.cpp
|
||||
See also: libs/python/doc/cross_module.html
|
||||
|
||||
The files example1.cpp and rwgk1.cpp are obsolete. They are only
|
||||
included because the Visual Studio project in the build directory still
|
||||
refers to them.
|
||||
32
example/abstract.cpp
Normal file
32
example/abstract.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
// Example by Ullrich Koethe
|
||||
#include "boost/python/class_builder.hpp"
|
||||
#include <string>
|
||||
|
||||
struct Abstract
|
||||
{
|
||||
virtual std::string test() = 0;
|
||||
};
|
||||
|
||||
struct Abstract_callback: Abstract
|
||||
{
|
||||
Abstract_callback(PyObject * self)
|
||||
: m_self(self)
|
||||
{}
|
||||
|
||||
std::string test()
|
||||
{
|
||||
return boost::python::callback<std::string>::call_method(m_self, "test");
|
||||
}
|
||||
|
||||
PyObject * m_self;
|
||||
};
|
||||
|
||||
BOOST_PYTHON_MODULE_INIT(abstract)
|
||||
{
|
||||
boost::python::module_builder a("abstract");
|
||||
|
||||
boost::python::class_builder<Abstract, Abstract_callback>
|
||||
a_class(a, "Abstract");
|
||||
a_class.def(boost::python::constructor<>()); // wrap a constructor
|
||||
a_class.def(&Abstract::test, "test");
|
||||
}
|
||||
128
example/do_it_yourself_converters.cpp
Normal file
128
example/do_it_yourself_converters.cpp
Normal file
@@ -0,0 +1,128 @@
|
||||
// Example by Ralf W. Grosse-Kunstleve
|
||||
/*
|
||||
|
||||
This example shows how to convert a class from and to native
|
||||
Python objects, such as tuples.
|
||||
|
||||
We do not want to expose the helper class MillerIndex as an
|
||||
Extension Class. However, in order to simplify the wrapper code,
|
||||
we want to define from_python() and to_python() functions for
|
||||
class MillerIndex.
|
||||
|
||||
Consider the alternatives:
|
||||
|
||||
- Expose MillerIndex as an Extension Class.
|
||||
We need a constructor MillerIndex(python::tuple).
|
||||
Python function calls become more complex:
|
||||
foo(MillerIndex((1,2,3)) instead of foo((1,2,3))
|
||||
We need a method such as MillerIndex().as_tuple().
|
||||
|
||||
- Define a wrapper function for each function that we
|
||||
want to expose, e.g.:
|
||||
void add(const IndexingSet& ixset, const python::tuple PyMIx)
|
||||
|
||||
The first alternative introduces a new type that the user has to
|
||||
deal with. Other modules using Miller indices might organize them in
|
||||
different ways, for example to increase runtime efficiency for
|
||||
important procedures. This means, the user has to know how to
|
||||
convert between the different kinds of Miller index representations.
|
||||
This can quickly become a nuisance. Relying on native Python data
|
||||
structures minimizes the number of special types the user has to
|
||||
learn and convert. Of course, this argument is only valid for
|
||||
small and relatively simply classes.
|
||||
|
||||
If there are many member functions with MillerIndex arguments, the
|
||||
second alternative is impractical, and concentrating the conversion
|
||||
mechanism in one central place is essential for code
|
||||
maintainability. An added benefit is that more convenient (smarter)
|
||||
conversion functions can be provided without cluttering the rest of
|
||||
the wrapper code.
|
||||
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <boost/python/class_builder.hpp>
|
||||
namespace python = boost::python;
|
||||
|
||||
namespace { // Avoid cluttering the global namespace.
|
||||
|
||||
// The helper class.
|
||||
//
|
||||
class MillerIndex {
|
||||
public:
|
||||
int v[3];
|
||||
};
|
||||
|
||||
// The main class. Imagine that there are MANY member functions
|
||||
// like add() and get().
|
||||
//
|
||||
class IndexingSet {
|
||||
private:
|
||||
std::vector<MillerIndex> VMIx;
|
||||
public:
|
||||
void add(const MillerIndex& MIx) { VMIx.push_back(MIx); }
|
||||
MillerIndex get(std::size_t i) const { return VMIx[i]; }
|
||||
};
|
||||
}
|
||||
|
||||
BOOST_PYTHON_BEGIN_CONVERSION_NAMESPACE
|
||||
|
||||
// Convert a Python tuple to a MillerIndex object.
|
||||
//
|
||||
MillerIndex from_python(PyObject* p, python::type<const MillerIndex&>)
|
||||
{
|
||||
python::tuple tup
|
||||
= python::tuple(python::ref(p, python::ref::increment_count));
|
||||
if (tup.size() != 3) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"expecting exactly 3 values in tuple.");
|
||||
throw python::error_already_set();
|
||||
}
|
||||
MillerIndex result;
|
||||
for (int i = 0; i < 3; i++)
|
||||
result.v[i] = from_python(tup[i].get(), python::type<int>());
|
||||
return result;
|
||||
}
|
||||
|
||||
// Similar conversion for MillerIndex objects passed by value.
|
||||
// Not actually used, but included to show the principle.
|
||||
//
|
||||
MillerIndex from_python(PyObject* p, python::type<MillerIndex>)
|
||||
{
|
||||
return from_python(p, python::type<const MillerIndex&>());
|
||||
}
|
||||
|
||||
// Convert a MillerIndex object to a Python tuple.
|
||||
//
|
||||
PyObject* to_python(const MillerIndex& hkl)
|
||||
{
|
||||
python::tuple result(3);
|
||||
for (int i = 0; i < 3; i++)
|
||||
result.set_item(i, python::ref(to_python(hkl.v[i])));
|
||||
return result.reference().release();
|
||||
}
|
||||
|
||||
BOOST_PYTHON_END_CONVERSION_NAMESPACE
|
||||
|
||||
BOOST_PYTHON_MODULE_INIT(do_it_yourself_converters)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create an object representing this extension module.
|
||||
python::module_builder this_module("do_it_yourself_converters");
|
||||
|
||||
// Create the Python type object for our extension class.
|
||||
python::class_builder<IndexingSet> ixset_class(this_module, "IndexingSet");
|
||||
|
||||
// Add the __init__ function.
|
||||
ixset_class.def(python::constructor<>());
|
||||
// Add the member functions.
|
||||
ixset_class.def(&IndexingSet::add, "add");
|
||||
ixset_class.def(&IndexingSet::get, "get");
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
python::handle_exception(); // Deal with the exception for Python
|
||||
}
|
||||
}
|
||||
45
example/dvect.cpp
Normal file
45
example/dvect.cpp
Normal file
@@ -0,0 +1,45 @@
|
||||
// Example by Ralf W. Grosse-Kunstleve
|
||||
// See root/libs/python/doc/cross_module.html for an introduction.
|
||||
|
||||
#include "dvect.h"
|
||||
#include "ivect.h"
|
||||
#include <boost/python/cross_module.hpp>
|
||||
namespace python = boost::python;
|
||||
|
||||
namespace {
|
||||
|
||||
# include "dvect_conversions.cpp"
|
||||
# include "ivect_conversions.cpp"
|
||||
|
||||
vects::ivect dvect_as_ivect(const vects::dvect& dv)
|
||||
{
|
||||
vects::ivect iv(dv.size());
|
||||
vects::ivect::iterator iviter = iv.begin();
|
||||
for (int i = 0; i < dv.size(); i++) iviter[i] = static_cast<int>(dv[i]);
|
||||
return iv;
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_PYTHON_MODULE_INIT(dvect)
|
||||
{
|
||||
try
|
||||
{
|
||||
python::module_builder this_module("dvect");
|
||||
|
||||
python::class_builder<vects::dvect> dvect_class(this_module, "dvect");
|
||||
python::export_converters(dvect_class);
|
||||
|
||||
python::import_converters<vects::ivect> ivect_converters("ivect", "ivect");
|
||||
|
||||
dvect_class.def(python::constructor<python::tuple>());
|
||||
dvect_class.def(&vects::dvect::as_tuple, "as_tuple");
|
||||
dvect_class.def(dvect_as_ivect, "as_ivect");
|
||||
|
||||
# include "dvect_defs.cpp"
|
||||
# include "ivect_defs.cpp"
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
python::handle_exception(); // Deal with the exception for Python
|
||||
}
|
||||
}
|
||||
32
example/dvect.h
Normal file
32
example/dvect.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#ifndef DVECT_H
|
||||
#define DVECT_H
|
||||
|
||||
#include <vector>
|
||||
#include <boost/python/class_builder.hpp>
|
||||
|
||||
namespace vects {
|
||||
|
||||
struct dvect : public std::vector<double>
|
||||
{
|
||||
dvect() : std::vector<double>() {}
|
||||
dvect(size_t n) : std::vector<double>(n) {}
|
||||
dvect(boost::python::tuple tuple) : std::vector<double>(tuple.size())
|
||||
{
|
||||
std::vector<double>::iterator v_it = begin();
|
||||
for (int i = 0; i < tuple.size(); i++)
|
||||
v_it[i] = BOOST_PYTHON_CONVERSION::from_python(tuple[i].get(),
|
||||
boost::python::type<double>());
|
||||
}
|
||||
|
||||
boost::python::tuple as_tuple() const
|
||||
{
|
||||
boost::python::tuple t(size());
|
||||
for (int i = 0; i < size(); i++)
|
||||
t.set_item(i,
|
||||
boost::python::ref(BOOST_PYTHON_CONVERSION::to_python((*this)[i])));
|
||||
return t;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#endif // DVECT_H
|
||||
51
example/dvect_conversions.cpp
Normal file
51
example/dvect_conversions.cpp
Normal file
@@ -0,0 +1,51 @@
|
||||
// basics first: const reference converters
|
||||
boost::python::tuple const_dvect_reference_as_tuple(const vects::dvect& dv)
|
||||
{
|
||||
return dv.as_tuple();
|
||||
}
|
||||
|
||||
// to_python smart pointer conversions
|
||||
std::auto_ptr<vects::dvect> dvect_as_auto_ptr(const vects::dvect& dv)
|
||||
{
|
||||
return std::auto_ptr<vects::dvect>(new vects::dvect(dv));
|
||||
}
|
||||
boost::shared_ptr<vects::dvect> dvect_as_shared_ptr(const vects::dvect& dv)
|
||||
{
|
||||
return boost::shared_ptr<vects::dvect>(new vects::dvect(dv));
|
||||
}
|
||||
|
||||
// smart pointers passed by value
|
||||
boost::python::ref auto_ptr_value_dvect_as_tuple(std::auto_ptr<vects::dvect> dv)
|
||||
{
|
||||
if (dv.get() == 0) return boost::python::ref(Py_None, boost::python::ref::increment_count);
|
||||
return dv->as_tuple().reference();
|
||||
}
|
||||
boost::python::ref shared_ptr_value_dvect_as_tuple(boost::shared_ptr<vects::dvect> dv)
|
||||
{
|
||||
if (dv.get() == 0) return boost::python::ref(Py_None, boost::python::ref::increment_count);
|
||||
return dv->as_tuple().reference();
|
||||
}
|
||||
|
||||
// smart pointers passed by reference
|
||||
boost::python::ref auto_ptr_reference_dvect_as_tuple(std::auto_ptr<vects::dvect>& dv)
|
||||
{
|
||||
if (dv.get() == 0) return boost::python::ref(Py_None, boost::python::ref::increment_count);
|
||||
return dv->as_tuple().reference();
|
||||
}
|
||||
boost::python::ref shared_ptr_reference_dvect_as_tuple(boost::shared_ptr<vects::dvect>& dv)
|
||||
{
|
||||
if (dv.get() == 0) return boost::python::ref(Py_None, boost::python::ref::increment_count);
|
||||
return dv->as_tuple().reference();
|
||||
}
|
||||
|
||||
// smart pointers passed by const reference
|
||||
boost::python::ref auto_ptr_const_reference_dvect_as_tuple(const std::auto_ptr<vects::dvect>& dv)
|
||||
{
|
||||
if (dv.get() == 0) return boost::python::ref(Py_None, boost::python::ref::increment_count);
|
||||
return dv->as_tuple().reference();
|
||||
}
|
||||
boost::python::ref shared_ptr_const_reference_dvect_as_tuple(const boost::shared_ptr<vects::dvect>& dv)
|
||||
{
|
||||
if (dv.get() == 0) return boost::python::ref(Py_None, boost::python::ref::increment_count);
|
||||
return dv->as_tuple().reference();
|
||||
}
|
||||
13
example/dvect_defs.cpp
Normal file
13
example/dvect_defs.cpp
Normal file
@@ -0,0 +1,13 @@
|
||||
this_module.def(dvect_as_auto_ptr, "dvect_as_auto_ptr");
|
||||
this_module.def(dvect_as_shared_ptr, "dvect_as_shared_ptr");
|
||||
|
||||
this_module.def(const_dvect_reference_as_tuple, "const_dvect_reference_as_tuple");
|
||||
|
||||
this_module.def(auto_ptr_value_dvect_as_tuple, "auto_ptr_value_dvect_as_tuple");
|
||||
this_module.def(shared_ptr_value_dvect_as_tuple, "shared_ptr_value_dvect_as_tuple");
|
||||
|
||||
this_module.def(auto_ptr_reference_dvect_as_tuple, "auto_ptr_reference_dvect_as_tuple");
|
||||
this_module.def(shared_ptr_reference_dvect_as_tuple, "shared_ptr_reference_dvect_as_tuple");
|
||||
|
||||
this_module.def(auto_ptr_const_reference_dvect_as_tuple, "auto_ptr_const_reference_dvect_as_tuple");
|
||||
this_module.def(shared_ptr_const_reference_dvect_as_tuple, "shared_ptr_const_reference_dvect_as_tuple");
|
||||
32
example/getting_started1.cpp
Normal file
32
example/getting_started1.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
// Example by Ralf W. Grosse-Kunstleve
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace { // Avoid cluttering the global namespace.
|
||||
|
||||
// A couple of simple C++ functions that we want to expose to Python.
|
||||
std::string greet() { return "hello, world"; }
|
||||
int square(int number) { return number * number; }
|
||||
}
|
||||
|
||||
#include <boost/python/class_builder.hpp>
|
||||
namespace python = boost::python;
|
||||
|
||||
// Python requires an exported function called init<module-name> in every
|
||||
// extension module. This is where we build the module contents.
|
||||
BOOST_PYTHON_MODULE_INIT(getting_started1)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create an object representing this extension module.
|
||||
python::module_builder this_module("getting_started1");
|
||||
|
||||
// Add regular functions to the module.
|
||||
this_module.def(greet, "greet");
|
||||
this_module.def(square, "square");
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
python::handle_exception(); // Deal with the exception for Python
|
||||
}
|
||||
}
|
||||
52
example/getting_started2.cpp
Normal file
52
example/getting_started2.cpp
Normal file
@@ -0,0 +1,52 @@
|
||||
// Example by Ralf W. Grosse-Kunstleve
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
namespace { // Avoid cluttering the global namespace.
|
||||
|
||||
// A friendly class.
|
||||
class hello
|
||||
{
|
||||
public:
|
||||
hello(const std::string& country) { this->country = country; }
|
||||
std::string greet() const { return "Hello from " + country; }
|
||||
private:
|
||||
std::string country;
|
||||
};
|
||||
|
||||
// A function taking a hello object as an argument.
|
||||
std::string invite(const hello& w) {
|
||||
return w.greet() + "! Please come soon!";
|
||||
}
|
||||
}
|
||||
|
||||
#include <boost/python/class_builder.hpp>
|
||||
namespace python = boost::python;
|
||||
|
||||
BOOST_PYTHON_MODULE_INIT(getting_started2)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create an object representing this extension module.
|
||||
python::module_builder this_module("getting_started2");
|
||||
|
||||
// Create the Python type object for our extension class.
|
||||
python::class_builder<hello> hello_class(this_module, "hello");
|
||||
|
||||
// Add the __init__ function.
|
||||
hello_class.def(python::constructor<std::string>());
|
||||
// Add a regular member function.
|
||||
hello_class.def(&hello::greet, "greet");
|
||||
|
||||
// Add invite() as a regular function to the module.
|
||||
this_module.def(invite, "invite");
|
||||
|
||||
// Even better, invite() can also be made a member of hello_class!!!
|
||||
hello_class.def(invite, "invite");
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
python::handle_exception(); // Deal with the exception for Python
|
||||
}
|
||||
}
|
||||
45
example/ivect.cpp
Normal file
45
example/ivect.cpp
Normal file
@@ -0,0 +1,45 @@
|
||||
// Example by Ralf W. Grosse-Kunstleve
|
||||
// See root/libs/python/doc/cross_module.html for an introduction.
|
||||
|
||||
#include "dvect.h"
|
||||
#include "ivect.h"
|
||||
#include <boost/python/cross_module.hpp>
|
||||
namespace python = boost::python;
|
||||
|
||||
namespace {
|
||||
|
||||
# include "dvect_conversions.cpp"
|
||||
# include "ivect_conversions.cpp"
|
||||
|
||||
vects::dvect ivect_as_dvect(const vects::ivect& iv)
|
||||
{
|
||||
vects::dvect dv(iv.size());
|
||||
vects::dvect::iterator dviter = dv.begin();
|
||||
for (int i = 0; i < iv.size(); i++) dviter[i] = static_cast<double>(iv[i]);
|
||||
return dv;
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_PYTHON_MODULE_INIT(ivect)
|
||||
{
|
||||
try
|
||||
{
|
||||
python::module_builder this_module("ivect");
|
||||
|
||||
python::class_builder<vects::ivect> ivect_class(this_module, "ivect");
|
||||
python::export_converters(ivect_class);
|
||||
|
||||
python::import_converters<vects::dvect> dvect_converters("dvect", "dvect");
|
||||
|
||||
ivect_class.def(python::constructor<python::tuple>());
|
||||
ivect_class.def(&vects::ivect::as_tuple, "as_tuple");
|
||||
ivect_class.def(ivect_as_dvect, "as_dvect");
|
||||
|
||||
# include "dvect_defs.cpp"
|
||||
# include "ivect_defs.cpp"
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
python::handle_exception(); // Deal with the exception for Python
|
||||
}
|
||||
}
|
||||
32
example/ivect.h
Normal file
32
example/ivect.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#ifndef IVECT_H
|
||||
#define IVECT_H
|
||||
|
||||
#include <vector>
|
||||
#include <boost/python/class_builder.hpp>
|
||||
|
||||
namespace vects {
|
||||
|
||||
struct ivect : public std::vector<int>
|
||||
{
|
||||
ivect() : std::vector<int>() {}
|
||||
ivect(size_t n) : std::vector<int>(n) {}
|
||||
ivect(boost::python::tuple tuple) : std::vector<int>(tuple.size())
|
||||
{
|
||||
std::vector<int>::iterator v_it = begin();
|
||||
for (int i = 0; i < tuple.size(); i++)
|
||||
v_it[i] = BOOST_PYTHON_CONVERSION::from_python(tuple[i].get(),
|
||||
boost::python::type<int>());
|
||||
}
|
||||
|
||||
boost::python::tuple as_tuple() const
|
||||
{
|
||||
boost::python::tuple t(size());
|
||||
for (int i = 0; i < size(); i++)
|
||||
t.set_item(i,
|
||||
boost::python::ref(BOOST_PYTHON_CONVERSION::to_python((*this)[i])));
|
||||
return t;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#endif // IVECT_H
|
||||
51
example/ivect_conversions.cpp
Normal file
51
example/ivect_conversions.cpp
Normal file
@@ -0,0 +1,51 @@
|
||||
// basics first: const reference converters
|
||||
boost::python::tuple const_ivect_reference_as_tuple(const vects::ivect& iv)
|
||||
{
|
||||
return iv.as_tuple();
|
||||
}
|
||||
|
||||
// to_python smart pointer conversions
|
||||
std::auto_ptr<vects::ivect> ivect_as_auto_ptr(const vects::ivect& iv)
|
||||
{
|
||||
return std::auto_ptr<vects::ivect>(new vects::ivect(iv));
|
||||
}
|
||||
boost::shared_ptr<vects::ivect> ivect_as_shared_ptr(const vects::ivect& iv)
|
||||
{
|
||||
return boost::shared_ptr<vects::ivect>(new vects::ivect(iv));
|
||||
}
|
||||
|
||||
// smart pointers passed by value
|
||||
boost::python::ref auto_ptr_value_ivect_as_tuple(std::auto_ptr<vects::ivect> iv)
|
||||
{
|
||||
if (iv.get() == 0) return boost::python::ref(Py_None, boost::python::ref::increment_count);
|
||||
return iv->as_tuple().reference();
|
||||
}
|
||||
boost::python::ref shared_ptr_value_ivect_as_tuple(boost::shared_ptr<vects::ivect> iv)
|
||||
{
|
||||
if (iv.get() == 0) return boost::python::ref(Py_None, boost::python::ref::increment_count);
|
||||
return iv->as_tuple().reference();
|
||||
}
|
||||
|
||||
// smart pointers passed by reference
|
||||
boost::python::ref auto_ptr_reference_ivect_as_tuple(std::auto_ptr<vects::ivect>& iv)
|
||||
{
|
||||
if (iv.get() == 0) return boost::python::ref(Py_None, boost::python::ref::increment_count);
|
||||
return iv->as_tuple().reference();
|
||||
}
|
||||
boost::python::ref shared_ptr_reference_ivect_as_tuple(boost::shared_ptr<vects::ivect>& iv)
|
||||
{
|
||||
if (iv.get() == 0) return boost::python::ref(Py_None, boost::python::ref::increment_count);
|
||||
return iv->as_tuple().reference();
|
||||
}
|
||||
|
||||
// smart pointers passed by const reference
|
||||
boost::python::ref auto_ptr_const_reference_ivect_as_tuple(const std::auto_ptr<vects::ivect>& iv)
|
||||
{
|
||||
if (iv.get() == 0) return boost::python::ref(Py_None, boost::python::ref::increment_count);
|
||||
return iv->as_tuple().reference();
|
||||
}
|
||||
boost::python::ref shared_ptr_const_reference_ivect_as_tuple(const boost::shared_ptr<vects::ivect>& iv)
|
||||
{
|
||||
if (iv.get() == 0) return boost::python::ref(Py_None, boost::python::ref::increment_count);
|
||||
return iv->as_tuple().reference();
|
||||
}
|
||||
13
example/ivect_defs.cpp
Normal file
13
example/ivect_defs.cpp
Normal file
@@ -0,0 +1,13 @@
|
||||
this_module.def(ivect_as_auto_ptr, "ivect_as_auto_ptr");
|
||||
this_module.def(ivect_as_shared_ptr, "ivect_as_shared_ptr");
|
||||
|
||||
this_module.def(const_ivect_reference_as_tuple, "const_ivect_reference_as_tuple");
|
||||
|
||||
this_module.def(auto_ptr_value_ivect_as_tuple, "auto_ptr_value_ivect_as_tuple");
|
||||
this_module.def(shared_ptr_value_ivect_as_tuple, "shared_ptr_value_ivect_as_tuple");
|
||||
|
||||
this_module.def(auto_ptr_reference_ivect_as_tuple, "auto_ptr_reference_ivect_as_tuple");
|
||||
this_module.def(shared_ptr_reference_ivect_as_tuple, "shared_ptr_reference_ivect_as_tuple");
|
||||
|
||||
this_module.def(auto_ptr_const_reference_ivect_as_tuple, "auto_ptr_const_reference_ivect_as_tuple");
|
||||
this_module.def(shared_ptr_const_reference_ivect_as_tuple, "shared_ptr_const_reference_ivect_as_tuple");
|
||||
14
example/noncopyable.h
Normal file
14
example/noncopyable.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#ifndef NONCOPYABLE_H
|
||||
#define NONCOPYABLE_H
|
||||
|
||||
class store
|
||||
{
|
||||
private:
|
||||
store(const store&) { } // Disable the copy constructor.
|
||||
int number;
|
||||
public:
|
||||
store(const int i) : number(i) { }
|
||||
int recall() const { return number; }
|
||||
};
|
||||
|
||||
#endif // NONCOPYABLE_H
|
||||
25
example/noncopyable_export.cpp
Normal file
25
example/noncopyable_export.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
// Example by Ralf W. Grosse-Kunstleve
|
||||
// See root/libs/python/doc/cross_module.html for an introduction.
|
||||
|
||||
#include <boost/python/cross_module.hpp>
|
||||
namespace python = boost::python;
|
||||
|
||||
#include "noncopyable.h"
|
||||
|
||||
BOOST_PYTHON_MODULE_INIT(noncopyable_export)
|
||||
{
|
||||
try
|
||||
{
|
||||
python::module_builder this_module("noncopyable_export");
|
||||
|
||||
python::class_builder<store> store_class(this_module, "store");
|
||||
python::export_converters_noncopyable(store_class);
|
||||
|
||||
store_class.def(python::constructor<int>());
|
||||
store_class.def(&store::recall, "recall");
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
python::handle_exception(); // Deal with the exception for Python
|
||||
}
|
||||
}
|
||||
42
example/noncopyable_import.cpp
Normal file
42
example/noncopyable_import.cpp
Normal file
@@ -0,0 +1,42 @@
|
||||
// Example by Ralf W. Grosse-Kunstleve
|
||||
// See root/libs/python/doc/cross_module.html for an introduction.
|
||||
|
||||
#include <boost/python/cross_module.hpp>
|
||||
namespace python = boost::python;
|
||||
|
||||
#include "noncopyable.h"
|
||||
|
||||
namespace { // Avoid cluttering the global namespace.
|
||||
|
||||
// A function with store objects as both input and output parameters.
|
||||
// Because the copy constructor is disabled, we cannot pass a store
|
||||
// object by value. Instead, we pass a smart pointer.
|
||||
std::auto_ptr<store> add_stores(const store& s1, const store& s2)
|
||||
{
|
||||
int sum = s1.recall() + s2.recall();
|
||||
std::auto_ptr<store> ss = std::auto_ptr<store>(new store(sum));
|
||||
return ss;
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_PYTHON_MODULE_INIT(noncopyable_import)
|
||||
{
|
||||
try
|
||||
{
|
||||
python::module_builder this_module("noncopyable_import");
|
||||
|
||||
python::import_converters<store>
|
||||
dvect_converters("noncopyable_export", "store");
|
||||
|
||||
// Imagine all the additional classes with member functions
|
||||
// that have store objects as input and output parameters.
|
||||
// Lots and lots of them.
|
||||
// However, to keep this example simple, we only define a
|
||||
// module-level function.
|
||||
this_module.def(add_stores, "add_stores");
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
python::handle_exception(); // Deal with the exception for Python
|
||||
}
|
||||
}
|
||||
64
example/pickle1.cpp
Normal file
64
example/pickle1.cpp
Normal file
@@ -0,0 +1,64 @@
|
||||
// Example by Ralf W. Grosse-Kunstleve
|
||||
|
||||
/*
|
||||
This example shows how to make an Extension Class "pickleable".
|
||||
|
||||
The world class below can be fully restored by passing the
|
||||
appropriate argument to the constructor. Therefore it is sufficient
|
||||
to define the pickle interface method __getinitargs__.
|
||||
|
||||
For more information refer to boost/libs/python/doc/pickle.html.
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <boost/python/class_builder.hpp>
|
||||
namespace python = boost::python;
|
||||
|
||||
namespace { // Avoid cluttering the global namespace.
|
||||
|
||||
// A friendly class.
|
||||
class world
|
||||
{
|
||||
private:
|
||||
std::string country;
|
||||
int secret_number;
|
||||
public:
|
||||
world(const std::string& country) : secret_number(0) {
|
||||
this->country = country;
|
||||
}
|
||||
std::string greet() const { return "Hello from " + country + "!"; }
|
||||
std::string get_country() const { return country; }
|
||||
};
|
||||
|
||||
// Support for pickle.
|
||||
python::ref world_getinitargs(const world& w) {
|
||||
python::tuple result(1);
|
||||
result.set_item(0, w.get_country());
|
||||
return result.reference();
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_PYTHON_MODULE_INIT(pickle1)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create an object representing this extension module.
|
||||
python::module_builder this_module("pickle1");
|
||||
|
||||
// Create the Python type object for our extension class.
|
||||
python::class_builder<world> world_class(this_module, "world");
|
||||
|
||||
// Add the __init__ function.
|
||||
world_class.def(python::constructor<std::string>());
|
||||
// Add a regular member function.
|
||||
world_class.def(&world::greet, "greet");
|
||||
|
||||
// Support for pickle.
|
||||
world_class.def(world_getinitargs, "__getinitargs__");
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
python::handle_exception(); // Deal with the exception for Python
|
||||
}
|
||||
}
|
||||
100
example/pickle2.cpp
Normal file
100
example/pickle2.cpp
Normal file
@@ -0,0 +1,100 @@
|
||||
// Example by Ralf W. Grosse-Kunstleve
|
||||
|
||||
/*
|
||||
This example shows how to make an Extension Class "pickleable".
|
||||
|
||||
The world class below contains member data (secret_number) that
|
||||
cannot be restored by any of the constructors. Therefore it is
|
||||
necessary to provide the __getstate__/__setstate__ pair of pickle
|
||||
interface methods.
|
||||
|
||||
For simplicity, the __dict__ is not included in the result of
|
||||
__getstate__. This is not generally recommended, but a valid
|
||||
approach if it is anticipated that the object's __dict__ will
|
||||
always be empty. Note that safety guard are provided to catch the
|
||||
cases where this assumption is not true.
|
||||
|
||||
pickle3.cpp shows how to include the object's __dict__ in the
|
||||
result of __getstate__.
|
||||
|
||||
For more information refer to boost/libs/python/doc/pickle.html.
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <boost/python/class_builder.hpp>
|
||||
namespace python = boost::python;
|
||||
|
||||
namespace { // Avoid cluttering the global namespace.
|
||||
|
||||
// A friendly class.
|
||||
class world
|
||||
{
|
||||
public:
|
||||
world(const std::string& country) : secret_number(0) {
|
||||
this->country = country;
|
||||
}
|
||||
std::string greet() const { return "Hello from " + country + "!"; }
|
||||
std::string get_country() const { return country; }
|
||||
void set_secret_number(int number) { secret_number = number; }
|
||||
int get_secret_number() const { return secret_number; }
|
||||
private:
|
||||
std::string country;
|
||||
int secret_number;
|
||||
};
|
||||
|
||||
// Support for pickle.
|
||||
|
||||
using BOOST_PYTHON_CONVERSION::from_python;
|
||||
|
||||
python::ref world_getinitargs(const world& w) {
|
||||
python::tuple result(1);
|
||||
result.set_item(0, w.get_country());
|
||||
return result.reference(); // returning the reference avoids the copying.
|
||||
}
|
||||
|
||||
python::ref world_getstate(const world& w) {
|
||||
python::tuple result(1);
|
||||
result.set_item(0, w.get_secret_number());
|
||||
return result.reference(); // returning the reference avoids the copying.
|
||||
}
|
||||
|
||||
void world_setstate(world& w, python::tuple state) {
|
||||
if (state.size() != 1) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"Unexpected argument in call to __setstate__.");
|
||||
throw python::error_already_set();
|
||||
}
|
||||
int number = from_python(state[0].get(), python::type<int>());
|
||||
if (number != 42)
|
||||
w.set_secret_number(number);
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_PYTHON_MODULE_INIT(pickle2)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create an object representing this extension module.
|
||||
python::module_builder this_module("pickle2");
|
||||
|
||||
// Create the Python type object for our extension class.
|
||||
python::class_builder<world> world_class(this_module, "world");
|
||||
|
||||
// Add the __init__ function.
|
||||
world_class.def(python::constructor<std::string>());
|
||||
// Add a regular member function.
|
||||
world_class.def(&world::greet, "greet");
|
||||
world_class.def(&world::get_secret_number, "get_secret_number");
|
||||
world_class.def(&world::set_secret_number, "set_secret_number");
|
||||
|
||||
// Support for pickle.
|
||||
world_class.def(world_getinitargs, "__getinitargs__");
|
||||
world_class.def(world_getstate, "__getstate__");
|
||||
world_class.def(world_setstate, "__setstate__");
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
python::handle_exception(); // Deal with the exception for Python
|
||||
}
|
||||
}
|
||||
150
example/pickle3.cpp
Normal file
150
example/pickle3.cpp
Normal file
@@ -0,0 +1,150 @@
|
||||
// Example by Ralf W. Grosse-Kunstleve
|
||||
|
||||
/*
|
||||
This example shows how to make an Extension Class "pickleable".
|
||||
|
||||
The world class below contains member data (secret_number) that
|
||||
cannot be restored by any of the constructors. Therefore it is
|
||||
necessary to provide the __getstate__/__setstate__ pair of pickle
|
||||
interface methods.
|
||||
|
||||
The object's __dict__ is included in the result of __getstate__.
|
||||
This requires more code (compare with pickle2.cpp), but is
|
||||
unavoidable if the object's __dict__ is not always empty.
|
||||
|
||||
For more information refer to boost/libs/python/doc/pickle.html.
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <boost/python/class_builder.hpp>
|
||||
namespace python = boost::python;
|
||||
|
||||
namespace boost { namespace python {
|
||||
|
||||
ref getattr(PyObject* o, const std::string& attr_name) {
|
||||
return ref(PyObject_GetAttrString(o, const_cast<char*>(attr_name.c_str())));
|
||||
}
|
||||
ref getattr(const ref& r, const std::string& attr_name) {
|
||||
return getattr(r.get(), attr_name);
|
||||
}
|
||||
|
||||
}}
|
||||
|
||||
namespace { // Avoid cluttering the global namespace.
|
||||
|
||||
// A friendly class.
|
||||
class world
|
||||
{
|
||||
public:
|
||||
world(const std::string& country) : secret_number(0) {
|
||||
this->country = country;
|
||||
}
|
||||
std::string greet() const { return "Hello from " + country + "!"; }
|
||||
std::string get_country() const { return country; }
|
||||
void set_secret_number(int number) { secret_number = number; }
|
||||
int get_secret_number() const { return secret_number; }
|
||||
private:
|
||||
std::string country;
|
||||
int secret_number;
|
||||
};
|
||||
|
||||
// Support for pickle.
|
||||
python::ref world_getinitargs(const world& w) {
|
||||
python::tuple result(1);
|
||||
result.set_item(0, w.get_country());
|
||||
return result.reference(); // returning the reference avoids the copying.
|
||||
}
|
||||
|
||||
python::ref world_getstate(python::tuple const & args,
|
||||
python::dictionary const & keywords);
|
||||
|
||||
PyObject* world_setstate(python::tuple const & args,
|
||||
python::dictionary const & keywords);
|
||||
}
|
||||
|
||||
BOOST_PYTHON_MODULE_INIT(pickle3)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create an object representing this extension module.
|
||||
python::module_builder this_module("pickle3");
|
||||
|
||||
// Create the Python type object for our extension class.
|
||||
python::class_builder<world> world_class(this_module, "world");
|
||||
|
||||
// Add the __init__ function.
|
||||
world_class.def(python::constructor<std::string>());
|
||||
// Add a regular member function.
|
||||
world_class.def(&world::greet, "greet");
|
||||
world_class.def(&world::get_secret_number, "get_secret_number");
|
||||
world_class.def(&world::set_secret_number, "set_secret_number");
|
||||
|
||||
// Support for pickle.
|
||||
world_class.def(world_getinitargs, "__getinitargs__");
|
||||
world_class.def_raw(world_getstate, "__getstate__");
|
||||
world_class.def_raw(world_setstate, "__setstate__");
|
||||
world_class.getstate_manages_dict();
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
python::handle_exception(); // Deal with the exception for Python
|
||||
}
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
using BOOST_PYTHON_CONVERSION::from_python;
|
||||
using boost::python::type;
|
||||
using boost::python::ref;
|
||||
using boost::python::tuple;
|
||||
using boost::python::list;
|
||||
using boost::python::dictionary;
|
||||
using boost::python::getattr;
|
||||
|
||||
ref world_getstate(tuple const & args, dictionary const & keywords)
|
||||
{
|
||||
if(args.size() != 1 || keywords.size() != 0) {
|
||||
PyErr_SetString(PyExc_TypeError, "wrong number of arguments");
|
||||
throw boost::python::argument_error();
|
||||
}
|
||||
const world& w = from_python(args[0].get(), type<const world&>());
|
||||
ref mydict = getattr(args[0], "__dict__");
|
||||
tuple result(2);
|
||||
// store the object's __dict__
|
||||
result.set_item(0, mydict);
|
||||
// store the internal state of the C++ object
|
||||
result.set_item(1, w.get_secret_number());
|
||||
return result.reference(); // returning the reference avoids the copying.
|
||||
}
|
||||
|
||||
PyObject* world_setstate(tuple const & args, dictionary const & keywords)
|
||||
{
|
||||
if(args.size() != 2 || keywords.size() != 0) {
|
||||
PyErr_SetString(PyExc_TypeError, "wrong number of arguments");
|
||||
throw boost::python::argument_error();
|
||||
}
|
||||
world& w = from_python(args[0].get(), type<world&>());
|
||||
ref mydict = getattr(args[0], "__dict__");
|
||||
tuple state = from_python(args[1].get(), type<tuple>());
|
||||
if (state.size() != 2) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"Unexpected argument in call to __setstate__.");
|
||||
throw python::error_already_set();
|
||||
}
|
||||
// restore the object's __dict__
|
||||
dictionary odict = from_python(mydict.get(), type<dictionary>());
|
||||
const dictionary& pdict = from_python(state[0].get(), type<const dictionary&>());
|
||||
list pkeys(pdict.keys());
|
||||
for (int i = 0; i < pkeys.size(); i++) {
|
||||
ref k(pkeys[i]);
|
||||
//odict[k] = pdict[k]; // XXX memory leak!
|
||||
odict[k] = pdict.get_item(k); // this does not leak.
|
||||
}
|
||||
// restore the internal state of the C++ object
|
||||
int number = from_python(state[1].get(), type<int>());
|
||||
if (number != 42)
|
||||
w.set_secret_number(number);
|
||||
return python::detail::none();
|
||||
}
|
||||
}
|
||||
41
example/rwgk1.cpp
Normal file
41
example/rwgk1.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
#include <string>
|
||||
|
||||
namespace { // Avoid cluttering the global namespace.
|
||||
|
||||
// A couple of simple C++ functions that we want to expose to Python.
|
||||
std::string greet() { return "hello, world"; }
|
||||
int square(int number) { return number * number; }
|
||||
}
|
||||
|
||||
#include <boost/python/class_builder.hpp>
|
||||
|
||||
namespace python = boost::python;
|
||||
|
||||
// Python requires an exported function called init<module-name> in every
|
||||
// extension module. This is where we build the module contents.
|
||||
extern "C"
|
||||
#ifdef _WIN32
|
||||
__declspec(dllexport)
|
||||
#endif
|
||||
void initrwgk1()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create an object representing this extension module.
|
||||
python::module_builder this_module("rwgk1");
|
||||
|
||||
// Add regular functions to the module.
|
||||
this_module.def(greet, "greet");
|
||||
this_module.def(square, "square");
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
python::handle_exception(); // Deal with the exception for Python
|
||||
}
|
||||
}
|
||||
|
||||
// Win32 DLL boilerplate
|
||||
#if defined(_WIN32)
|
||||
#include <windows.h>
|
||||
extern "C" BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID) { return 1; }
|
||||
#endif // _WIN32
|
||||
103
example/simple_vector.cpp
Normal file
103
example/simple_vector.cpp
Normal file
@@ -0,0 +1,103 @@
|
||||
// Example by Ralf W. Grosse-Kunstleve
|
||||
|
||||
#include <boost/python/class_builder.hpp>
|
||||
namespace python = boost::python;
|
||||
|
||||
namespace { // Avoid cluttering the global namespace.
|
||||
|
||||
// A wrapper is used to define additional constructors.
|
||||
//
|
||||
struct vector_double_wrapper: std::vector<double>
|
||||
{
|
||||
// Tell the compiler how to convert a base class object to
|
||||
// this wrapper object.
|
||||
vector_double_wrapper(PyObject*, const std::vector<double>& vd)
|
||||
: std::vector<double>(vd) {}
|
||||
|
||||
vector_double_wrapper(PyObject* self)
|
||||
: std::vector<double>() {}
|
||||
|
||||
vector_double_wrapper(PyObject* self, int n)
|
||||
: std::vector<double>(n) {}
|
||||
|
||||
vector_double_wrapper(PyObject* self, python::tuple tuple)
|
||||
: std::vector<double>(tuple.size())
|
||||
{
|
||||
std::vector<double>::iterator vd = begin();
|
||||
for (int i = 0; i < tuple.size(); i++)
|
||||
vd[i] = BOOST_PYTHON_CONVERSION::from_python(tuple[i].get(),
|
||||
python::type<double>());
|
||||
}
|
||||
};
|
||||
|
||||
double getitem(const std::vector<double>& vd, std::size_t key) {
|
||||
return vd[key];
|
||||
}
|
||||
|
||||
void setitem(std::vector<double>& vd, std::size_t key, double d) {
|
||||
std::vector<double>::iterator vditer = vd.begin();
|
||||
vditer[key] = d;
|
||||
}
|
||||
|
||||
void delitem(std::vector<double>& vd, std::size_t key) {
|
||||
std::vector<double>::iterator vditer = vd.begin();
|
||||
vd.erase(&vditer[key]);
|
||||
}
|
||||
|
||||
// Convert vector_double to a regular Python tuple.
|
||||
//
|
||||
python::tuple as_tuple(const std::vector<double>& vd)
|
||||
{
|
||||
python::tuple t(vd.size());
|
||||
for (int i = 0; i < vd.size(); i++) t.set_item(i,
|
||||
python::ref(BOOST_PYTHON_CONVERSION::to_python(vd[i])));
|
||||
return t;
|
||||
}
|
||||
|
||||
// Function returning a vector_double object to Python.
|
||||
//
|
||||
std::vector<double> foo(int n)
|
||||
{
|
||||
std::vector<double> vd(n);
|
||||
std::vector<double>::iterator vditer = vd.begin();
|
||||
for (int i = 0; i < n; i++) vditer[i] = double(i);
|
||||
return vd;
|
||||
}
|
||||
|
||||
// Same as foo(), but avoid copying on return.
|
||||
//
|
||||
std::auto_ptr<std::vector<double> > bar(int n)
|
||||
{
|
||||
std::auto_ptr<std::vector<double> > vdptr(new std::vector<double>(n));
|
||||
std::vector<double>::iterator vditer = vdptr->begin();
|
||||
for (int i = 0; i < n; i++) vditer[i] = double(10 * i);
|
||||
return vdptr;
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_PYTHON_MODULE_INIT(simple_vector)
|
||||
{
|
||||
try
|
||||
{
|
||||
python::module_builder this_module("simple_vector");
|
||||
|
||||
python::class_builder<std::vector<double>, vector_double_wrapper>
|
||||
vector_double(this_module, "vector_double");
|
||||
|
||||
vector_double.def(python::constructor<>());
|
||||
vector_double.def(python::constructor<const int>());
|
||||
vector_double.def(python::constructor<python::tuple>());
|
||||
vector_double.def(&std::vector<double>::size, "__len__");
|
||||
vector_double.def(getitem, "__getitem__");
|
||||
vector_double.def(setitem, "__setitem__");
|
||||
vector_double.def(delitem, "__delitem__");
|
||||
vector_double.def(as_tuple, "as_tuple");
|
||||
|
||||
this_module.def(foo, "foo");
|
||||
this_module.def(bar, "bar");
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
python::handle_exception(); // Deal with the exception for Python
|
||||
}
|
||||
}
|
||||
23
example/test_abstract.py
Normal file
23
example/test_abstract.py
Normal file
@@ -0,0 +1,23 @@
|
||||
# Example by Ullrich Koethe
|
||||
r'''>>> from abstract import *
|
||||
>>> class A(Abstract):
|
||||
... def __init__(self, text):
|
||||
... Abstract.__init__(self) # call the base class constructor
|
||||
... self.text = text
|
||||
... def test(self): # implement abstract function
|
||||
... return self.text
|
||||
...
|
||||
>>> a = A("Hello")
|
||||
>>> a.test()
|
||||
'Hello'
|
||||
'''
|
||||
|
||||
def run(args = None):
|
||||
if args is not None:
|
||||
import sys
|
||||
sys.argv = args
|
||||
import doctest, test_abstract
|
||||
doctest.testmod(test_abstract)
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
139
example/test_cross_module.py
Normal file
139
example/test_cross_module.py
Normal file
@@ -0,0 +1,139 @@
|
||||
r'''>>> import tst_noncopyable
|
||||
>>> tst_noncopyable.f()
|
||||
1
|
||||
2
|
||||
3
|
||||
>>> import tst_dvect1
|
||||
>>> tst_dvect1.f()
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
(1, 2, 3, 4, 5)
|
||||
(1, 2, 3, 4, 5)
|
||||
(1, 2, 3, 4, 5)
|
||||
(1, 2, 3, 4, 5)
|
||||
(1, 2, 3, 4, 5)
|
||||
(1, 2, 3, 4, 5)
|
||||
>>> import tst_ivect1
|
||||
>>> tst_ivect1.f()
|
||||
(1, 2, 3, 4, 5)
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
>>> import sys
|
||||
>>> if ("--broken-auto-ptr" in sys.argv):
|
||||
... broken_auto_ptr = 1
|
||||
... else:
|
||||
... broken_auto_ptr = 0
|
||||
>>> import tst_dvect2
|
||||
>>> tst_dvect2.f(broken_auto_ptr)
|
||||
1. auto_ptr_value_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
2. auto_ptr_value_ivect_as_tuple
|
||||
None
|
||||
1. auto_ptr_value_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
2. auto_ptr_value_dvect_as_tuple
|
||||
None
|
||||
1. shared_ptr_value_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
2. shared_ptr_value_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
1. shared_ptr_value_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
2. shared_ptr_value_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
1. auto_ptr_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
2. auto_ptr_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
1. auto_ptr_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
2. auto_ptr_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
1. shared_ptr_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
2. shared_ptr_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
1. shared_ptr_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
2. shared_ptr_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
1. auto_ptr_const_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
2. auto_ptr_const_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
1. auto_ptr_const_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
2. auto_ptr_const_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
1. shared_ptr_const_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
2. shared_ptr_const_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
1. shared_ptr_const_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
2. shared_ptr_const_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
>>> import tst_ivect2
|
||||
>>> tst_ivect2.f(broken_auto_ptr)
|
||||
1. auto_ptr_value_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
2. auto_ptr_value_dvect_as_tuple
|
||||
None
|
||||
1. auto_ptr_value_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
2. auto_ptr_value_ivect_as_tuple
|
||||
None
|
||||
1. shared_ptr_value_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
2. shared_ptr_value_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
1. shared_ptr_value_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
2. shared_ptr_value_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
1. auto_ptr_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
2. auto_ptr_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
1. auto_ptr_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
2. auto_ptr_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
1. shared_ptr_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
2. shared_ptr_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
1. shared_ptr_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
2. shared_ptr_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
1. auto_ptr_const_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
2. auto_ptr_const_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
1. auto_ptr_const_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
2. auto_ptr_const_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
1. shared_ptr_const_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
2. shared_ptr_const_reference_dvect_as_tuple
|
||||
(1.0, 2.0, 3.0, 4.0, 5.0)
|
||||
1. shared_ptr_const_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
2. shared_ptr_const_reference_ivect_as_tuple
|
||||
(1, 2, 3, 4, 5)
|
||||
'''
|
||||
|
||||
def run(args = None):
|
||||
if args is not None:
|
||||
import sys
|
||||
sys.argv = args
|
||||
import doctest, test_cross_module
|
||||
doctest.testmod(test_cross_module)
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
22
example/test_do_it_yourself_converters.py
Normal file
22
example/test_do_it_yourself_converters.py
Normal file
@@ -0,0 +1,22 @@
|
||||
r'''>>> import do_it_yourself_converters
|
||||
>>> ixset = do_it_yourself_converters.IndexingSet()
|
||||
>>> ixset.add((1,2,3))
|
||||
>>> ixset.add((4,5,6))
|
||||
>>> ixset.add((7,8,9))
|
||||
>>> print ixset.get(0)
|
||||
(1, 2, 3)
|
||||
>>> print ixset.get(1)
|
||||
(4, 5, 6)
|
||||
>>> print ixset.get(2)
|
||||
(7, 8, 9)
|
||||
'''
|
||||
|
||||
def run(args = None):
|
||||
if args is not None:
|
||||
import sys
|
||||
sys.argv = args
|
||||
import doctest, test_do_it_yourself_converters
|
||||
doctest.testmod(test_do_it_yourself_converters)
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
17
example/test_getting_started1.py
Normal file
17
example/test_getting_started1.py
Normal file
@@ -0,0 +1,17 @@
|
||||
r'''>>> import getting_started1
|
||||
>>> print getting_started1.greet()
|
||||
hello, world
|
||||
>>> number = 11
|
||||
>>> print number, '*', number, '=', getting_started1.square(number)
|
||||
11 * 11 = 121
|
||||
'''
|
||||
|
||||
def run(args = None):
|
||||
if args is not None:
|
||||
import sys
|
||||
sys.argv = args
|
||||
import doctest, test_getting_started1
|
||||
doctest.testmod(test_getting_started1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
29
example/test_getting_started2.py
Normal file
29
example/test_getting_started2.py
Normal file
@@ -0,0 +1,29 @@
|
||||
r'''>>> from getting_started2 import *
|
||||
>>> hi = hello('California')
|
||||
>>> hi.greet()
|
||||
'Hello from California'
|
||||
>>> invite(hi)
|
||||
'Hello from California! Please come soon!'
|
||||
>>> hi.invite()
|
||||
'Hello from California! Please come soon!'
|
||||
|
||||
>>> class wordy(hello):
|
||||
... def greet(self):
|
||||
... return hello.greet(self) + ', where the weather is fine'
|
||||
...
|
||||
>>> hi2 = wordy('Florida')
|
||||
>>> hi2.greet()
|
||||
'Hello from Florida, where the weather is fine'
|
||||
>>> invite(hi2)
|
||||
'Hello from Florida! Please come soon!'
|
||||
'''
|
||||
|
||||
def run(args = None):
|
||||
if args is not None:
|
||||
import sys
|
||||
sys.argv = args
|
||||
import doctest, test_getting_started2
|
||||
doctest.testmod(test_getting_started2)
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
31
example/test_pickle1.py
Normal file
31
example/test_pickle1.py
Normal file
@@ -0,0 +1,31 @@
|
||||
r'''>>> import pickle1
|
||||
>>> import re
|
||||
>>> import pickle
|
||||
>>> pickle1.world.__module__
|
||||
'pickle1'
|
||||
>>> pickle1.world.__safe_for_unpickling__
|
||||
1
|
||||
>>> pickle1.world.__reduce__()
|
||||
'world'
|
||||
>>> assert re.match(
|
||||
... "\(<extension class pickle1.world at [0-9a-fA-FxX]+>, \('Hello',\)\)",
|
||||
... repr(pickle1.world('Hello').__reduce__()))
|
||||
>>>
|
||||
>>> wd = pickle1.world('California')
|
||||
>>> pstr = pickle.dumps(wd)
|
||||
>>> wl = pickle.loads(pstr)
|
||||
>>> print wd.greet()
|
||||
Hello from California!
|
||||
>>> print wl.greet()
|
||||
Hello from California!
|
||||
'''
|
||||
|
||||
def run(args = None):
|
||||
if args is not None:
|
||||
import sys
|
||||
sys.argv = args
|
||||
import doctest, test_pickle1
|
||||
doctest.testmod(test_pickle1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
45
example/test_pickle2.py
Normal file
45
example/test_pickle2.py
Normal file
@@ -0,0 +1,45 @@
|
||||
r'''>>> import pickle2
|
||||
>>> import re
|
||||
>>> import pickle
|
||||
>>> pickle2.world.__module__
|
||||
'pickle2'
|
||||
>>> pickle2.world.__safe_for_unpickling__
|
||||
1
|
||||
>>> pickle2.world.__reduce__()
|
||||
'world'
|
||||
>>> assert re.match(
|
||||
... "\(<extension class pickle2.world at [0-9a-fA-FxX]+>, \('Hello',\), \(0,\)\)",
|
||||
... repr(pickle2.world('Hello').__reduce__()))
|
||||
>>>
|
||||
>>> for number in (24, 42):
|
||||
... wd = pickle2.world('California')
|
||||
... wd.set_secret_number(number)
|
||||
... pstr = pickle.dumps(wd)
|
||||
... wl = pickle.loads(pstr)
|
||||
... print wd.greet(), wd.get_secret_number()
|
||||
... print wl.greet(), wl.get_secret_number()
|
||||
Hello from California! 24
|
||||
Hello from California! 24
|
||||
Hello from California! 42
|
||||
Hello from California! 0
|
||||
|
||||
# Now show that the __dict__ is not taken care of.
|
||||
>>> wd = pickle2.world('California')
|
||||
>>> wd.x = 1
|
||||
>>> wd.__dict__
|
||||
{'x': 1}
|
||||
>>> try: pstr = pickle.dumps(wd)
|
||||
... except RuntimeError, err: print err[0]
|
||||
...
|
||||
Incomplete pickle support (__getstate_manages_dict__ not set)
|
||||
'''
|
||||
|
||||
def run(args = None):
|
||||
if args is not None:
|
||||
import sys
|
||||
sys.argv = args
|
||||
import doctest, test_pickle2
|
||||
doctest.testmod(test_pickle2)
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
38
example/test_pickle3.py
Normal file
38
example/test_pickle3.py
Normal file
@@ -0,0 +1,38 @@
|
||||
r'''>>> import pickle3
|
||||
>>> import re
|
||||
>>> import pickle
|
||||
>>> pickle3.world.__module__
|
||||
'pickle3'
|
||||
>>> pickle3.world.__safe_for_unpickling__
|
||||
1
|
||||
>>> pickle3.world.__reduce__()
|
||||
'world'
|
||||
>>> assert re.match(
|
||||
... "\(<extension class pickle3.world at [0-9a-fA-FxX]+>, \('Hello',\), \(\{\}, 0\)\)",
|
||||
... repr(pickle3.world('Hello').__reduce__()))
|
||||
>>>
|
||||
>>> for number in (24, 42):
|
||||
... wd = pickle3.world('California')
|
||||
... wd.set_secret_number(number)
|
||||
... wd.x = 2 * number
|
||||
... wd.y = 'y' * number
|
||||
... wd.z = 3. * number
|
||||
... pstr = pickle.dumps(wd)
|
||||
... wl = pickle.loads(pstr)
|
||||
... print wd.greet(), wd.get_secret_number(), wd.__dict__
|
||||
... print wl.greet(), wl.get_secret_number(), wl.__dict__
|
||||
Hello from California! 24 {'z': 72.0, 'x': 48, 'y': 'yyyyyyyyyyyyyyyyyyyyyyyy'}
|
||||
Hello from California! 24 {'z': 72.0, 'x': 48, 'y': 'yyyyyyyyyyyyyyyyyyyyyyyy'}
|
||||
Hello from California! 42 {'z': 126.0, 'x': 84, 'y': 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'}
|
||||
Hello from California! 0 {'z': 126.0, 'x': 84, 'y': 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'}
|
||||
'''
|
||||
|
||||
def run(args = None):
|
||||
if args is not None:
|
||||
import sys
|
||||
sys.argv = args
|
||||
import doctest, test_pickle3
|
||||
doctest.testmod(test_pickle3)
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
17
example/test_rwgk1.py
Normal file
17
example/test_rwgk1.py
Normal file
@@ -0,0 +1,17 @@
|
||||
r'''>>> import rwgk1
|
||||
>>> print rwgk1.greet()
|
||||
hello, world
|
||||
>>> number = 11
|
||||
>>> print number, '*', number, '=', rwgk1.square(number)
|
||||
11 * 11 = 121
|
||||
'''
|
||||
|
||||
def run(args = None):
|
||||
if args is not None:
|
||||
import sys
|
||||
sys.argv = args
|
||||
import doctest, test_rwgk1
|
||||
doctest.testmod(test_rwgk1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
35
example/test_simple_vector.py
Normal file
35
example/test_simple_vector.py
Normal file
@@ -0,0 +1,35 @@
|
||||
r'''>>> import simple_vector
|
||||
>>> v=simple_vector.vector_double()
|
||||
>>> print v.as_tuple()
|
||||
()
|
||||
>>> v=simple_vector.vector_double(5)
|
||||
>>> print v.as_tuple()
|
||||
(0.0, 0.0, 0.0, 0.0, 0.0)
|
||||
>>> print len(v)
|
||||
5
|
||||
>>> v=simple_vector.vector_double((3,4,5))
|
||||
>>> print v.as_tuple()
|
||||
(3.0, 4.0, 5.0)
|
||||
>>> print v[1]
|
||||
4.0
|
||||
>>> v[1] = 40
|
||||
>>> print v.as_tuple()
|
||||
(3.0, 40.0, 5.0)
|
||||
>>> del v[1]
|
||||
>>> print v.as_tuple()
|
||||
(3.0, 5.0)
|
||||
>>> print simple_vector.foo(11).as_tuple()
|
||||
(0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0)
|
||||
>>> print simple_vector.bar(12).as_tuple()
|
||||
(0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0)
|
||||
'''
|
||||
|
||||
def run(args = None):
|
||||
if args is not None:
|
||||
import sys
|
||||
sys.argv = args
|
||||
import doctest, test_simple_vector
|
||||
doctest.testmod(test_simple_vector)
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
20
example/tst_dvect1.py
Normal file
20
example/tst_dvect1.py
Normal file
@@ -0,0 +1,20 @@
|
||||
def f():
|
||||
import dvect
|
||||
dv = dvect.dvect((1,2,3,4,5))
|
||||
print dv.as_tuple()
|
||||
iv = dv.as_ivect()
|
||||
print iv.as_tuple()
|
||||
print dvect.const_ivect_reference_as_tuple(iv)
|
||||
aiv = dvect.ivect_as_auto_ptr(iv)
|
||||
print dvect.const_ivect_reference_as_tuple(aiv)
|
||||
siv = dvect.ivect_as_shared_ptr(iv)
|
||||
print dvect.const_ivect_reference_as_tuple(siv)
|
||||
print aiv.as_tuple()
|
||||
print siv.as_tuple()
|
||||
|
||||
if (__name__ == "__main__"):
|
||||
import sys, string
|
||||
n = 1
|
||||
if (len(sys.argv) > 1): n = string.atoi(sys.argv[1])
|
||||
for i in xrange(n):
|
||||
f()
|
||||
98
example/tst_dvect2.py
Normal file
98
example/tst_dvect2.py
Normal file
@@ -0,0 +1,98 @@
|
||||
def f(broken_auto_ptr):
|
||||
import dvect
|
||||
import ivect
|
||||
#
|
||||
dv = dvect.dvect((1,2,3,4,5))
|
||||
iv = dv.as_ivect()
|
||||
#
|
||||
aiv = dvect.ivect_as_auto_ptr(iv)
|
||||
print '1. auto_ptr_value_ivect_as_tuple'
|
||||
print ivect.auto_ptr_value_ivect_as_tuple(aiv)
|
||||
print '2. auto_ptr_value_ivect_as_tuple'
|
||||
if (not broken_auto_ptr):
|
||||
print ivect.auto_ptr_value_ivect_as_tuple(aiv)
|
||||
else:
|
||||
print None
|
||||
#
|
||||
adv = dvect.dvect_as_auto_ptr(dv)
|
||||
print '1. auto_ptr_value_dvect_as_tuple'
|
||||
print ivect.auto_ptr_value_dvect_as_tuple(adv)
|
||||
print '2. auto_ptr_value_dvect_as_tuple'
|
||||
if (not broken_auto_ptr):
|
||||
print ivect.auto_ptr_value_dvect_as_tuple(adv)
|
||||
else:
|
||||
print None
|
||||
#
|
||||
siv = dvect.ivect_as_shared_ptr(iv)
|
||||
print '1. shared_ptr_value_ivect_as_tuple'
|
||||
print ivect.shared_ptr_value_ivect_as_tuple(siv)
|
||||
print '2. shared_ptr_value_ivect_as_tuple'
|
||||
print ivect.shared_ptr_value_ivect_as_tuple(siv)
|
||||
#
|
||||
sdv = dvect.dvect_as_shared_ptr(dv)
|
||||
print '1. shared_ptr_value_dvect_as_tuple'
|
||||
print ivect.shared_ptr_value_dvect_as_tuple(sdv)
|
||||
print '2. shared_ptr_value_dvect_as_tuple'
|
||||
print ivect.shared_ptr_value_dvect_as_tuple(sdv)
|
||||
#
|
||||
aiv = dvect.ivect_as_auto_ptr(iv)
|
||||
print '1. auto_ptr_reference_ivect_as_tuple'
|
||||
print ivect.auto_ptr_reference_ivect_as_tuple(aiv)
|
||||
print '2. auto_ptr_reference_ivect_as_tuple'
|
||||
print ivect.auto_ptr_reference_ivect_as_tuple(aiv)
|
||||
#
|
||||
adv = dvect.dvect_as_auto_ptr(dv)
|
||||
print '1. auto_ptr_reference_dvect_as_tuple'
|
||||
print ivect.auto_ptr_reference_dvect_as_tuple(adv)
|
||||
print '2. auto_ptr_reference_dvect_as_tuple'
|
||||
print ivect.auto_ptr_reference_dvect_as_tuple(adv)
|
||||
#
|
||||
siv = dvect.ivect_as_shared_ptr(iv)
|
||||
print '1. shared_ptr_reference_ivect_as_tuple'
|
||||
print ivect.shared_ptr_reference_ivect_as_tuple(siv)
|
||||
print '2. shared_ptr_reference_ivect_as_tuple'
|
||||
print ivect.shared_ptr_reference_ivect_as_tuple(siv)
|
||||
#
|
||||
sdv = dvect.dvect_as_shared_ptr(dv)
|
||||
print '1. shared_ptr_reference_dvect_as_tuple'
|
||||
print ivect.shared_ptr_reference_dvect_as_tuple(sdv)
|
||||
print '2. shared_ptr_reference_dvect_as_tuple'
|
||||
print ivect.shared_ptr_reference_dvect_as_tuple(sdv)
|
||||
#
|
||||
aiv = dvect.ivect_as_auto_ptr(iv)
|
||||
print '1. auto_ptr_const_reference_ivect_as_tuple'
|
||||
print ivect.auto_ptr_const_reference_ivect_as_tuple(aiv)
|
||||
print '2. auto_ptr_const_reference_ivect_as_tuple'
|
||||
print ivect.auto_ptr_const_reference_ivect_as_tuple(aiv)
|
||||
#
|
||||
adv = dvect.dvect_as_auto_ptr(dv)
|
||||
print '1. auto_ptr_const_reference_dvect_as_tuple'
|
||||
print ivect.auto_ptr_const_reference_dvect_as_tuple(adv)
|
||||
print '2. auto_ptr_const_reference_dvect_as_tuple'
|
||||
print ivect.auto_ptr_const_reference_dvect_as_tuple(adv)
|
||||
#
|
||||
siv = dvect.ivect_as_shared_ptr(iv)
|
||||
print '1. shared_ptr_const_reference_ivect_as_tuple'
|
||||
print ivect.shared_ptr_const_reference_ivect_as_tuple(siv)
|
||||
print '2. shared_ptr_const_reference_ivect_as_tuple'
|
||||
print ivect.shared_ptr_const_reference_ivect_as_tuple(siv)
|
||||
#
|
||||
sdv = dvect.dvect_as_shared_ptr(dv)
|
||||
print '1. shared_ptr_const_reference_dvect_as_tuple'
|
||||
print ivect.shared_ptr_const_reference_dvect_as_tuple(sdv)
|
||||
print '2. shared_ptr_const_reference_dvect_as_tuple'
|
||||
print ivect.shared_ptr_const_reference_dvect_as_tuple(sdv)
|
||||
|
||||
if (__name__ == "__main__"):
|
||||
import sys, string
|
||||
broken_auto_ptr = 0
|
||||
n = 1
|
||||
if (len(sys.argv) > 1):
|
||||
if (sys.argv[1] == "--broken-auto-ptr"):
|
||||
broken_auto_ptr = 1
|
||||
if (len(sys.argv) > 2):
|
||||
n = string.atoi(sys.argv[2])
|
||||
else:
|
||||
n = string.atoi(sys.argv[1])
|
||||
for i in xrange(n):
|
||||
f(broken_auto_ptr)
|
||||
20
example/tst_ivect1.py
Normal file
20
example/tst_ivect1.py
Normal file
@@ -0,0 +1,20 @@
|
||||
def f():
|
||||
import ivect
|
||||
iv = ivect.ivect((1,2,3,4,5))
|
||||
print iv.as_tuple()
|
||||
dv = iv.as_dvect()
|
||||
print dv.as_tuple()
|
||||
print ivect.const_dvect_reference_as_tuple(dv)
|
||||
adv = ivect.dvect_as_auto_ptr(dv)
|
||||
print ivect.const_dvect_reference_as_tuple(adv)
|
||||
sdv = ivect.dvect_as_shared_ptr(dv)
|
||||
print ivect.const_dvect_reference_as_tuple(sdv)
|
||||
print adv.as_tuple()
|
||||
print sdv.as_tuple()
|
||||
|
||||
if (__name__ == "__main__"):
|
||||
import sys, string
|
||||
n = 1
|
||||
if (len(sys.argv) > 1): n = string.atoi(sys.argv[1])
|
||||
for i in xrange(n):
|
||||
f()
|
||||
98
example/tst_ivect2.py
Normal file
98
example/tst_ivect2.py
Normal file
@@ -0,0 +1,98 @@
|
||||
def f(broken_auto_ptr):
|
||||
import ivect
|
||||
import dvect
|
||||
#
|
||||
iv = ivect.ivect((1,2,3,4,5))
|
||||
dv = iv.as_dvect()
|
||||
#
|
||||
adv = ivect.dvect_as_auto_ptr(dv)
|
||||
print '1. auto_ptr_value_dvect_as_tuple'
|
||||
print dvect.auto_ptr_value_dvect_as_tuple(adv)
|
||||
print '2. auto_ptr_value_dvect_as_tuple'
|
||||
if (not broken_auto_ptr):
|
||||
print dvect.auto_ptr_value_dvect_as_tuple(adv)
|
||||
else:
|
||||
print None
|
||||
#
|
||||
aiv = ivect.ivect_as_auto_ptr(iv)
|
||||
print '1. auto_ptr_value_ivect_as_tuple'
|
||||
print dvect.auto_ptr_value_ivect_as_tuple(aiv)
|
||||
print '2. auto_ptr_value_ivect_as_tuple'
|
||||
if (not broken_auto_ptr):
|
||||
print dvect.auto_ptr_value_ivect_as_tuple(aiv)
|
||||
else:
|
||||
print None
|
||||
#
|
||||
sdv = ivect.dvect_as_shared_ptr(dv)
|
||||
print '1. shared_ptr_value_dvect_as_tuple'
|
||||
print dvect.shared_ptr_value_dvect_as_tuple(sdv)
|
||||
print '2. shared_ptr_value_dvect_as_tuple'
|
||||
print dvect.shared_ptr_value_dvect_as_tuple(sdv)
|
||||
#
|
||||
siv = ivect.ivect_as_shared_ptr(iv)
|
||||
print '1. shared_ptr_value_ivect_as_tuple'
|
||||
print dvect.shared_ptr_value_ivect_as_tuple(siv)
|
||||
print '2. shared_ptr_value_ivect_as_tuple'
|
||||
print dvect.shared_ptr_value_ivect_as_tuple(siv)
|
||||
#
|
||||
adv = ivect.dvect_as_auto_ptr(dv)
|
||||
print '1. auto_ptr_reference_dvect_as_tuple'
|
||||
print dvect.auto_ptr_reference_dvect_as_tuple(adv)
|
||||
print '2. auto_ptr_reference_dvect_as_tuple'
|
||||
print dvect.auto_ptr_reference_dvect_as_tuple(adv)
|
||||
#
|
||||
aiv = ivect.ivect_as_auto_ptr(iv)
|
||||
print '1. auto_ptr_reference_ivect_as_tuple'
|
||||
print dvect.auto_ptr_reference_ivect_as_tuple(aiv)
|
||||
print '2. auto_ptr_reference_ivect_as_tuple'
|
||||
print dvect.auto_ptr_reference_ivect_as_tuple(aiv)
|
||||
#
|
||||
sdv = ivect.dvect_as_shared_ptr(dv)
|
||||
print '1. shared_ptr_reference_dvect_as_tuple'
|
||||
print dvect.shared_ptr_reference_dvect_as_tuple(sdv)
|
||||
print '2. shared_ptr_reference_dvect_as_tuple'
|
||||
print dvect.shared_ptr_reference_dvect_as_tuple(sdv)
|
||||
#
|
||||
siv = ivect.ivect_as_shared_ptr(iv)
|
||||
print '1. shared_ptr_reference_ivect_as_tuple'
|
||||
print dvect.shared_ptr_reference_ivect_as_tuple(siv)
|
||||
print '2. shared_ptr_reference_ivect_as_tuple'
|
||||
print dvect.shared_ptr_reference_ivect_as_tuple(siv)
|
||||
#
|
||||
adv = ivect.dvect_as_auto_ptr(dv)
|
||||
print '1. auto_ptr_const_reference_dvect_as_tuple'
|
||||
print dvect.auto_ptr_const_reference_dvect_as_tuple(adv)
|
||||
print '2. auto_ptr_const_reference_dvect_as_tuple'
|
||||
print dvect.auto_ptr_const_reference_dvect_as_tuple(adv)
|
||||
#
|
||||
aiv = ivect.ivect_as_auto_ptr(iv)
|
||||
print '1. auto_ptr_const_reference_ivect_as_tuple'
|
||||
print dvect.auto_ptr_const_reference_ivect_as_tuple(aiv)
|
||||
print '2. auto_ptr_const_reference_ivect_as_tuple'
|
||||
print dvect.auto_ptr_const_reference_ivect_as_tuple(aiv)
|
||||
#
|
||||
sdv = ivect.dvect_as_shared_ptr(dv)
|
||||
print '1. shared_ptr_const_reference_dvect_as_tuple'
|
||||
print dvect.shared_ptr_const_reference_dvect_as_tuple(sdv)
|
||||
print '2. shared_ptr_const_reference_dvect_as_tuple'
|
||||
print dvect.shared_ptr_const_reference_dvect_as_tuple(sdv)
|
||||
#
|
||||
siv = ivect.ivect_as_shared_ptr(iv)
|
||||
print '1. shared_ptr_const_reference_ivect_as_tuple'
|
||||
print dvect.shared_ptr_const_reference_ivect_as_tuple(siv)
|
||||
print '2. shared_ptr_const_reference_ivect_as_tuple'
|
||||
print dvect.shared_ptr_const_reference_ivect_as_tuple(siv)
|
||||
|
||||
if (__name__ == "__main__"):
|
||||
import sys, string
|
||||
broken_auto_ptr = 0
|
||||
n = 1
|
||||
if (len(sys.argv) > 1):
|
||||
if (sys.argv[1] == "--broken-auto-ptr"):
|
||||
broken_auto_ptr = 1
|
||||
if (len(sys.argv) > 2):
|
||||
n = string.atoi(sys.argv[2])
|
||||
else:
|
||||
n = string.atoi(sys.argv[1])
|
||||
for i in xrange(n):
|
||||
f(broken_auto_ptr)
|
||||
16
example/tst_noncopyable.py
Normal file
16
example/tst_noncopyable.py
Normal file
@@ -0,0 +1,16 @@
|
||||
def f():
|
||||
import noncopyable_export
|
||||
import noncopyable_import
|
||||
s1 = noncopyable_export.store(1)
|
||||
print s1.recall()
|
||||
s2 = noncopyable_export.store(2)
|
||||
print s2.recall()
|
||||
s3 = noncopyable_import.add_stores(s1, s2)
|
||||
print s3.recall()
|
||||
|
||||
if (__name__ == "__main__"):
|
||||
import sys, string
|
||||
n = 1
|
||||
if (len(sys.argv) > 1): n = string.atoi(sys.argv[1])
|
||||
for i in xrange(n):
|
||||
f()
|
||||
Reference in New Issue
Block a user