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 Callback tempCallback;
116 if (decodeTuple(args, tempCallback) != 0)
120 for (
size_t i=0;i<tempCallback.size();++i)
121 callback_->add(tempCallback[i]);
124 TCallbackPtr callback_;
132typedef PyObjectPtr<MultiCallback>::Type TMultiCallbackPtr;
140 template <
typename CallbackType> MultiCallback(
const util::SharedPtr<CallbackType>& callback)
143 LASS_THROW(
"unsupported");
145 new impl::MultiCallbackImpl<CallbackType>(callback,
false));
146 init(std::move(pimpl));
148 template <
typename CallbackType> MultiCallback(
const util::SharedPtr<const CallbackType>& )
151 LASS_THROW(
"unsupported");
156 template<
typename CallbackType> MultiCallback(
const CallbackType& callback )
158 util::SharedPtr<CallbackType> p(
new CallbackType(callback));
159#pragma LASS_FIXME("This should be the read-only version")
160 TPimpl pimpl(
new impl::MultiCallbackImpl<CallbackType>(p,
false));
161 init(std::move(pimpl));
165 std::string repr(
void)
const;
170 PyObject* callVar(PyObject* args);
171 PyObject* addVar(PyObject* args);
173 static Py_ssize_t length(PyObject* self);
175 const std::type_info& type()
const;
176 void* raw(
bool writable)
const;
178 static PyObject* _tp_call(PyObject*, PyObject*, PyObject*);
182 typedef std::unique_ptr<impl::MultiCallbackImplBase> TPimpl;
184 MultiCallback(TPimpl&& pimpl);
185 void init(TPimpl&& pimpl);
192 template <
typename Callback>
193 struct CallIntermediateShadowTraits
195 typedef Callback TCallback;
196 typedef const Callback* TConstCallbackPtr;
198 typedef TCallback TCppClass;
199 typedef TConstCallbackPtr TConstCppClassPtr;
201 static int getObject(PyObject* self, TConstCppClassPtr& forCalling)
203 lass::util::SharedPtr<TCallback>* almost =
static_cast<lass::util::SharedPtr<TCallback>*
>(
static_cast<MultiCallback*
>(self)->raw(
false));
204 forCalling = almost->get();
209 template <
typename C>
213 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.