// Module test_array_ext.cpp // // Copyright (c) 2003 Raoul M. Gough // // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy // at http://www.boost.org/LICENSE_1_0.txt) // // History // ======= // 2003/10/15 rmg File creation from testlinear.cpp // // $Id$ // #include "int_wrapper.hpp" #include #include #include #include #include #include // More messiness from not having a separate int_wrapper.cpp file bool int_wrapper::our_trace_flag = true; unsigned int_wrapper::our_object_counter = 0; boost::python::indexing::iterator_range get_array_plain() { static int array[] = { 8, 6, 4, 2, 1, 3, 5, 7, 0 }; return BOOST_MAKE_ITERATOR_RANGE (array); } boost::python::indexing::iterator_range get_array_wrap() { static int_wrapper array[] = { int_wrapper(8), int_wrapper(6), int_wrapper(4), int_wrapper(2), int_wrapper(1), int_wrapper(3), int_wrapper(5), int_wrapper(7), int_wrapper(0) }; return BOOST_MAKE_ITERATOR_RANGE (array); } BOOST_PYTHON_MODULE(test_array_ext) { namespace indexing = boost::python::indexing; boost::python::implicitly_convertible (); boost::python::def ("setTrace", &int_wrapper::setTrace); boost::python::class_("int_wrapper", boost::python::init()) .def ("increment", &int_wrapper::increment) .def ("__repr__", &int_wrapper::repr) .def ("__cmp__", compare) ; typedef indexing::iterator_range Container1; typedef indexing::iterator_range Container2; #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) typedef indexing::container_suite Suite1; typedef indexing::container_suite Suite2; #else typedef indexing::iterator_range_suite Suite1; typedef indexing::iterator_range_suite Suite2; #endif boost::python::class_ ("Array", boost::python::init()) .def (Suite1()); boost::python::def ("get_array_plain", get_array_plain); // reference_existing_object is safe in this case, because the array // is static, and we never manually destroy any array elements. There // is also no point in using return_internal_reference to extend the // life of the iterator_range object, since it has no influence on the // lifetimes of the array elements. boost::python::class_ ("Array_ref", boost::python::init()) .def (Suite2::with_policies( boost::python::return_value_policy< boost::python::reference_existing_object>())); boost::python::def ("get_array_wrap", get_array_wrap); }