Chris@16: // (C) Copyright R.W. Grosse-Kunstleve 2002. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: #ifndef BOOST_PYTHON_OBJECT_PICKLE_SUPPORT_RWGK20020603_HPP Chris@16: # define BOOST_PYTHON_OBJECT_PICKLE_SUPPORT_RWGK20020603_HPP Chris@16: Chris@16: # include Chris@16: Chris@16: namespace boost { namespace python { Chris@16: Chris@16: namespace api Chris@16: { Chris@16: class object; Chris@16: } Chris@16: using api::object; Chris@16: class tuple; Chris@16: Chris@16: BOOST_PYTHON_DECL object const& make_instance_reduce_function(); Chris@16: Chris@16: struct pickle_suite; Chris@16: Chris@16: namespace error_messages { Chris@16: Chris@16: template Chris@16: struct missing_pickle_suite_function_or_incorrect_signature {}; Chris@16: Chris@16: inline void must_be_derived_from_pickle_suite(pickle_suite const&) {} Chris@16: } Chris@16: Chris@16: namespace detail { struct pickle_suite_registration; } Chris@16: Chris@16: struct pickle_suite Chris@16: { Chris@16: private: Chris@16: struct inaccessible {}; Chris@16: friend struct detail::pickle_suite_registration; Chris@16: public: Chris@16: static inaccessible* getinitargs() { return 0; } Chris@16: static inaccessible* getstate() { return 0; } Chris@16: static inaccessible* setstate() { return 0; } Chris@16: static bool getstate_manages_dict() { return false; } Chris@16: }; Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: struct pickle_suite_registration Chris@16: { Chris@16: typedef pickle_suite::inaccessible inaccessible; Chris@16: Chris@16: template Chris@16: static Chris@16: void Chris@16: register_( Chris@16: Class_& cl, Chris@16: tuple (*getinitargs_fn)(Tgetinitargs), Chris@16: inaccessible* (* /*getstate_fn*/)(), Chris@16: inaccessible* (* /*setstate_fn*/)(), Chris@16: bool) Chris@16: { Chris@16: cl.enable_pickling_(false); Chris@16: cl.def("__getinitargs__", getinitargs_fn); Chris@16: } Chris@16: Chris@16: template Chris@16: static Chris@16: void Chris@16: register_( Chris@16: Class_& cl, Chris@16: inaccessible* (* /*getinitargs_fn*/)(), Chris@16: Rgetstate (*getstate_fn)(Tgetstate), Chris@16: void (*setstate_fn)(Tsetstate, Ttuple), Chris@16: bool getstate_manages_dict) Chris@16: { Chris@16: cl.enable_pickling_(getstate_manages_dict); Chris@16: cl.def("__getstate__", getstate_fn); Chris@16: cl.def("__setstate__", setstate_fn); Chris@16: } Chris@16: Chris@16: template Chris@16: static Chris@16: void Chris@16: register_( Chris@16: Class_& cl, Chris@16: tuple (*getinitargs_fn)(Tgetinitargs), Chris@16: Rgetstate (*getstate_fn)(Tgetstate), Chris@16: void (*setstate_fn)(Tsetstate, Ttuple), Chris@16: bool getstate_manages_dict) Chris@16: { Chris@16: cl.enable_pickling_(getstate_manages_dict); Chris@16: cl.def("__getinitargs__", getinitargs_fn); Chris@16: cl.def("__getstate__", getstate_fn); Chris@16: cl.def("__setstate__", setstate_fn); Chris@16: } Chris@16: Chris@16: template Chris@16: static Chris@16: void Chris@16: register_( Chris@16: Class_&, Chris@16: ...) Chris@16: { Chris@16: typedef typename Chris@16: error_messages::missing_pickle_suite_function_or_incorrect_signature< Chris@16: Class_>::error_type error_type; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct pickle_suite_finalize Chris@16: : PickleSuiteType, Chris@16: pickle_suite_registration Chris@16: {}; Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: }} // namespace boost::python Chris@16: Chris@16: #endif // BOOST_PYTHON_OBJECT_PICKLE_SUPPORT_RWGK20020603_HPP