Chris@16
|
1 // (C) Copyright R.W. Grosse-Kunstleve 2002.
|
Chris@16
|
2 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
3 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
4 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5 #ifndef BOOST_PYTHON_OBJECT_PICKLE_SUPPORT_RWGK20020603_HPP
|
Chris@16
|
6 # define BOOST_PYTHON_OBJECT_PICKLE_SUPPORT_RWGK20020603_HPP
|
Chris@16
|
7
|
Chris@16
|
8 # include <boost/python/detail/prefix.hpp>
|
Chris@16
|
9
|
Chris@16
|
10 namespace boost { namespace python {
|
Chris@16
|
11
|
Chris@16
|
12 namespace api
|
Chris@16
|
13 {
|
Chris@16
|
14 class object;
|
Chris@16
|
15 }
|
Chris@16
|
16 using api::object;
|
Chris@16
|
17 class tuple;
|
Chris@16
|
18
|
Chris@16
|
19 BOOST_PYTHON_DECL object const& make_instance_reduce_function();
|
Chris@16
|
20
|
Chris@16
|
21 struct pickle_suite;
|
Chris@16
|
22
|
Chris@16
|
23 namespace error_messages {
|
Chris@16
|
24
|
Chris@16
|
25 template <class T>
|
Chris@16
|
26 struct missing_pickle_suite_function_or_incorrect_signature {};
|
Chris@16
|
27
|
Chris@16
|
28 inline void must_be_derived_from_pickle_suite(pickle_suite const&) {}
|
Chris@16
|
29 }
|
Chris@16
|
30
|
Chris@16
|
31 namespace detail { struct pickle_suite_registration; }
|
Chris@16
|
32
|
Chris@16
|
33 struct pickle_suite
|
Chris@16
|
34 {
|
Chris@16
|
35 private:
|
Chris@16
|
36 struct inaccessible {};
|
Chris@16
|
37 friend struct detail::pickle_suite_registration;
|
Chris@16
|
38 public:
|
Chris@16
|
39 static inaccessible* getinitargs() { return 0; }
|
Chris@16
|
40 static inaccessible* getstate() { return 0; }
|
Chris@16
|
41 static inaccessible* setstate() { return 0; }
|
Chris@16
|
42 static bool getstate_manages_dict() { return false; }
|
Chris@16
|
43 };
|
Chris@16
|
44
|
Chris@16
|
45 namespace detail {
|
Chris@16
|
46
|
Chris@16
|
47 struct pickle_suite_registration
|
Chris@16
|
48 {
|
Chris@16
|
49 typedef pickle_suite::inaccessible inaccessible;
|
Chris@16
|
50
|
Chris@16
|
51 template <class Class_, class Tgetinitargs>
|
Chris@16
|
52 static
|
Chris@16
|
53 void
|
Chris@16
|
54 register_(
|
Chris@16
|
55 Class_& cl,
|
Chris@16
|
56 tuple (*getinitargs_fn)(Tgetinitargs),
|
Chris@16
|
57 inaccessible* (* /*getstate_fn*/)(),
|
Chris@16
|
58 inaccessible* (* /*setstate_fn*/)(),
|
Chris@16
|
59 bool)
|
Chris@16
|
60 {
|
Chris@16
|
61 cl.enable_pickling_(false);
|
Chris@16
|
62 cl.def("__getinitargs__", getinitargs_fn);
|
Chris@16
|
63 }
|
Chris@16
|
64
|
Chris@16
|
65 template <class Class_,
|
Chris@16
|
66 class Rgetstate, class Tgetstate,
|
Chris@16
|
67 class Tsetstate, class Ttuple>
|
Chris@16
|
68 static
|
Chris@16
|
69 void
|
Chris@16
|
70 register_(
|
Chris@16
|
71 Class_& cl,
|
Chris@16
|
72 inaccessible* (* /*getinitargs_fn*/)(),
|
Chris@16
|
73 Rgetstate (*getstate_fn)(Tgetstate),
|
Chris@16
|
74 void (*setstate_fn)(Tsetstate, Ttuple),
|
Chris@16
|
75 bool getstate_manages_dict)
|
Chris@16
|
76 {
|
Chris@16
|
77 cl.enable_pickling_(getstate_manages_dict);
|
Chris@16
|
78 cl.def("__getstate__", getstate_fn);
|
Chris@16
|
79 cl.def("__setstate__", setstate_fn);
|
Chris@16
|
80 }
|
Chris@16
|
81
|
Chris@16
|
82 template <class Class_,
|
Chris@16
|
83 class Tgetinitargs,
|
Chris@16
|
84 class Rgetstate, class Tgetstate,
|
Chris@16
|
85 class Tsetstate, class Ttuple>
|
Chris@16
|
86 static
|
Chris@16
|
87 void
|
Chris@16
|
88 register_(
|
Chris@16
|
89 Class_& cl,
|
Chris@16
|
90 tuple (*getinitargs_fn)(Tgetinitargs),
|
Chris@16
|
91 Rgetstate (*getstate_fn)(Tgetstate),
|
Chris@16
|
92 void (*setstate_fn)(Tsetstate, Ttuple),
|
Chris@16
|
93 bool getstate_manages_dict)
|
Chris@16
|
94 {
|
Chris@16
|
95 cl.enable_pickling_(getstate_manages_dict);
|
Chris@16
|
96 cl.def("__getinitargs__", getinitargs_fn);
|
Chris@16
|
97 cl.def("__getstate__", getstate_fn);
|
Chris@16
|
98 cl.def("__setstate__", setstate_fn);
|
Chris@16
|
99 }
|
Chris@16
|
100
|
Chris@16
|
101 template <class Class_>
|
Chris@16
|
102 static
|
Chris@16
|
103 void
|
Chris@16
|
104 register_(
|
Chris@16
|
105 Class_&,
|
Chris@16
|
106 ...)
|
Chris@16
|
107 {
|
Chris@16
|
108 typedef typename
|
Chris@16
|
109 error_messages::missing_pickle_suite_function_or_incorrect_signature<
|
Chris@16
|
110 Class_>::error_type error_type;
|
Chris@16
|
111 }
|
Chris@16
|
112 };
|
Chris@16
|
113
|
Chris@16
|
114 template <typename PickleSuiteType>
|
Chris@16
|
115 struct pickle_suite_finalize
|
Chris@16
|
116 : PickleSuiteType,
|
Chris@16
|
117 pickle_suite_registration
|
Chris@16
|
118 {};
|
Chris@16
|
119
|
Chris@16
|
120 } // namespace detail
|
Chris@16
|
121
|
Chris@16
|
122 }} // namespace boost::python
|
Chris@16
|
123
|
Chris@16
|
124 #endif // BOOST_PYTHON_OBJECT_PICKLE_SUPPORT_RWGK20020603_HPP
|