PickleTypeConverter.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef ROCKETCOREPICKLETYPECONVERTER_H
00029 #define ROCKETCOREPICKLETYPECONVERTER_H
00030
00031 #include <Rocket/Core/TypeConverter.h>
00032
00033 namespace Rocket {
00034 namespace Core {
00035 namespace Python {
00036
00043 template <typename T>
00044 class PickleTypeConverter : public python::pickle_suite
00045 {
00046 public:
00047 static python::tuple getstate(python::object obj)
00048 {
00049 T& object = python::extract<T&>(obj)();
00050
00051 String buffer;
00052 TypeConverter< T, String >::Convert(object, buffer);
00053
00054 return python::make_tuple(buffer.CString());
00055 }
00056
00057 static void setstate(python::object obj, python::tuple state)
00058 {
00059 T& object = python::extract< T& >(obj)();
00060
00061 int len = python::extract< int >(state.attr( "__len__" )());
00062 if (len != 1)
00063 {
00064 PyErr_SetObject(PyExc_ValueError,
00065 ("expected 1-item tuple in call to __setstate__; got %s"
00066 % state).ptr()
00067 );
00068 python::throw_error_already_set();
00069 }
00070
00071 const char* cstring = python::extract<const char*>(state[0]);
00072 String string(cstring);
00073 TypeConverter<String, T>::Convert(string, object);
00074 }
00075
00076 static bool getstate_manages_dict()
00077 {
00078
00079 return true;
00080 }
00081 };
00082
00083 }
00084 }
00085 }
00086
00087 #endif