knowL: Knowledge Libraries
Loading...
Searching...
No Matches
knowCorePython.h
1#include <pybind11-qt/core.h>
2
3#include <knowCore/BigNumber.h>
4#include <knowCore/ValueHash.h>
5#include <knowCore/ValueList.h>
6#include <knowCore/TypeDefinitions.h>
7
8namespace knowCore::pybind11
9{
10 template<typename _T_>
11 _T_ handle_result(const knowCore::ReturnValue<_T_>& _result)
12 {
13 if(_result.success())
14 {
15 return _result.value();
16 } else {
17 throw std::runtime_error(_result.message().toStdString());
18 }
19 }
20 template<>
21 void handle_result(const knowCore::ReturnValue<void>& _result)
22 {
23 if(not _result.success())
24 {
25 throw std::runtime_error(_result.message().toStdString());
26 }
27 }
28
29 template<typename _T_>
30 void register_value_converter();
31 namespace detail
32 {
33 struct abstract_value_converter;
35 {
36 template<typename _T_>
37 friend void knowCore::pybind11::register_value_converter();
38 friend struct ::pybind11::detail::type_caster<knowCore::Value>;
39 private:
40 static void register_value_converter(abstract_value_converter* _converter);
42 static ::pybind11::handle to_python(const knowCore::Value& _variant, ::pybind11::return_value_policy _policy, ::pybind11::handle _parent);
43 static knowCore::Value to_value(::pybind11::handle _handle);
44 };
46 {
47 virtual bool can_cast(const knowCore::Value& _variant, bool _strict) const = 0;
48 virtual ::pybind11::handle to_python(const knowCore::Value& _variant, ::pybind11::return_value_policy _policy, ::pybind11::handle _parent) const = 0;
49 virtual knowCore::Value to_value(::pybind11::handle _handle) const = 0;
50 };
51 inline ::pybind11::handle value_converter_interface::to_python(const knowCore::Value& _variant, ::pybind11::return_value_policy _policy, ::pybind11::handle _parent)
52 {
53 for(const abstract_value_converter* conv : converters())
54 {
55 if(conv->can_cast(_variant, true))
56 {
57 return conv->to_python(_variant, _policy, _parent);
58 }
59 }
60 for(const abstract_value_converter* conv : converters())
61 {
62 if(conv->can_cast(_variant, false))
63 {
64 return conv->to_python(_variant, _policy, _parent);
65 }
66 }
67 throw ::pybind11::type_error("No converter for type: " + QString(_variant.datatype()).toStdString() + " from knowCore::Value.");
68 }
69 inline knowCore::Value value_converter_interface::to_value(::pybind11::handle _handle)
70 {
71 for(const abstract_value_converter* conv : converters())
72 {
73 try
74 {
75 return conv->to_value(_handle);
76 } catch(const std::exception&)
77 {}
78 }
79 throw ::pybind11::type_error("No converter for python value '" + std::string(::pybind11::repr(_handle)) + "' to knowCore::Value.");
80 }
81
82 template<typename _T_>
84 {
85 bool can_cast(const knowCore::Value& _variant, bool _strict) const override
86 {
87 return (_strict and _variant.is<_T_>()) or (not _strict and _variant.canConvert<_T_>());
88 }
89 ::pybind11::handle to_python(const knowCore::Value& _value, ::pybind11::return_value_policy _policy, ::pybind11::handle _parent) const override
90 {
91 return ::pybind11::cast(_value.value<_T_>(), _policy, _parent).release();
92 }
93 knowCore::Value to_value(::pybind11::handle _handle) const
94 {
95 return knowCore::Value::fromValue(::pybind11::cast<_T_>(_handle));
96 }
97 };
98
99 }
100 template<typename _T_>
101 void register_value_converter()
102 {
103 detail::value_converter_interface::register_value_converter(new detail::value_converter<_T_>());
104 }
105}
106
107namespace pybind11::detail
108{
109 template <>
110 struct type_caster<knowCore::BigNumber>
111 {
112 public:
113 PYBIND11_TYPE_CASTER(knowCore::BigNumber, const_name("knowCore::BigNumber"));
114
115
119 bool load(handle src, bool)
120 {
121 if(int_::check_(src))
122 {
123 value = pybind11::cast<long>(src);
124 return true;
125 } else if(float_::check_(src))
126 {
127 value = pybind11::cast<double>(src);
128 return true;
129 }
130 return false;
131 }
132
136 static handle cast(knowCore::BigNumber src, return_value_policy policy, handle parent ) {
137 if(src.isFloating())
138 {
139 return pybind11::cast(src.toDouble(), policy, parent);
140 } else {
141 return pybind11::cast(knowCore::pybind11::handle_result(src.toInt64()), policy, parent);
142 }
143 }
144 };
145 template <>
146 struct type_caster<knowCore::Value>
147 {
148 public:
149 PYBIND11_TYPE_CASTER(knowCore::Value, const_name("knowCore::Value"));
150
151
155 bool load(handle src, bool)
156 {
157 value = knowCore::pybind11::detail::value_converter_interface::to_value(src);
158 return true;
159 }
160
164 static handle cast(knowCore::Value src, return_value_policy policy, handle parent ) {
165 return knowCore::pybind11::detail::value_converter_interface::to_python(src, policy, parent);
166 }
167 };
168 template <>
169 struct type_caster<knowCore::ValueHash>
170 {
171 public:
172 PYBIND11_TYPE_CASTER(knowCore::ValueHash, const_name("knowCore::ValueHash"));
173
174
178 bool load(handle src, bool)
179 {
180 value = pybind11::cast<QHash<QString, knowCore::Value>>(src);
181 return true;
182 }
183
187 static handle cast(knowCore::ValueHash src, return_value_policy policy, handle parent )
188 {
189 return pybind11::cast(src.hash(), policy, parent).release();
190 }
191 };
192 template <>
193 struct type_caster<knowCore::ValueList>
194 {
195 public:
196 PYBIND11_TYPE_CASTER(knowCore::ValueList, const_name("knowCore::ValueList"));
197
198
202 bool load(handle src, bool)
203 {
204 value = pybind11::cast<QList<knowCore::Value>>(src);
205 return true;
206 }
207
211 static handle cast(knowCore::ValueList src, return_value_policy policy, handle parent )
212 {
213 return pybind11::cast(src.values(), policy, parent).release();
214 }
215 };
216 template <>
217 struct type_caster<knowCore::ReturnVoid>
218 {
219 public:
220 PYBIND11_TYPE_CASTER(knowCore::ReturnVoid, const_name("knowCore::ReturnVoid"));
221
222
226 bool load(handle, bool)
227 {
228 return false;
229 }
230
234 static handle cast(knowCore::ReturnVoid src, return_value_policy, handle)
235 {
236 if(src.success())
237 {
238 return pybind11::none();
239 } else {
240 throw std::runtime_error(src.message().toStdString());
241 }
242 }
243 };
244 template <typename _T_>
245 struct type_caster<knowCore::ReturnValue<_T_>>
246 {
247 public:
248 using t_conv = make_caster<_T_>;
249 PYBIND11_TYPE_CASTER(knowCore::ReturnValue<_T_>, const_name("knowCore::ReturnValue<") + t_conv::name + const_name(">"));
250
254 bool load(handle src, bool)
255 {
256 return false;
257 }
258
262 static handle cast(knowCore::ReturnValue<_T_> src, return_value_policy policy, handle parent)
263 {
264 return pybind11::cast(knowCore::pybind11::handle_result(src), policy, parent).release();
265 }
266 };
267
268}
Definition Forward.h:12
Class that can contains large numeric value.
Definition BigNumber.h:46
bool isFloating() const
Definition BigNumber.cpp:224
ReturnValue< qint64 > toInt64(bool _truncate=false) const
Definition BigNumber.cpp:267
Definition ReturnValue.h:85
Definition ReturnValue.h:29
Definition ValueHash.h:13
ReturnValue< QHash< QString, _T_ > > hash() const
Definition ValueHash.h:237
Definition ValueList.h:8
Definition Value.h:13
Uri datatype() const
Definition Value.cpp:199
static Value fromValue(const _T_ &_value)
Definition Value.h:184
ReturnValue< _T_ > value(TypeCheckingMode _conversion=TypeCheckingMode::Safe) const
Definition Value.h:229
bool canConvert(TypeCheckingMode _conversion=TypeCheckingMode::Safe) const
Definition Value.h:264
Definition knowCorePython.h:84
bool load(handle src, bool)
Definition knowCorePython.h:119
static handle cast(knowCore::BigNumber src, return_value_policy policy, handle parent)
Definition knowCorePython.h:136
bool load(handle src, bool)
Definition knowCorePython.h:254
static handle cast(knowCore::ReturnValue< _T_ > src, return_value_policy policy, handle parent)
Definition knowCorePython.h:262
bool load(handle, bool)
Definition knowCorePython.h:226
static handle cast(knowCore::ReturnVoid src, return_value_policy, handle)
Definition knowCorePython.h:234
bool load(handle src, bool)
Definition knowCorePython.h:178
static handle cast(knowCore::ValueHash src, return_value_policy policy, handle parent)
Definition knowCorePython.h:187
static handle cast(knowCore::ValueList src, return_value_policy policy, handle parent)
Definition knowCorePython.h:211
bool load(handle src, bool)
Definition knowCorePython.h:202
static handle cast(knowCore::Value src, return_value_policy policy, handle parent)
Definition knowCorePython.h:164
bool load(handle src, bool)
Definition knowCorePython.h:155