43#ifndef LASS_GUARDIAN_OF_INCLUSION_UTIL_PYCALLBACK_H
44#define LASS_GUARDIAN_OF_INCLUSION_UTIL_PYCALLBACK_H
68 class LASS_PYTHON_DLL MultiCallbackImplBase
71 virtual ~MultiCallbackImplBase() {};
72 virtual void reset() = 0;
73 virtual Py_ssize_t length()
const = 0;
74 virtual const std::type_info& type()
const = 0;
75 virtual void* raw(
bool writable) = 0;
76 virtual void call(
const python::TPyObjPtr& args, PyObject* self) = 0;
77 virtual void add(
const python::TPyObjPtr& args) = 0;
79 const std::string repr()
const;
83 template <
typename Callback>
84 class MultiCallbackImpl :
public MultiCallbackImplBase
87 typedef Callback TCallback;
88 typedef util::SharedPtr<Callback> TCallbackPtr;
89 typedef util::SharedPtr<const Callback> TConstCallbackPtr;
91 MultiCallbackImpl(
const TCallbackPtr & callback,
bool readonly) : callback_(callback), readOnly_(readonly)
95 void reset()
override {
return callback_->reset(); }
96 Py_ssize_t length()
const override {
return static_cast<Py_ssize_t
>(callback_->size()); };
98 const std::type_info& type()
const override
100 return typeid(TCallbackPtr);
102 void* raw(
bool writable)
override
104 if (writable && readOnly_)
115 LockGIL LASS_UNUSED(lock);
116 Callback tempCallback;
117 if (args.get() && PyTuple_Check(args.get()) && PyTuple_Size(args.get())==1)
119 Py_XINCREF(args.get());
120 Py_XINCREF(PyTuple_GetItem(args.get(),0));
121 int rv = pyGetSimpleObject(PyTuple_GetItem(args.get(),0),tempCallback);
126 for (
size_t i=0;i<tempCallback.size();++i)
127 callback_->add(tempCallback[i]);
131 TCallbackPtr callback_;
139typedef PyObjectPtr<MultiCallback>::Type TMultiCallbackPtr;
147 template <
typename CallbackType> MultiCallback(
const util::SharedPtr<CallbackType>& callback)
150 LASS_THROW(
"unsupported");
152 new impl::MultiCallbackImpl<CallbackType>(callback,
false));
153 init(std::move(pimpl));
155 template <
typename CallbackType> MultiCallback(
const util::SharedPtr<const CallbackType>& )
158 LASS_THROW(
"unsupported");
163 template<
typename CallbackType> MultiCallback(
const CallbackType& callback )
165 util::SharedPtr<CallbackType> p(
new CallbackType(callback));
166#pragma LASS_FIXME("This should be the read-only version")
167 TPimpl pimpl(
new impl::MultiCallbackImpl<CallbackType>(p,
false));
168 init(std::move(pimpl));
172 std::string repr(
void)
const;
177 PyObject* callVar(PyObject* args);
178 PyObject* addVar(PyObject* args);
180 static Py_ssize_t length(PyObject* self);
182 const std::type_info& type()
const;
183 void* raw(
bool writable)
const;
185 static PyObject* _tp_call(PyObject*, PyObject*, PyObject*);
189 typedef std::unique_ptr<impl::MultiCallbackImplBase> TPimpl;
191 MultiCallback(TPimpl&& pimpl);
192 void init(TPimpl&& pimpl);
199 template <
typename Callback>
200 struct CallIntermediateShadowTraits
202 typedef Callback TCallback;
203 typedef const Callback* TConstCallbackPtr;
205 typedef TCallback TCppClass;
206 typedef TConstCallbackPtr TConstCppClassPtr;
208 static int getObject(PyObject* self, TConstCppClassPtr& forCalling)
210 lass::util::SharedPtr<TCallback>* almost =
static_cast<lass::util::SharedPtr<TCallback>*
>(
static_cast<MultiCallback*
>(self)->raw(
false));
211 forCalling = almost->get();
216 template <
typename C>
219 LockGIL LASS_UNUSED(lock);
220 impl::CallMethod< CallIntermediateShadowTraits<C> >::call(args.get(), self, &C::call );
use as base class if derived should not be copyable
void fetchAndThrowPythonException(std::string loc)
Fetch the current Python exception and throw it as a C++ PythonException.
PyObjectPtr< PyObject >::Type TPyObjPtr
PyObjectPtr to a PyObject.
#define PY_HEADER(t_parentClass)
Place as first line of your Pythonized class.
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.