Library of Assembled Shared Sources
pycallback.cpp
Go to the documentation of this file.
1/** @file
2 * @author Bram de Greve (bram@cocamware.com)
3 * @author Tom De Muer (tom@cocamware.com)
4 *
5 * *** BEGIN LICENSE INFORMATION ***
6 *
7 * The contents of this file are subject to the Common Public Attribution License
8 * Version 1.0 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://lass.sourceforge.net/cpal-license. The License is based on the
11 * Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12 * use of software over a computer network and provide for limited attribution for
13 * the Original Developer. In addition, Exhibit A has been modified to be consistent
14 * with Exhibit B.
15 *
16 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18 * language governing rights and limitations under the License.
19 *
20 * The Original Code is LASS - Library of Assembled Shared Sources.
21 *
22 * The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23 * The Original Developer is the Initial Developer.
24 *
25 * All portions of the code written by the Initial Developer are:
26 * Copyright (C) 2004-2025 the Initial Developer.
27 * All Rights Reserved.
28 *
29 * Contributor(s):
30 *
31 * Alternatively, the contents of this file may be used under the terms of the
32 * GNU General Public License Version 2 or later (the GPL), in which case the
33 * provisions of GPL are applicable instead of those above. If you wish to allow use
34 * of your version of this file only under the terms of the GPL and not to allow
35 * others to use your version of this file under the CPAL, indicate your decision by
36 * deleting the provisions above and replace them with the notice and other
37 * provisions required by the GPL License. If you do not delete the provisions above,
38 * a recipient may use your version of this file under either the CPAL or the GPL.
39 *
40 * *** END LICENSE INFORMATION ***
41 */
42
43
44
45#include "python_common.h"
46#include "pycallback.h"
47#include "pyobject_macros.h"
48#include "_lass_module.h"
49
50namespace lass
51{
52namespace python
53{
54namespace impl
55{
56
57const std::string MultiCallbackImplBase::repr() const
58{
59 // convert container to python equivalent and ask repr of that.
60 return std::string("MultiCallbackRepr");
61}
62
63}
66 PY_CLASS_PY_METHOD_EX( MultiCallback, callVar, "call", "" )
67 PY_CLASS_PY_METHOD_EX( MultiCallback, addVar, "add", "" )
69 LASS_EXECUTE_BEFORE_MAIN_EX( MultiCallback_executeBeforeMain,
70 MultiCallback::_lassPyClassDef.setSlot(Py_tp_call, &MultiCallback::_tp_call);
71 )
72
74 {
75 }
76
77 MultiCallback::MultiCallback(TPimpl&& pimpl)
78 {
79 init(std::move(pimpl));
80 }
81
82 // wrapping the call ourselves as the macro's and templates have difficulties
83 // automatically wrapping everything up
84 PyObject * MultiCallback::_tp_call(PyObject * self, PyObject *args, PyObject* kwargs)
85 {
86 LockGIL LASS_UNUSED(lock);
87 if (!PyType_IsSubtype(self->ob_type , MultiCallback::_lassPyClassDef.type() ))
88 {
89 PyErr_SetString(PyExc_TypeError,"not castable to MultiCallback");
90 return 0;
91 }
92 if (kwargs)
93 {
94 if (!PyDict_CheckExact(kwargs))
95 {
96 PyErr_BadInternalCall();
97 return 0;
98 }
99 if (PyDict_Size(kwargs) != 0)
100 {
101 PyErr_SetString(PyExc_TypeError, "function takes no keyword arguments");
102 return 0;
103 }
104 }
105 return static_cast<MultiCallback*>(self)->callVar(args);
106 }
107
108 void MultiCallback::init(TPimpl&& pimpl)
109 {
110 impl::initLassModule();
111 impl::fixObjectType(this);
112 pimpl_ = std::move(pimpl);
113 }
114
115 std::string MultiCallback::repr() const
116 {
117 return pimpl_->repr();
118 }
119
120 void MultiCallback::reset()
121 {
122 pimpl_->reset();
123 }
124
125 void MultiCallback::call(const python::TPyObjPtr& args)
126 {
127 LockGIL LASS_UNUSED(lock);
128 pimpl_->call(args,this);
129 }
130 PyObject* MultiCallback::callVar(PyObject* args)
131 {
132 LockGIL LASS_UNUSED(lock);
133 call(python::TPyObjPtr(args));
134 Py_RETURN_NONE;
135 }
136 const std::type_info& MultiCallback::type() const
137 {
138 return pimpl_->type();
139 }
140 void* MultiCallback::raw(bool writable) const
141 {
142 return pimpl_->raw(writable);
143 }
144
145 Py_ssize_t MultiCallback::length( PyObject* self)
146 {
147 return static_cast<MultiCallback*>(self)->pimpl_->length();
148 }
149 void MultiCallback::add(const python::TPyObjPtr& args)
150 {
151 LockGIL LASS_UNUSED(lock);
152 pimpl_->add(args);
153 }
154 PyObject* MultiCallback::addVar(PyObject* args)
155 {
156 LockGIL LASS_UNUSED(lock);
157 add(python::TPyObjPtr(args));
158 Py_RETURN_NONE;
159 }
160
161}
162
163}
#define PY_DECLARE_CLASS(i_cppClass)
Declare a Python class with automatic name and no documentation.
#define PY_CLASS_METHOD_NAME(i_cppClass, i_cppMethod, s_methodName)
Export a C++ method to Python with custom name (no documentation).
#define PY_CLASS_METHOD(i_cppClass, i_cppMethod)
Export a C++ method to Python using the C++ method name (no documentation).
#define PY_CLASS_PY_METHOD_EX(i_cppClass, i_cppMethod, s_methodName, s_doc)
Export a C++ method that returns raw PyObject* to Python.
PyObjectPtr< PyObject >::Type TPyObjPtr
PyObjectPtr to a PyObject.
Predefined constants for Python special methods (magic methods) that can be used as method names in c...
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.
Definition config.h:53