mirror of
https://github.com/boostorg/python.git
synced 2026-01-28 07:22:31 +00:00
test_richcmp1.py now works with vc60.
[SVN r10657]
This commit is contained in:
@@ -6,29 +6,51 @@
|
||||
#include <boost/python/class_builder.hpp>
|
||||
#include "vector_wrapper.h"
|
||||
|
||||
namespace std {
|
||||
namespace vects {
|
||||
|
||||
# define VECTOR_BINARY_OPERATORS(oper) \
|
||||
template <class T> \
|
||||
std::vector<bool> \
|
||||
operator##oper(const std::vector<T>& a, const std::vector<T>& b) \
|
||||
{ \
|
||||
if (a.size()!=b.size()){throw boost::python::argument_error();} \
|
||||
std::vector<bool> result(a.size()); \
|
||||
for (std::size_t i=0; i<a.size(); i++) { \
|
||||
result[i] = (a[i] ##oper b[i]); \
|
||||
} \
|
||||
return result; \
|
||||
}
|
||||
VECTOR_BINARY_OPERATORS(<)
|
||||
VECTOR_BINARY_OPERATORS(<=)
|
||||
VECTOR_BINARY_OPERATORS(==)
|
||||
VECTOR_BINARY_OPERATORS(!=)
|
||||
VECTOR_BINARY_OPERATORS(>)
|
||||
VECTOR_BINARY_OPERATORS(>=)
|
||||
# undef VECTOR_BINARY_OPERATORS
|
||||
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 (std::size_t 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 (std::size_t i = 0; i < size(); i++)
|
||||
t.set_item(i,
|
||||
boost::python::ref(BOOST_PYTHON_CONVERSION::to_python((*this)[i])));
|
||||
return t;
|
||||
}
|
||||
|
||||
# define DVECT_BINARY_OPERATORS(oper) \
|
||||
friend std::vector<bool> \
|
||||
operator##oper(const dvect& lhs, const dvect& rhs) \
|
||||
{ \
|
||||
if (lhs.size()!=rhs.size()){throw boost::python::argument_error();} \
|
||||
std::vector<bool> result(lhs.size()); \
|
||||
for (std::size_t i=0; i<lhs.size(); i++) { \
|
||||
result[i] = (lhs[i] ##oper rhs[i]); \
|
||||
} \
|
||||
return result; \
|
||||
}
|
||||
DVECT_BINARY_OPERATORS(<)
|
||||
DVECT_BINARY_OPERATORS(<=)
|
||||
DVECT_BINARY_OPERATORS(==)
|
||||
DVECT_BINARY_OPERATORS(!=)
|
||||
DVECT_BINARY_OPERATORS(>)
|
||||
DVECT_BINARY_OPERATORS(>=)
|
||||
# undef VECTOR_BINARY_OPERATORS
|
||||
};
|
||||
|
||||
} // namespace vects
|
||||
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -37,16 +59,16 @@ namespace {
|
||||
(void)
|
||||
example::wrap_vector(this_module, "vector_of_bool", bool());
|
||||
|
||||
boost::python::class_builder<
|
||||
std::vector<double>, example::vector_wrapper<double> >
|
||||
py_vector_of_double =
|
||||
example::wrap_vector(this_module, "vector_of_double", double());
|
||||
boost::python::class_builder<vects::dvect> py_dvect(this_module, "dvect");
|
||||
|
||||
py_dvect.def(boost::python::constructor<boost::python::tuple>());
|
||||
py_dvect.def(&vects::dvect::as_tuple, "as_tuple");
|
||||
|
||||
const long comp_operators =
|
||||
( boost::python::op_lt | boost::python::op_le
|
||||
| boost::python::op_eq | boost::python::op_ne
|
||||
| boost::python::op_gt | boost::python::op_ge);
|
||||
py_vector_of_double.def(boost::python::operators<comp_operators>());
|
||||
py_dvect.def(boost::python::operators<comp_operators>());
|
||||
}
|
||||
|
||||
} // namespace <anonymous>
|
||||
@@ -55,7 +77,7 @@ BOOST_PYTHON_MODULE_INIT(richcmp1)
|
||||
{
|
||||
try {
|
||||
boost::python::module_builder this_module("richcmp1");
|
||||
// The actual work is done in separate function in order
|
||||
// The actual work is done in a separate function in order
|
||||
// to suppress a bogus VC60 warning.
|
||||
init_module(this_module);
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ BOOST_PYTHON_MODULE_INIT(richcmp2)
|
||||
{
|
||||
try {
|
||||
boost::python::module_builder this_module("richcmp2");
|
||||
// The actual work is done in separate function in order
|
||||
// The actual work is done in a separate function in order
|
||||
// to suppress a bogus VC60 warning.
|
||||
init_module(this_module);
|
||||
}
|
||||
|
||||
@@ -243,7 +243,7 @@ BOOST_PYTHON_MODULE_INIT(richcmp3)
|
||||
{
|
||||
try {
|
||||
boost::python::module_builder this_module("richcmp3");
|
||||
// The actual work is done in separate function in order
|
||||
// The actual work is done in a separate function in order
|
||||
// to suppress a bogus VC60 warning.
|
||||
init_module(this_module);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import richcmp1
|
||||
d1 = richcmp1.vector_of_double((0, 1, 3, 3, 6, 7))
|
||||
d2 = richcmp1.vector_of_double((1, 2, 3, 4, 5, 6))
|
||||
d1 = richcmp1.dvect((0, 1, 3, 3, 6, 7))
|
||||
d2 = richcmp1.dvect((1, 2, 3, 4, 5, 6))
|
||||
print d1.as_tuple()
|
||||
print d2.as_tuple()
|
||||
print (d1 < d2).as_tuple()
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
// Based on wrapVector.hh by Mike Owen and Jeff Johnson.
|
||||
// http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/spheral/src/src/BPLWraps/CXXWraps/
|
||||
|
||||
|
||||
#ifndef BOOST_PYTHON_EXAMPLE_VECTOR_WRAPPER_H
|
||||
#define BOOST_PYTHON_EXAMPLE_VECTOR_WRAPPER_H
|
||||
|
||||
|
||||
#include <boost/python/class_builder.hpp>
|
||||
|
||||
|
||||
namespace example {
|
||||
|
||||
// A wrapper is used to define additional constructors. This wrapper
|
||||
@@ -18,10 +18,10 @@ namespace example {
|
||||
vector_wrapper(PyObject*,
|
||||
const std::vector<T>& vec):
|
||||
std::vector<T>(vec) {}
|
||||
|
||||
|
||||
vector_wrapper(PyObject* self):
|
||||
std::vector<T>() {}
|
||||
|
||||
|
||||
vector_wrapper(PyObject* self,
|
||||
std::size_t n):
|
||||
std::vector<T>(n) {}
|
||||
@@ -46,18 +46,18 @@ namespace example {
|
||||
struct vector_access
|
||||
{
|
||||
static
|
||||
const T
|
||||
T
|
||||
getitem(const std::vector<T>& vec,
|
||||
const std::size_t key)
|
||||
std::size_t key)
|
||||
{
|
||||
if (key >= vec.size()) raise_vector_IndexError();
|
||||
return vec[key];
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
void
|
||||
setitem(std::vector<T>& vec,
|
||||
const std::size_t key,
|
||||
std::size_t key,
|
||||
const T &value)
|
||||
{
|
||||
if (key >= vec.size()) raise_vector_IndexError();
|
||||
@@ -65,9 +65,9 @@ namespace example {
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
void
|
||||
delitem(std::vector<T>& vec,
|
||||
const std::size_t key)
|
||||
std::size_t key)
|
||||
{
|
||||
if (key >= vec.size()) raise_vector_IndexError();
|
||||
vec.erase(vec.begin() + key);
|
||||
@@ -75,7 +75,7 @@ namespace example {
|
||||
|
||||
// Convert vector<T> to a regular Python tuple.
|
||||
static
|
||||
boost::python::tuple
|
||||
boost::python::tuple
|
||||
as_tuple(const std::vector<T>& vec)
|
||||
{
|
||||
// Create a python type of size vec.size().
|
||||
@@ -87,7 +87,7 @@ namespace example {
|
||||
return t;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// This function will build a vector<T> and add it to the given
|
||||
// module with the given name.
|
||||
template <typename T>
|
||||
@@ -113,5 +113,5 @@ namespace example {
|
||||
return py_vector;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif // BOOST_PYTHON_EXAMPLE_VECTOR_WRAPPER_H
|
||||
|
||||
Reference in New Issue
Block a user