1#include <pybind11-qt/core.h>
3#include <knowCore/BigNumber.h>
4#include <knowCore/ValueHash.h>
5#include <knowCore/ValueList.h>
6#include <knowCore/TypeDefinitions.h>
8namespace knowCore::pybind11
10 template<
typename _T_>
15 return _result.value();
17 throw std::runtime_error(_result.message().toStdString());
23 if(not _result.success())
25 throw std::runtime_error(_result.message().toStdString());
29 template<
typename _T_>
30 void register_value_converter();
33 struct abstract_value_converter;
36 template<
typename _T_>
37 friend void knowCore::pybind11::register_value_converter();
38 friend struct ::pybind11::detail::type_caster<knowCore::Value>;
42 static ::pybind11::handle to_python(
const knowCore::Value& _variant, ::pybind11::return_value_policy _policy, ::pybind11::handle _parent);
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;
51 inline ::pybind11::handle value_converter_interface::to_python(
const knowCore::Value& _variant, ::pybind11::return_value_policy _policy, ::pybind11::handle _parent)
55 if(conv->can_cast(_variant,
true))
57 return conv->to_python(_variant, _policy, _parent);
60 for(
const abstract_value_converter* conv : converters())
62 if(conv->can_cast(_variant,
false))
64 return conv->to_python(_variant, _policy, _parent);
67 throw ::pybind11::type_error(
"No converter for type: " + QString(_variant.
datatype()).toStdString() +
" from knowCore::Value.");
69 inline knowCore::Value value_converter_interface::to_value(::pybind11::handle _handle)
71 for(
const abstract_value_converter* conv : converters())
75 return conv->to_value(_handle);
76 }
catch(
const std::exception&)
79 throw ::pybind11::type_error(
"No converter for python value '" + std::string(::pybind11::repr(_handle)) +
"' to knowCore::Value.");
82 template<
typename _T_>
85 bool can_cast(
const knowCore::Value& _variant,
bool _strict)
const override
87 return (_strict and _variant.is<_T_>()) or (not _strict and _variant.
canConvert<_T_>());
89 ::pybind11::handle to_python(
const knowCore::Value& _value, ::pybind11::return_value_policy _policy, ::pybind11::handle _parent)
const override
91 return ::pybind11::cast(_value.
value<_T_>(), _policy, _parent).release();
100 template<
typename _T_>
101 void register_value_converter()
107namespace pybind11::detail
121 if(int_::check_(src))
123 value = pybind11::cast<long>(src);
125 }
else if(float_::check_(src))
127 value = pybind11::cast<double>(src);
139 return pybind11::cast(src.toDouble(), policy, parent);
141 return pybind11::cast(knowCore::pybind11::handle_result(src.
toInt64()), policy, parent);
146 struct type_caster<knowCore::Value>
157 value = knowCore::pybind11::detail::value_converter_interface::to_value(src);
165 return knowCore::pybind11::detail::value_converter_interface::to_python(src, policy, parent);
180 value = pybind11::cast<QHash<QString, knowCore::Value>>(src);
189 return pybind11::cast(src.
hash(), policy, parent).release();
193 struct type_caster<knowCore::ValueList>
204 value = pybind11::cast<QList<knowCore::Value>>(src);
213 return pybind11::cast(src.values(), policy, parent).release();
217 struct type_caster<knowCore::ReturnVoid>
238 return pybind11::none();
240 throw std::runtime_error(src.message().toStdString());
244 template <
typename _T_>
245 struct type_caster<knowCore::ReturnValue<_T_>>
248 using t_conv = make_caster<_T_>;
264 return pybind11::cast(knowCore::pybind11::handle_result(src), policy, parent).release();
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
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:46
Definition knowCorePython.h:35
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