diff options
Diffstat (limited to 'boost/python/object/pickle_support.hpp')
-rw-r--r-- | boost/python/object/pickle_support.hpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/boost/python/object/pickle_support.hpp b/boost/python/object/pickle_support.hpp new file mode 100644 index 0000000000..cbdbcbb9d6 --- /dev/null +++ b/boost/python/object/pickle_support.hpp @@ -0,0 +1,124 @@ +// (C) Copyright R.W. Grosse-Kunstleve 2002. +// Distributed under 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) +#ifndef BOOST_PYTHON_OBJECT_PICKLE_SUPPORT_RWGK20020603_HPP +# define BOOST_PYTHON_OBJECT_PICKLE_SUPPORT_RWGK20020603_HPP + +# include <boost/python/detail/prefix.hpp> + +namespace boost { namespace python { + +namespace api +{ + class object; +} +using api::object; +class tuple; + +BOOST_PYTHON_DECL object const& make_instance_reduce_function(); + +struct pickle_suite; + +namespace error_messages { + + template <class T> + struct missing_pickle_suite_function_or_incorrect_signature {}; + + inline void must_be_derived_from_pickle_suite(pickle_suite const&) {} +} + +namespace detail { struct pickle_suite_registration; } + +struct pickle_suite +{ + private: + struct inaccessible {}; + friend struct detail::pickle_suite_registration; + public: + static inaccessible* getinitargs() { return 0; } + static inaccessible* getstate() { return 0; } + static inaccessible* setstate() { return 0; } + static bool getstate_manages_dict() { return false; } +}; + +namespace detail { + + struct pickle_suite_registration + { + typedef pickle_suite::inaccessible inaccessible; + + template <class Class_, class Tgetinitargs> + static + void + register_( + Class_& cl, + tuple (*getinitargs_fn)(Tgetinitargs), + inaccessible* (* /*getstate_fn*/)(), + inaccessible* (* /*setstate_fn*/)(), + bool) + { + cl.enable_pickling_(false); + cl.def("__getinitargs__", getinitargs_fn); + } + + template <class Class_, + class Rgetstate, class Tgetstate, + class Tsetstate, class Ttuple> + static + void + register_( + Class_& cl, + inaccessible* (* /*getinitargs_fn*/)(), + Rgetstate (*getstate_fn)(Tgetstate), + void (*setstate_fn)(Tsetstate, Ttuple), + bool getstate_manages_dict) + { + cl.enable_pickling_(getstate_manages_dict); + cl.def("__getstate__", getstate_fn); + cl.def("__setstate__", setstate_fn); + } + + template <class Class_, + class Tgetinitargs, + class Rgetstate, class Tgetstate, + class Tsetstate, class Ttuple> + static + void + register_( + Class_& cl, + tuple (*getinitargs_fn)(Tgetinitargs), + Rgetstate (*getstate_fn)(Tgetstate), + void (*setstate_fn)(Tsetstate, Ttuple), + bool getstate_manages_dict) + { + cl.enable_pickling_(getstate_manages_dict); + cl.def("__getinitargs__", getinitargs_fn); + cl.def("__getstate__", getstate_fn); + cl.def("__setstate__", setstate_fn); + } + + template <class Class_> + static + void + register_( + Class_&, + ...) + { + typedef typename + error_messages::missing_pickle_suite_function_or_incorrect_signature< + Class_>::error_type error_type; + } + }; + + template <typename PickleSuiteType> + struct pickle_suite_finalize + : PickleSuiteType, + pickle_suite_registration + {}; + +} // namespace detail + +}} // namespace boost::python + +#endif // BOOST_PYTHON_OBJECT_PICKLE_SUPPORT_RWGK20020603_HPP |