| // (C) Copyright 2006 Douglas Gregor <doug.gregor -at- gmail.com> |
| |
| // 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) |
| |
| // Authors: Douglas Gregor |
| |
| /** @file serialize.cpp |
| * |
| * This file provides Boost.Serialization support for Python objects. |
| */ |
| #include <boost/mpi/python/serialize.hpp> |
| #include <boost/mpi/python/skeleton_and_content.hpp> |
| #include <boost/mpi.hpp> |
| |
| namespace boost { namespace python { |
| |
| struct pickle::data_t { |
| object module; |
| object dumps; |
| object loads; |
| }; |
| |
| |
| /// Data used for communicating with the Python `pickle' module. |
| pickle::data_t* pickle::data; |
| |
| str pickle::dumps(object obj, int protocol) |
| { |
| if (!data) initialize_data(); |
| return extract<str>((data->dumps)(obj, protocol)); |
| } |
| |
| object pickle::loads(str s) |
| { |
| if (!data) initialize_data(); |
| return ((data->loads)(s)); |
| } |
| |
| void pickle::initialize_data() |
| { |
| data = new data_t; |
| data->module = object(handle<>(PyImport_ImportModule("pickle"))); |
| data->dumps = data->module.attr("dumps"); |
| data->loads = data->module.attr("loads"); |
| } |
| |
| } } // end namespace boost::python |
| |
| BOOST_PYTHON_DIRECT_SERIALIZATION_ARCHIVE_IMPL( |
| ::boost::mpi::packed_iarchive, |
| ::boost::mpi::packed_oarchive) |
| |
| namespace boost { namespace mpi { namespace python { namespace detail { |
| |
| boost::python::object skeleton_proxy_base_type; |
| |
| // A map from Python type objects to skeleton/content handlers |
| typedef std::map<PyTypeObject*, skeleton_content_handler> |
| skeleton_content_handlers_type; |
| |
| BOOST_MPI_PYTHON_DECL skeleton_content_handlers_type skeleton_content_handlers; |
| |
| bool |
| skeleton_and_content_handler_registered(PyTypeObject* type) |
| { |
| return |
| skeleton_content_handlers.find(type) != skeleton_content_handlers.end(); |
| } |
| |
| void |
| register_skeleton_and_content_handler(PyTypeObject* type, |
| const skeleton_content_handler& handler) |
| { |
| skeleton_content_handlers[type] = handler; |
| } |
| |
| } } } } // end namespace boost::mpi::python::detail |