125 lines
3.1 KiB
C++
125 lines
3.1 KiB
C++
// (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
|