blob: c2b413face9a5d52d3997d70910cd8ddcde60bcf [file] [log] [blame]
// (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