diff --git a/build/filemgr.py b/build/filemgr.py index 2ff163f0..99f4ca30 100644 --- a/build/filemgr.py +++ b/build/filemgr.py @@ -24,6 +24,7 @@ bpl_exa + "/getting_started1.cpp", bpl_exa + "/getting_started2.cpp", bpl_exa + "/simple_vector.cpp", bpl_exa + "/do_it_yourself_convts.cpp", +bpl_exa + "/nested.cpp", bpl_exa + "/pickle1.cpp", bpl_exa + "/pickle2.cpp", bpl_exa + "/pickle3.cpp", @@ -32,6 +33,7 @@ bpl_exa + "/test_getting_started1.py", bpl_exa + "/test_getting_started2.py", bpl_exa + "/test_simple_vector.py", bpl_exa + "/test_do_it_yourself_convts.py", +bpl_exa + "/test_nested.py", bpl_exa + "/test_pickle1.py", bpl_exa + "/test_pickle2.py", bpl_exa + "/test_pickle3.py", @@ -68,6 +70,7 @@ defs = ( "getting_started2", "simple_vector", "do_it_yourself_convts", +"nested", "pickle1", "pickle2", "pickle3", diff --git a/build/irix_CC.mak b/build/irix_CC.mak index 6e465b98..e3a97781 100644 --- a/build/irix_CC.mak +++ b/build/irix_CC.mak @@ -44,6 +44,7 @@ DEPOBJ=$(OBJ) \ getting_started1.o getting_started2.o \ simple_vector.o \ do_it_yourself_convts.o \ + nested.o \ pickle1.o pickle2.o pickle3.o \ noncopyable_export.o noncopyable_import.o \ ivect.o dvect.o \ @@ -57,6 +58,7 @@ all: libboost_python.a \ getting_started1.so getting_started2.so \ simple_vector.so \ do_it_yourself_convts.so \ + nested.so \ pickle1.so pickle2.so pickle3.so \ noncopyable_export.so noncopyable_import.so \ ivect.so dvect.so \ @@ -84,6 +86,9 @@ simple_vector.so: $(OBJ) simple_vector.o do_it_yourself_convts.so: $(OBJ) do_it_yourself_convts.o $(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.o -o do_it_yourself_convts.so +nested.so: $(OBJ) nested.o + $(LD) $(LDOPTS) $(OBJ) nested.o -o nested.so + pickle1.so: $(OBJ) pickle1.o $(LD) $(LDOPTS) $(OBJ) pickle1.o -o pickle1.so @@ -126,6 +131,7 @@ test: $(PYEXE) test_getting_started2.py $(PYEXE) test_simple_vector.py $(PYEXE) test_do_it_yourself_convts.py + $(PYEXE) test_nested.py $(PYEXE) test_pickle1.py $(PYEXE) test_pickle2.py $(PYEXE) test_pickle3.py @@ -142,6 +148,7 @@ clean: rm -f getting_started2.o getting_started2.so rm -f simple_vector.o simple_vector.so rm -f do_it_yourself_convts.o do_it_yourself_convts.so + rm -f nested.o nested.so rm -f pickle1.o pickle1.so rm -f pickle2.o pickle2.so rm -f pickle3.o pickle3.so diff --git a/build/linux_gcc.mak b/build/linux_gcc.mak index 2c977473..64d61bab 100644 --- a/build/linux_gcc.mak +++ b/build/linux_gcc.mak @@ -45,6 +45,7 @@ DEPOBJ=$(OBJ) \ getting_started1.o getting_started2.o \ simple_vector.o \ do_it_yourself_convts.o \ + nested.o \ pickle1.o pickle2.o pickle3.o \ noncopyable_export.o noncopyable_import.o \ ivect.o dvect.o \ @@ -58,6 +59,7 @@ all: libboost_python.a \ getting_started1.so getting_started2.so \ simple_vector.so \ do_it_yourself_convts.so \ + nested.so \ pickle1.so pickle2.so pickle3.so \ noncopyable_export.so noncopyable_import.so \ ivect.so dvect.so \ @@ -85,6 +87,9 @@ simple_vector.so: $(OBJ) simple_vector.o do_it_yourself_convts.so: $(OBJ) do_it_yourself_convts.o $(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.o -o do_it_yourself_convts.so +nested.so: $(OBJ) nested.o + $(LD) $(LDOPTS) $(OBJ) nested.o -o nested.so + pickle1.so: $(OBJ) pickle1.o $(LD) $(LDOPTS) $(OBJ) pickle1.o -o pickle1.so @@ -127,6 +132,7 @@ test: $(PYEXE) test_getting_started2.py $(PYEXE) test_simple_vector.py $(PYEXE) test_do_it_yourself_convts.py + $(PYEXE) test_nested.py $(PYEXE) test_pickle1.py $(PYEXE) test_pickle2.py $(PYEXE) test_pickle3.py @@ -143,6 +149,7 @@ clean: rm -f getting_started2.o getting_started2.so rm -f simple_vector.o simple_vector.so rm -f do_it_yourself_convts.o do_it_yourself_convts.so + rm -f nested.o nested.so rm -f pickle1.o pickle1.so rm -f pickle2.o pickle2.so rm -f pickle3.o pickle3.so diff --git a/build/mingw32.mak b/build/mingw32.mak index e966f48a..bf590409 100644 --- a/build/mingw32.mak +++ b/build/mingw32.mak @@ -30,13 +30,16 @@ # -fvtable-thunks eliminates the compiler warning, but # "import boost_python_test" still causes a crash. -ROOT=L: +ROOT=R: BOOST_WIN="$(ROOT)\boost" BOOST_UNIX=$(HOME)/boost PYEXE="C:\Program files\Python\python.exe" PYINC=-I"C:\usr\include\python1.5" PYLIB="C:\usr\lib\libpython15.a" +#PYEXE="C:\Python21\python.exe" +#PYINC=-I"C:\usr\include\python2.1" +#PYLIB="C:\usr\lib\libpython21.a" STDOPTS=-ftemplate-depth-21 WARNOPTS= @@ -60,6 +63,7 @@ all: libboost_python.a \ getting_started1.pyd getting_started2.pyd \ simple_vector.pyd \ do_it_yourself_convts.pyd \ + nested.pyd \ pickle1.pyd pickle2.pyd pickle3.pyd \ noncopyable_export.pyd noncopyable_import.pyd \ ivect.pyd dvect.pyd \ @@ -108,6 +112,12 @@ do_it_yourself_convts.pyd: $(OBJ) do_it_yourself_convts.o --def do_it_yourself_convts.def \ $(OBJ) do_it_yourself_convts.o $(PYLIB) +nested.pyd: $(OBJ) nested.o + dllwrap $(DLLWRAPOPTS) \ + --dllname nested.pyd \ + --def nested.def \ + $(OBJ) nested.o $(PYLIB) + pickle1.pyd: $(OBJ) pickle1.o dllwrap $(DLLWRAPOPTS) \ --dllname pickle1.pyd \ @@ -178,6 +188,7 @@ test: $(PYEXE) test_getting_started2.py $(PYEXE) test_simple_vector.py $(PYEXE) test_do_it_yourself_convts.py + $(PYEXE) test_nested.py $(PYEXE) test_pickle1.py $(PYEXE) test_pickle2.py $(PYEXE) test_pickle3.py diff --git a/build/tru64_cxx.mak b/build/tru64_cxx.mak index fba2bfe1..d06f3372 100644 --- a/build/tru64_cxx.mak +++ b/build/tru64_cxx.mak @@ -55,6 +55,7 @@ DEPOBJ=$(OBJ) \ getting_started1.o getting_started2.o \ simple_vector.o \ do_it_yourself_convts.o \ + nested.o \ pickle1.o pickle2.o pickle3.o \ noncopyable_export.o noncopyable_import.o \ ivect.o dvect.o \ @@ -68,6 +69,7 @@ all: libboost_python.a \ getting_started1.so getting_started2.so \ simple_vector.so \ do_it_yourself_convts.so \ + nested.so \ pickle1.so pickle2.so pickle3.so \ noncopyable_export.so noncopyable_import.so \ ivect.so dvect.so \ @@ -99,6 +101,9 @@ simple_vector.so: $(OBJ) simple_vector.o do_it_yourself_convts.so: $(OBJ) do_it_yourself_convts.o $(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.o -o do_it_yourself_convts.so +nested.so: $(OBJ) nested.o + $(LD) $(LDOPTS) $(OBJ) nested.o -o nested.so + pickle1.so: $(OBJ) pickle1.o $(LD) $(LDOPTS) $(OBJ) pickle1.o -o pickle1.so @@ -141,6 +146,7 @@ test: $(PYEXE) test_getting_started2.py $(PYEXE) test_simple_vector.py $(PYEXE) test_do_it_yourself_convts.py + $(PYEXE) test_nested.py $(PYEXE) test_pickle1.py $(PYEXE) test_pickle2.py $(PYEXE) test_pickle3.py @@ -157,6 +163,7 @@ clean: rm -f getting_started2.o getting_started2.so rm -f simple_vector.o simple_vector.so rm -f do_it_yourself_convts.o do_it_yourself_convts.so + rm -f nested.o nested.so rm -f pickle1.o pickle1.so rm -f pickle2.o pickle2.so rm -f pickle3.o pickle3.so diff --git a/build/vc60.mak b/build/vc60.mak index ae655c14..a348de54 100644 --- a/build/vc60.mak +++ b/build/vc60.mak @@ -10,7 +10,7 @@ # 12 Apr 01 new macro ROOT to simplify configuration (R.W. Grosse-Kunstleve) # Initial version: R.W. Grosse-Kunstleve -ROOT=L: +ROOT=R: BOOST_WIN="$(ROOT)\boost" BOOST_UNIX=$(HOME)/boost @@ -44,6 +44,7 @@ all: boost_python.lib \ getting_started1.pyd getting_started2.pyd \ simple_vector.pyd \ do_it_yourself_convts.pyd \ + nested.pyd \ pickle1.pyd pickle2.pyd pickle3.pyd \ noncopyable_export.pyd noncopyable_import.pyd \ ivect.pyd dvect.pyd \ @@ -70,6 +71,9 @@ simple_vector.pyd: $(OBJ) simple_vector.obj do_it_yourself_convts.pyd: $(OBJ) do_it_yourself_convts.obj $(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.obj $(PYLIB) /export:initdo_it_yourself_convts /out:"do_it_yourself_convts.pyd" +nested.pyd: $(OBJ) nested.obj + $(LD) $(LDOPTS) $(OBJ) nested.obj $(PYLIB) /export:initnested /out:"nested.pyd" + pickle1.pyd: $(OBJ) pickle1.obj $(LD) $(LDOPTS) $(OBJ) pickle1.obj $(PYLIB) /export:initpickle1 /out:"pickle1.pyd" @@ -110,6 +114,7 @@ test: $(PYEXE) test_getting_started2.py $(PYEXE) test_simple_vector.py $(PYEXE) test_do_it_yourself_convts.py + $(PYEXE) test_nested.py $(PYEXE) test_pickle1.py $(PYEXE) test_pickle2.py $(PYEXE) test_pickle3.py diff --git a/example/nested.cpp b/example/nested.cpp new file mode 100644 index 00000000..543754f7 --- /dev/null +++ b/example/nested.cpp @@ -0,0 +1,44 @@ +// Example by Ralf W. Grosse-Kunstleve + +/* + This example shows how convert a nested Python tuple. + */ + +#include +#include + +namespace { + + boost::python::list + show_nested_tuples(boost::python::tuple outer) + { + boost::python::list result; + for (int i = 0; i < outer.size(); i++) { + boost::python::tuple inner( + BOOST_PYTHON_CONVERSION::from_python(outer[i].get(), + boost::python::type())); + for (int j = 0; j < inner.size(); j++) { + double x = BOOST_PYTHON_CONVERSION::from_python(inner[j].get(), + boost::python::type()); + char buf[128]; + sprintf(buf, "(%d,%d) %.6g", i, j, x); + result.append(BOOST_PYTHON_CONVERSION::to_python(std::string(buf))); + } + } + return result; + } + +} + +BOOST_PYTHON_MODULE_INIT(nested) +{ + try + { + boost::python::module_builder this_module("nested"); + this_module.def(show_nested_tuples, "show_nested_tuples"); + } + catch(...) + { + boost::python::handle_exception(); + } +} diff --git a/example/test_nested.py b/example/test_nested.py new file mode 100644 index 00000000..e9abbf0f --- /dev/null +++ b/example/test_nested.py @@ -0,0 +1,23 @@ +r'''>>> import nested + >>> s = nested.show_nested_tuples(((1,2,3), (4,5,6,7))) + >>> for l in s: + ... print l + (0,0) 1 + (0,1) 2 + (0,2) 3 + (1,0) 4 + (1,1) 5 + (1,2) 6 + (1,3) 7 +''' + +def run(args = None): + if args is not None: + import sys + sys.argv = args + import doctest, test_nested + return doctest.testmod(test_nested) + +if __name__ == '__main__': + import sys + sys.exit(run()[0])