// (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 |