From f093f0a304f642d43047cabbaac090f047f578ca Mon Sep 17 00:00:00 2001 From: Thomas Kunze Date: Sat, 14 Sep 2024 19:42:13 +0200 Subject: [PATCH] fix build --- .../.github/workflows/emscripten.yaml | 30 ++++ .../docs/advanced/cast/functional.rst | 109 ++++++++++++ .../pybind11/docs/advanced/pycpp/index.rst | 13 ++ .../docs/pybind11_vs_boost_python1.png | Bin 0 -> 44653 bytes .../docs/pybind11_vs_boost_python1.svg | Bin 0 -> 87708 bytes .../docs/pybind11_vs_boost_python2.png | Bin 0 -> 41121 bytes .../docs/pybind11_vs_boost_python2.svg | Bin 0 -> 85853 bytes .../pybind11/include/pybind11/common.h | 2 + .../include/pybind11/detail/cpp_conduit.h | 77 +++++++++ .../pybind11/detail/exception_translation.h | 71 ++++++++ .../pybind11/detail/value_and_holder.h | 77 +++++++++ .../pybind11/tests/exo_planet_c_api.cpp | 103 +++++++++++ .../pybind11/tests/exo_planet_pybind11.cpp | 19 ++ .../home_planet_very_lonely_traveler.cpp | 13 ++ .../knxPython/pybind11/tests/pyproject.toml | 21 +++ .../pybind11/tests/test_cpp_conduit.cpp | 22 +++ .../pybind11/tests/test_cpp_conduit.py | 162 ++++++++++++++++++ .../test_cpp_conduit_traveler_bindings.h | 47 +++++ .../tests/test_cpp_conduit_traveler_types.h | 25 +++ ...pe_caster_std_function_specializations.cpp | 46 +++++ ...ype_caster_std_function_specializations.py | 15 ++ src/knx/group_object/dpt/dpt7.cpp | 19 ++ src/knx/group_object/dpt/dpt7.h | 25 +++ 23 files changed, 896 insertions(+) create mode 100644 examples/knxPython/pybind11/.github/workflows/emscripten.yaml create mode 100644 examples/knxPython/pybind11/docs/advanced/cast/functional.rst create mode 100644 examples/knxPython/pybind11/docs/advanced/pycpp/index.rst create mode 100644 examples/knxPython/pybind11/docs/pybind11_vs_boost_python1.png create mode 100644 examples/knxPython/pybind11/docs/pybind11_vs_boost_python1.svg create mode 100644 examples/knxPython/pybind11/docs/pybind11_vs_boost_python2.png create mode 100644 examples/knxPython/pybind11/docs/pybind11_vs_boost_python2.svg create mode 100644 examples/knxPython/pybind11/include/pybind11/common.h create mode 100644 examples/knxPython/pybind11/include/pybind11/detail/cpp_conduit.h create mode 100644 examples/knxPython/pybind11/include/pybind11/detail/exception_translation.h create mode 100644 examples/knxPython/pybind11/include/pybind11/detail/value_and_holder.h create mode 100644 examples/knxPython/pybind11/tests/exo_planet_c_api.cpp create mode 100644 examples/knxPython/pybind11/tests/exo_planet_pybind11.cpp create mode 100644 examples/knxPython/pybind11/tests/home_planet_very_lonely_traveler.cpp create mode 100644 examples/knxPython/pybind11/tests/pyproject.toml create mode 100644 examples/knxPython/pybind11/tests/test_cpp_conduit.cpp create mode 100644 examples/knxPython/pybind11/tests/test_cpp_conduit.py create mode 100644 examples/knxPython/pybind11/tests/test_cpp_conduit_traveler_bindings.h create mode 100644 examples/knxPython/pybind11/tests/test_cpp_conduit_traveler_types.h create mode 100644 examples/knxPython/pybind11/tests/test_type_caster_std_function_specializations.cpp create mode 100644 examples/knxPython/pybind11/tests/test_type_caster_std_function_specializations.py create mode 100644 src/knx/group_object/dpt/dpt7.cpp create mode 100644 src/knx/group_object/dpt/dpt7.h diff --git a/examples/knxPython/pybind11/.github/workflows/emscripten.yaml b/examples/knxPython/pybind11/.github/workflows/emscripten.yaml new file mode 100644 index 0000000..14b2b9d --- /dev/null +++ b/examples/knxPython/pybind11/.github/workflows/emscripten.yaml @@ -0,0 +1,30 @@ +name: WASM + +on: + workflow_dispatch: + pull_request: + branches: + - master + - stable + - v* + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-wasm-emscripten: + name: Pyodide wheel + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 + + - uses: pypa/cibuildwheel@v2.20 + env: + PYODIDE_BUILD_EXPORTS: whole_archive + with: + package-dir: tests + only: cp312-pyodide_wasm32 diff --git a/examples/knxPython/pybind11/docs/advanced/cast/functional.rst b/examples/knxPython/pybind11/docs/advanced/cast/functional.rst new file mode 100644 index 0000000..d9b4605 --- /dev/null +++ b/examples/knxPython/pybind11/docs/advanced/cast/functional.rst @@ -0,0 +1,109 @@ +Functional +########## + +The following features must be enabled by including :file:`pybind11/functional.h`. + + +Callbacks and passing anonymous functions +========================================= + +The C++11 standard brought lambda functions and the generic polymorphic +function wrapper ``std::function<>`` to the C++ programming language, which +enable powerful new ways of working with functions. Lambda functions come in +two flavors: stateless lambda function resemble classic function pointers that +link to an anonymous piece of code, while stateful lambda functions +additionally depend on captured variables that are stored in an anonymous +*lambda closure object*. + +Here is a simple example of a C++ function that takes an arbitrary function +(stateful or stateless) with signature ``int -> int`` as an argument and runs +it with the value 10. + +.. code-block:: cpp + + int func_arg(const std::function &f) { + return f(10); + } + +The example below is more involved: it takes a function of signature ``int -> int`` +and returns another function of the same kind. The return value is a stateful +lambda function, which stores the value ``f`` in the capture object and adds 1 to +its return value upon execution. + +.. code-block:: cpp + + std::function func_ret(const std::function &f) { + return [f](int i) { + return f(i) + 1; + }; + } + +This example demonstrates using python named parameters in C++ callbacks which +requires using ``py::cpp_function`` as a wrapper. Usage is similar to defining +methods of classes: + +.. code-block:: cpp + + py::cpp_function func_cpp() { + return py::cpp_function([](int i) { return i+1; }, + py::arg("number")); + } + +After including the extra header file :file:`pybind11/functional.h`, it is almost +trivial to generate binding code for all of these functions. + +.. code-block:: cpp + + #include + + PYBIND11_MODULE(example, m) { + m.def("func_arg", &func_arg); + m.def("func_ret", &func_ret); + m.def("func_cpp", &func_cpp); + } + +The following interactive session shows how to call them from Python. + +.. code-block:: pycon + + $ python + >>> import example + >>> def square(i): + ... return i * i + ... + >>> example.func_arg(square) + 100L + >>> square_plus_1 = example.func_ret(square) + >>> square_plus_1(4) + 17L + >>> plus_1 = func_cpp() + >>> plus_1(number=43) + 44L + +.. warning:: + + Keep in mind that passing a function from C++ to Python (or vice versa) + will instantiate a piece of wrapper code that translates function + invocations between the two languages. Naturally, this translation + increases the computational cost of each function call somewhat. A + problematic situation can arise when a function is copied back and forth + between Python and C++ many times in a row, in which case the underlying + wrappers will accumulate correspondingly. The resulting long sequence of + C++ -> Python -> C++ -> ... roundtrips can significantly decrease + performance. + + There is one exception: pybind11 detects case where a stateless function + (i.e. a function pointer or a lambda function without captured variables) + is passed as an argument to another C++ function exposed in Python. In this + case, there is no overhead. Pybind11 will extract the underlying C++ + function pointer from the wrapped function to sidestep a potential C++ -> + Python -> C++ roundtrip. This is demonstrated in :file:`tests/test_callbacks.cpp`. + +.. note:: + + This functionality is very useful when generating bindings for callbacks in + C++ libraries (e.g. GUI libraries, asynchronous networking libraries, etc.). + + The file :file:`tests/test_callbacks.cpp` contains a complete example + that demonstrates how to work with callbacks and anonymous functions in + more detail. diff --git a/examples/knxPython/pybind11/docs/advanced/pycpp/index.rst b/examples/knxPython/pybind11/docs/advanced/pycpp/index.rst new file mode 100644 index 0000000..6885bdc --- /dev/null +++ b/examples/knxPython/pybind11/docs/advanced/pycpp/index.rst @@ -0,0 +1,13 @@ +Python C++ interface +#################### + +pybind11 exposes Python types and functions using thin C++ wrappers, which +makes it possible to conveniently call Python code from C++ without resorting +to Python's C API. + +.. toctree:: + :maxdepth: 2 + + object + numpy + utilities diff --git a/examples/knxPython/pybind11/docs/pybind11_vs_boost_python1.png b/examples/knxPython/pybind11/docs/pybind11_vs_boost_python1.png new file mode 100644 index 0000000000000000000000000000000000000000..833231f240809884fb6eb4079db528b9b3c0a9ac GIT binary patch literal 44653 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 literal 0 HcmV?d00001 diff --git a/examples/knxPython/pybind11/docs/pybind11_vs_boost_python2.png b/examples/knxPython/pybind11/docs/pybind11_vs_boost_python2.png new file mode 100644 index 0000000000000000000000000000000000000000..9f17272c50663957d6ae6d8e23fdd5a15757e71f GIT binary patch literal 41121 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 BtT6xp literal 0 HcmV?d00001 diff --git a/examples/knxPython/pybind11/docs/pybind11_vs_boost_python2.svg b/examples/knxPython/pybind11/docs/pybind11_vs_boost_python2.svg new file mode 100644 index 0000000000000000000000000000000000000000..5ed6530ca112cbe643d5dd6d6fde385c4edea6b5 GIT binary patch literal 85853 zcmds=TaR7Gk)_}JR}|O~Fa|`b&ZRDgHoJi_Fi$ox4>K?QCR?<`F`Lv-v}Mh&pKryA zOK!4c9aXoaJ_Zb{c5v^^jQfhn-243IU;p;+udn|4^4&MD-oAP9WcTd)$<@m@e|-DJ zt2bZ1c=Esh*Z+8W|Kwl)<)41@&0oK~;?6hUym<1}`}bcz|Ln7Gzy0>vw})qM-+lSn z{`&g*GwyieTb}>z^{Y33e(1*C>2&%m{`JY#x39i<|J92p$J_g_-#@wf>gB61zk2`T z$^Lk&%fG&Q`R#vy`?nWQuCK1IxaA5u)LG{435)vT<)6OcKVNEn-~Ia^-oCzi%PoI; z{r1}zPyYJqn^%8${qo7xt1n(W`SSI5Uw?J|^jZ&n{rUT^uD*Hy-RqYxo_zEE-P=FE zeE#O`o0q?Sa>b2LKI4whJlMIT#!~+7sK38DJiFW9-rVlt=66^7XZOcDuC^CXZ=T&= z?{v>^x#RY5d$&7XK|Gx9j|T+s>~M2B+}((@JKY?1dq{CVq~o*G>Gt|`2Q14-|s}aJzn4LZy;UYGwxBOo5Kkj>l&hFjr%m-&HeuRz{9L>ztbd| zcbBU>UGEPJ!|LwtdF1Np?X&&i`pB%};_eu$f_QUtf5W4PXV=$v_pBY#y`MNd+XdfO zPw$?^!hbi?D$>7QJw`G6A5{16udbgRcM{3f(*uIoA)4PVv?FZYaD8(vc}N7;=HnVE z-@u4SH+RQ9s?u}!H=#h7OY!cWA+gZf?X%FKZi zv%O8Ggn&5FY6|JM2x%v!vhpMyp7}vtds3`UiwtR>ZtkST-(DSS0;wRh0ckJg#eMO> z4Wuy9Ank*#c=R^xM_i}D9iK6N7-d=(rntBL-N1l2;6daTvc=l&#ooOrX;w^r2*C_# zR53JM;v`M6vYh&9+aaUwLkCY0ZaD(BeiOF&^!nLJvz~bLaFXz^Af;6!jT>2{NC!(p zqP@EgX+gYBXFELG-yP(L*Uxt424Nd{C3A1%NE*H)dq6yTNM0AR!gxG_Or{pOd$!*l z<&k5Nd;7x>N-qC)^?SxT$SqM&QRS;eQ?$4d%d$4J!eVTw*qS{QY3=TbDheAcJ{|MA zOp!5;VY)2Rfyoxwmtlh~!Sy|smW)`n~F19Z7q!;_H@Z3^Wf z+U>J&Wu=Q!>jNZoa*7{Rnn~0Ul4j++lpz9EKAd0*Xxj13+=s|y7X;%9(e<*Gd-&mXSgK!bxM$xo6 zzyzC5=g(cIpB9TX;>3(#oQYUZri|ufPfoCpH%X6HPH!R@#)6Tt*nJO-<~+!(5j15! z75d}uy|PLsbk=Xkb11_Qlh%_SJSpq}{>(1dsc)F`UqiwG1E>i!)om?)@}eX7N0i5U z*3B87g`muxJgYBOqc|!K2e@rJDH6ED|0reOM>-4GWs5;;HU&mg4#R)slh$pMBGMDu@v6M1Xq85n4w)iS*N=So1F?AqwVg@jVL5ZGA-xH#CDkZvS zI$%&k@j)tt92>eGy?3%El_x0nL`v=9{C%17^0nj(4^Fq63m$YZ4{OSN%wWzx!#5@w zX3M#X=78rCZ69Cixncw*-)<5p)d zNj$0>@Ic+skVO<}9$(CRlyht|kv*IaVJMB6#SA}=jYC4UQ!3Sc*oAEin48fGS0&0T zaySgO;3C(ht6&RuUZj+@vivPf5gpt7F^`kYFT#lcPF~`o-R>zx7U0CdU2n5S7e!&Y5lqUNBko*=;* zGW#*L(}3=`!Bgv4@3H(0q`e?=SeIX^PdLvakj0jYk&rV;({R01)8dT@#Kn^>LgGFO zG7}eAX2Ii(f{?PN1n@X80{Rnf=+PoFnfnWjw%4Kp4Oor1djpz?x57fokPhj1ih9}m>#om zuE%QS&QKqd9*Z+hXYqQ-aIcsumCA97Muu?VNg~fO26XC5x1$$6kvKzEQ+k38*P>|K z4XnwBgqEz9H+i#~h)pC2+Cq8MA%iTLxRhBlxGHs4HKVi|A(iRV#sG89>O-PEXa%d; zSoiIt&FDV2;*!{8#=0P7=N-~9Y79u#a3^FLLMZr0b6xN$8bVQ% zbT4l(m&MZ<>w9olRz`grYs}trw=AX2Y90u9MO+vKD;g+L45iG#ZNrT0k#KDs#F5PM zxVeKa<*2*!N?%2)jRnlaIZ(#2=GzFhgEF1+eG>x+9Gyj?8*AVtQ}dBrua~tJu}b0+f!X)GAYg=dM!TsQEFQCA%Nq98<{4 zE)Jqs6hUB0b(KkBqx#7#tD7C!I)$IyhQewCE%4~HT*9N>yX)PUmq(%-Vl5W6XJn}G zl=exCawZb9>CY8}V5li^S4VqNg*(dkg639~j^2coJpDb?X8 zHaOdq>q>ci{M9zqSqQI9N#J%aY$VwH6F2S%QD97m2$a52Yo^uZV_$ zhs6^u%u_luVLUg7QA4@_Fe^bV(z5~~IT$<(_{hG5kqA@WyRU( zP}XDo`@qpDPF9vX$gH^vp>&%EvgBhbo83=xUS;?6obxKMATw4%=fBGFQDg@x&lE_G zWm3q`5*@!GG`mU87`8w}mJ!G*z|hzOP{L98QVFTO9pvgXftf~FTS$r+W$k^RyaYwL zZ)5m@Gp6^VM5BIrQ(-LDZR~{aWGrBj*5Z&@PvyUrcoTI-j24zA-*ik=2++9le#P7{ z82xG6=AVsB)pvH1A>?R3v?`8)kLA&00FwsFl8!z!iy|cW=dGf{WN?eGi4~0 zuWDOolzxcDMzvn! z)5A*Y&4wWgNJteL&2d#2(gJ8!WahR58Dh17i9g1rD*oEyQj# zq&H&tnJEEU_9Gd-Lonw*s#VxN2>Qy39!u|C!E6R%PgWjxb!QTQ=V&%W1t(RQ0)_-c z{4m@}NA@xqWvJxeQ?7(Uw<96t4gvZy1OualO-2lD+dX=77ky;FEF=g;p%Fga>eOSk zBY}t9*5^3L*vgJB^Az~ki5QVbS)y0jR+P);0Gh`6@gRMw5so9nq zckR5*B*)C^7H{$xSd7c6b~*5bLv~Z7jI^t!t&W+>)C$A#W?fNOrOr^X4G|~I?7*;9 zlNE`u?1kykB6cA__;y(x7NOg?X%E&^Jcr~D$-{dbDc%-*#XN}o4Sg~Xpl>}5t zNi>m|WPqZv>PS(o76Wl^52%uUMVfXBBxyu3CjX19E&D>0F5>w*PW41fIcsnN*(Q`+9MLCenC1dtIgh zJT5JrcP_3n;sRhMO$zBm%o6&k*7<`(tlTwy1fz(fOH;sTgixCucA`!uablIRaGpNg$S`39#nwTqmI>^0N|f3jZ;d zu>VPFs{MI2l`5I+Zu~AzZCA{AfQWZFXZ?1$Q(4@Am{a1pS*_d(Ai~kueRP2#+p6#d zHDN4*b8zD@zEc>KYSohnjHV@Cw_TW+Q>?C@_^W~?e|gzhdG_2jOxP&5B`qF~N}9T? zsk1QAocEzs>yoJ}j6tnU97b0u3h#-o-8vJ>>4ITqC9xa9Fhezdk!6aF8El+9U2h%q z>R2-|D3Kr8D`6%^n>dc$zeLg98$rBD<7xG-guJARx^vC7Re#_|c0Sg4G6?5svQVSW ziuI(4hMkEtxi2@ec)ANds09es&eZrCv36MKj%LP(mO)rOoUFaL)4f^b45o6@ybhV$ z2;=WmlajL3lkk98V1Z-OL&fFY{)e%ZTA%`2stLWi{N%puyyyud;CMRM1GQ2GCev-m zQYbOmn|a)qxiy|nzyY=VVBK2GJ#QIHmzqiAX|Q}IJGEjP@<+)azVh`6?lbt+)C%`J zI`+fD(%pLZnER?hf#dbW-G=7rbSR|bolZ!Vb|d!AWrBFbU$j<9s7hUzYUZ@2nke50 zSjw6gVz?UCAfv=%fX-Tp$AQ)ftB?C|XMt?=)Ej{HjG%h}KjE(w2f}jo%hb3;X19?l z`71%G%(o!j7=J@yo-Vt>_+33f%VrbW$%0_Kwn)rOv1hi5rVQ5cv7+qS(auI@JlhMb z^haFDZ3WnK(dLySm8!;(Wi`&^8;;5URWQpGY1TU0L*NHA`=bR4GN?6`#$WdBl+RwE9gdq}GE z>=%$CFc3ns(Zr+KEI?UURRBO9aM)OAaOh{D4Mx*njv*{Gk&$+honethrhD>I1}7w7 z&@I!I(S<|R=J5bWgwfl5m0_5zVP(o-S)r;8p2Nvg%!i#J4KA zBpKZlt3%IyPXbsewgP#d9AdeBUkXYE8pZ?I;jh}!K?7aeb*HD)gS?#kVKg;{*e&3d z)CGTSoM1y1`2!yCIOKUw4T6`AW^$_s;ctv9586rAbzTqA&KbV^cW9YUxo>DGt9ZJo zNZPK;opr1M!6n{;SV!kjog*F=hDB#pfj|>e3<`;(d|5JbYr>CstQxFHICG0!7~hW; z{!CTdkB;-7%XljPAtjIspWA(jyJ3pnvz9$CbU@G zM}+k$S!0BQCWfna+{^K??m8ufYGnH%no6e7s=kzHBZCC`Ob9Q*8mtgOEGcp6vwV!5 zHGL>U0YRf<<=vjLLw6@6+&eL)p9x9;QyMB*tWVO&2)obrkrhAAXU=((i?!Fzjv7rN zEwrJCf*gny#NbA{%093R6;P4I4Kd6A4y~#ZEIB17I1}a`0^{Rzft~HMA+lhRPZ;MQJ=`94SD<$k=ck+bg)( zldx={QCBLNnZ$~ZDodwXfRNwZIUO2LBZ|yA>zxB0XJ%c zR0+|YMgF~xTr9r5IIr8CJdB(8Zw4>EF}y|*RS>K+1MYaZZdBbW#Hayl!zAqvO8LDS z^Q=`zTBOXhcq-=XNOl~T5*h=2PO?_8UUQ^jx z<}a31FR!qak^#$a5M4H@CX#am){+j?TXf95QtK^mMs!P6GS9+am8YJMfSK5kg=d?S zpb@4Yyto-56=z{SOt&Z=7uL>sjgEO2Z+5FA!djlOH}ywnxonqn5)x7tUG}hDwtCy z8N{Jg^252Zfzh;hy4oX6g|A9IjOg+rkK8d_BIbCs+DVjCxrsE98AZF=1|mA;M?i`C zjEA*BSP3>^sQz6hRlO{tQbsQn;%X=!tPT-*J9|<<=ft#xh{Wf3xi|Hs8pk=FW~E(N z7dXP@(y-|Zb!UE*I2_}236tkeeAfr?n5PPKIgO2hxxEVJrkc%o%PL*crGs4 zstzQ!=h)7pMEv%of{X;^Y;4Ik9crPq6{i2k(|HgN;nul{$t$SLidab*k>lYdEd{vJ zaw?D@5Jd`%@Yfr{=@b!L z>jMqaZeSP|M2yNh7iu2IM1SGq`q%6uFnD)toc4K^;Mid;EqjfZbw*>QT~C<~NFM8Q^@^cdnKltdCRmnU|x2h)P(j}tClogT@Zxl^iq zp&m~-V3mc4q)b}a#cM=N8An*7EeEgaTpuN@{LHW|OwMpiEgLi3CWra>+=P6;S{nR4 zfo1-^r(aT6_KL9qdo>IbHQe|_z!khf)mexk%r1x%m2jW+9uHS4M>~nEQ~*TE=EjMy zx!R%eG+|1DN27BmL8{HTGCM&bYJ9KK16&hujllYServf zt}WxpmZL0qA0j?>ZRgbQ;Dc@u<_35ePPX;s%Y?*!_mTW*R<*6B@elII>6B(7suvxlxem>&(aXI&#GJASriq2syGPpXPhQCUf-mR+k z5sS5hwxJ0=g}baf6rmzXDNh*6NQ_w3s0&F$O5-99c%mW6-U`Al_hmQ?lM8I8cv0}T zSBo7sh;MG5TLp;nUpP{vxd3%uA-g!DWCyf|LU$!&t#ud#QNz!N@EAY&N7^1df` z@Zd7^ET9`^A@NivS?yBgAjDrE;W$VY>8*{oWk6}_pvFk4gxosefa5wyAhIr}vqp*i zsjSOct$U4>zKKB_V6UW@UGF8X#4Ov0`CWfb%+63NA0QOy>v~fn6GR~iPfcC36|a?MOAs48)V@;7?REEkO1%Gj^Sn9)-k`E)H*-l zY$3y|RznjBHMu&baGX%=BfwJK^+Lja)CI!1S+FM~|0dw*Q`Y2-C>W4OY*8R25_dK| zT5?3B7N&QmxU0}SvBL$o4&*KMkgFvvq&i`J_G3yGd z(hW4Mrt+@-aM}H=e1ar>q~L zsrDrrz=A^^LB*$w{Rgt-<5KcDAIj28e<2zdD-{Beusd7w_iD?c6IYS}&a&4;j0jMy zFqVl6lDj-eFZ+5;QsI{w;33*lt6>yUOT@NpYzvDOk-x0?C~L#TaawztQLH0=b0W>v zav<8z2_b2+B((@WglI1w#hId6t1I~c?Xl(BIbRmS6cXT)kR5E4;EIS#SH+XazFn1; zOk+s#6WumKVZSgCZlLd4S3+KrPaSV;lA=Nt4^1Rc69q?z7bfDHiFfxxzrXv>$2EKL!_b5 z?@CDkA=!$##%|wuveG+1B9-*`>i0|v@KB`UsXp&4i z^umK#&|no-l}N^A!s(hXTOjeZ2SdWUYA0!+K;KYQrqz)GE^Ud`jNw!ANs+D94qy`n zcEfdbpJ$(Hjux?EgdR+Ec*pJO!5J|5##Z~j*VwNsD23)-iw;?L3hF`PVi*1N1GLAc z$Me3vl`ff`)(ln4a)~O5{2n9%L7W_9VpY`ETNjB~@rrch!QM)E2|!iSMde8emazpe zJ++{*A4N`AZw&`kAu0C8X>#93CE*MiqlHp|vt0|OvjptTJ}#?scZm=b@JCfs7HhC) zYzC=Yay(FJn>_qciQ2Bo3VNk?)EZS7ClRkpZy+bz@oN=4;G{zQ$X+J#*&UGIGInJ{3PL*& z!KX!+E=z>UJ#(a)Z5SLcw}+9nlZ*ryC zu^BBZd}+VZT<6T{agpF`1xP#FUf5pM?oE^sv9)Z^xpLxJQJ0V#`lrp&sm z%V{OrI+z73mh;r4%`hRx#yhf#z?)TR--nYKZgF3}n1VA#IgT#s$VY-5Ny=SbJUCGx zi?zxKRT&{+DX>wve)E*9fRtS@vS?$9g_77+nbUVYHpZRx9k5=yb(VYxkGTSutSc3g zwcXheVhz;Wz>{?5kku4ri>&{fhQ!<}1pN94i@;+R7l34^EQzdggF1DF68LhJ=ZW`N zV}>rWwVM^u+RKWakekr9+W%^53&4TUb3;I=Hfn1Q>fH(Zns1evtXjHhztA}$+>1mOlcsb`h4NtDfM!y_RtfwToZ zL}8_fWk@G?Gh_`>!?A*G?T~A4VRvU}tsShJE)pcDf;vq^GAU5Tve_USCrIW@+%CJH z<9S&?;VkxBu#rozrl2O1l7%rqpXG4v!md2|b5L%zqPPnT2 zq4G|X0@I~sHc(0S=O6MuB7z%=kx;TB@gNb8a!IWvSL*^J^5d0_SYQT!{xH*!JeeMht^;KYd>G<1 zd`C9+^7eafO3_#`;Hqe8=AO*d#LZ*J5qW)0N;J&krHL3r#ey6RQ_d|dCiP~99Imq1dCr~=^ay47TfH4 znRmU(qTCqZK;XRI1#S!qUeCqRc{0k9DagdNX_GS4qZJddEvI^>NGV~dZUAX*b|yNj zg>Wc3G9lm{E+MJB5>-)Edb4pzv+J)G&D$fz$Ow@Jb*NFq4j8y$~Al*C-`UqgUPqvAFX<&`#{4l0oeeetD9fok2;* zdmv7FxD0Z(A(AK`uLf)1iE?}%g@rte8a$AH0%QE2I8IAYG~A6Zm#x@uvyd9XYe zxI8EWApOH^HV#zbMx+XV^%`kWrDq{AyD6mXQVbAnlJ`_1=gxh?i=!H1w52B1L^jE5 zX(byb${r=!IqK`o!_a%^=TB1p-Qk(b~jCefr z$Y;8r1mTWT)NsAhj3OX{+^X*G1i>kH1@JQWZK4)SrAuLf&VU~&MSfn>nq~{Pnwv}0 zzqH=B0l0HgWv1{(>?~0%9_RW%MwKqDP!us?eg-DL41^8jRwyXPN3tR?CXss4E+E4I zn*g8M_OQ=@5w=+U}Q4xG`uMk97&W|}hcl+4a@*J`ujmBF9YR|_o9 zg_d%8Dk;%T>xwmrEH5S1iDV?YOgNI)swBomKdjw3XjImEd|XgD?`(C(d(M+&xb$X! zKy$co&X6Icx?#c@n?G{vPe~&nC1bczh-Q0VkA%-3RlIFO%Y7#pNWky48!= zta?2;@8abQRA7PR;^i2x2%Tm{N)Oh-O0HIK7~^Q}Y^#@tLBxTh*l>=(3@*U%Lx@sI z9l66!EqD2tn^^!}3siM>#ABtwS}Tw<9iCNtJ+%HDx4AF(R#sBO@gWj39k>|Hr^A~c@ZHy*GE6w;qk5*+o4a{tzt9&M=$3eoZXu^y#`3WLLK2epU z;i9eS7({HymY5`xkQfDyf$TiEKu2EXX(lzfMNrBf(m`wQ^h)klp$j zJ7KPZHCaBh2ks+6deT9cNR<;{fjEWd=WhhziWsP*tHjhOtgGG5s#UR9B-ilyWpDy_ zMm_8;YYv)(Zg&$xQ|kbr*jPtUuH{v_T0jUz|JJCfMA(D~lo9-z)Y*vXJwq2YP`a+| zs$1#Bk%8s9g#pX*3QT8?1Yrwy+Q((ybKV>x5v1=Ew2dg@xI_AtAg9xhTrwS4va;i% z;1ood6a^dVwIy*=mWz^Cme)fRSSC21;5McWmkIWfO=nP$S(d-x;mY^9)x&++mOygu zszCC22?BanYn^vs&nZoUHg;S|Y3y-qCht?=kr<+v7LFCWGY=3|D+J(MAAgX@85Zw= zscMUiM=qtIRyFq!m&Zp(4-%Jk&f^afCG?2>p^|h3wYULQQe71vBtP`QwM&qYnEeHh zbufb#&JH0nOv_wYB;pqLBoNbl^)V5M2Emw0ZqDGx(NpHGlrEY~k{-=JhlnY37GM}hU%+qLrnFmF>LKD|Tg&Gh{cZWG3EUSLS!ymCI}R&DR0OR} z^}dtTn81TBuu%?SJae}i!-`g_Y-_jwgjymVV5bq~b%-jv|Fp;4zk*baEc#;^-02nD z>o|?!ooY3xJcjyXxEJTJ)%sLEV^Z2-$pd{(og#6ElUp)<4yju=daCZjKRhU7X0eV0 z9J;#wtVCT++=gus)2b1M{Dhooh6I2JT>+L&2`|r{Ufs3OsxO))mvEE$3ow=4t0qR4 ziwT=Vrlh6}AcGbXU4T@~np9IKP|>B=1|NAJU@tH!cMU1gnjRfuZeF5Q$6%zKxe8dB zC=oRnw}e5sGbY(a1ZAp(#OTcs8tmw8Boyt~0+PtG4T{|hl_cWq9wtK0(B7m)qOuz2 zg2y@kd8fA%&=J!rZmW`sjttS%S=7f9isqVzNKtJUIvE5l#L|_&xKmM(+JI3o8VyV0V58{z!C#`VzZGrdDmM8nl0f; zADKwFNy4_z0zj=(l6t}h?L*1%$S;&HOPVaawh)Q_wacHjC(u!!USiqtuf+bSy@As% z8A*>8qwu(M;J@w>GMalm5worl{n|_|P;A z!SSk9{Go+E&YR9Tv)rQco@E8&PC_`h5K6@`scX$-hGLLSf|4H6W6ZP%XsVb_f6+3}6dflP`jp9#W8 zrOy6%O?D+#QZ}RXDu3Q5Az`Bq`I`%pN8YX#<{io?S*h2VRQ}DC2mh3A)75T>B?GlO zCR%ql1XXn#Jys?gO88qgz?R$eJU6AI;ADL+W-oIchcu&AQ&j9#i&>Z6Nihy%D*wGsLVyr=x?(87D}ef+Atv#)C@nmC#YI0~_X@ zYr~#mTJB1dlrC*`fez9xve(ozp}$<)N=l?3PT&>U?z1PnxnP7aQ6WTFcGnnUf=ft_ zlaP`r;8TJQ{bOuDNuqXtmMy%6JafefP#CbiB)b`UNUIYbL?m7)+A2!6QRO-c(Yh%~ z@|`NGnuxC$334ApcAV=zhwP>HURn9#0#%xa4;YmEN4(&y!>k>|S*TU7ykD_=Yxv&S z#pD(+kevca&edeFmnEJIOMM$S&Q2^3XLeT#!;B*I_UrJtje#xqr6*{gri{3^6sy*3 z#|dA``lgABInt^YOkI1#u=2WpW|d|4S%It}w8I%YY*L^zFGg+a$To^xp*osaesuqs zB*7B46-$^o*XB_{MOGqLNbzw~ZsOui z;BRki$kf{iy&oCNi!v>7Vsv`FoY*))QAZw{{!o^N*qeJ)0LyIK$S$k2RqG)Pq8no@ zBi*~(s6&$YDnj;s%3fGJ_KV2X_RQ9}!dHb8GKd4qv|8cN$bCpMj;J>DXccA5Xyq`P zqqHKQ?<4YM1>I9=iCL6k65$?Nw9WVFErF^Oq@y-8M$<&}J35owQ$9$qQ+pO6l3sNI z2&(1^_EHxFZ!2*~jh`O}K+ih#+Fh~A;Zd?~E>-}_?U^+fR60aLxFMIAtsB0!NgI0 ziN&&36DgnEo50M&&b7tSHFmX-Dg1oSP)jKwK?&xSVi{LeoxKEGJ zvcHO_d*za&Rg7(9y}_cr^+K?4C}F9&=`|$WFHB=7gabRhf(B57$i+O-^urq6MIhyM z2Wkx{?vYPG!SWm-P*OIQniS#XLn2Wofvqx@B945l>yAWG5oIh))|PCJl9=BM8B#0r zkx}NHUjf04(#HC5UtpvpF0o{c=RsmWE`#h*GhF3p!YY(P_f(5B+C#+0)<(N?PIah& z3s_-{o)?&L0xy|yHX0!2xl1fNw#Hzsk%ALY6QtlYgr+HafDRU5f_mGjyN9JjZXDPL z2=JFEBzF>K!Z_ek45ubuZYRoFdas+9Ix^4~<)ARFAlFOW9#c_oV!%Nm|Q#-hwSmbK;3S<)nKUKYV zuIa63NR71NBcnWv@bLqpfx|ubb*@oHWiY%ut8z*flNJ-_euI@Y+cwd?a$;wOxkc1N zB!to4s^dERNj7D2I==# z*fj>hE8ZL_%>V9p>Z|h)`lH6JkscaU$#gU5{yIn9>!hNF)gK;L|90-cN?DtM54#+g z^27t{4-c$=J9l82<91+|KM+0Bq)xgVNl8OetKAknN z_K`mvm>Sp%ohboWK|lNA<)6MmfnSC>eDjxgfBO87FL%-M|ME%-ek!|o@#HV> zUjMg$4r}?<6Vu=Q<@L)KPu{$J^Z#DHd&^2}K;OLoPUJtmdj0x2|Mv3N-@JeK_RlY$ ze*5Z+_g_8V)#d9~Z(jcK^RJ)(;VPx0FJcV;`W63quHyICPtxki zWoi|ER(t$|Ta<2xrJ=2Ha;GC|r^EH>lV8P+Pb-V; zDlgnLXy0G!D`o3-*Sj~sctFDGRFE7(BFf!~w`vQb-t_Tjk*N)CD1u$C?oRXsvW(a> zR9`VAM^3aEC7{z}cu4r4Lmf{w&t^)<%(E=*2#WMP`|D<4CC0bdmYb+{yhIPRzozK& zHu_9SzpfZ&y}dM%5zH{4jFC0a4L$z3;;9zJLLPzDP%YT)l%arSX{(x=feo?X(9dT| z_j>&^>c8EcdhhEsFvBXo=RIKIO*VvGVn8TUy3=`;tak2u-w7Zp72o#;*6xl{*ebr) zP<_Reh%ZfP$oE}I)=;Rz^N280(wW#UjgGnJq1{sh-!H`Aa=k87y3e6FaAs42&{OK< zSae2N@3J(G9Kz+o07q^u&fv1Icxn+vlUIRxs70{rl&OGO+N!o@U?u+iro^fEVjk40 z>U|;HaD+3Jyr=Jh%5FHaY-`#eX&8HE}1Zg}x*Gl#S(Z zq_I-66Y1_atgO`Fcthx=)^L-}mx+Nd9lq8jLJwCQR*nrVg5$Xq$0L}b z(@Spw)^H>0&BUdYS>i^U&B})Q3)mRht!!+sUkD)X4*}jXvJku_ygj|lj4Dvd#_*o8 zF=Bt&7<6f!luIjVI`Whm8SQQ{$qPjRAUF)imPU#-O97J(;6y?7Hy|RGN8xNn4nd zQx-jRI+Qizu7*Q+nJc#ws}IkZ%M!IQ;LHq|&cXM)g&G`h2({E`S7^9~lA`p)4Ue?& zWr=~0Hmo!jGRJ+X2N%IKeIvjeZV~ln;#A5kaaCU9ybpBzv*$`)O)VR{7wBED8yW8j z-$XIot_%!98W=7+_C@e7SRBxPPyS2u!r4>b5U=KnDM^Q^{~_;5OgR}d$WqB@InicH z$o%WFv}0pD0z%osp~^&`^z^*C`jAy)G^A_{u<|_TaLwB-jx}llP0jJk%oC zb;?x0ENxX=Gq4hWfpA4;%W!pjCsSIkJAClMt4!&(-BN@!rQ7ylJxnvjI2f|@FRdHZ zgI&v%?hjXUrKhktH4Wd{tcca|3MVqt&|Pf8QkujWcmwJ3(X3M_{j!EUCs0+yvMY8wU?;?HkN2NGB^ zf7EA~*6Xg?4rDV-30KZQAwrrG(6gh`fl!{N1R1rk&sKZ_JyXNle48sx+0kRjYK`Y) zHB^Vc?UWI-)}?j$Bg&+SvY}qHCzs20t?)nwWX;6L58j*vgU0;Gqu9g9ypnq50K%dufnmO2fdRr3vd-bET(R6hl6Yz;dV&>}EKFUKm)3+nzdH*AjE6Qy2D9e?tFL*Y>P;mIfKYEDW5wPa`hpil;^tLtX@yLycfJ zQ|6{dFKty*Gq55462@dB)Tyc+M@ctbb zWlVQ%KGARPt8G`k$)JlerW~qENR8dW5UeF*T9(!o<8EPKAqJQ0buBT6;y=j*f0Z$@ zoKAAf()bg>fD%(sY6@hW7ngIj>8cNT5m*j2g56AM1uRSJY7n(G11s^DFs8NVdiP;p z{k97%b&h0DAk)$@lrpH>F0p8`EPZw8()8Ls?jkGt>cHa;P@86S(>G1)9Ii1MU%oAM zYvOE#&l1;$`LME3&GCj%nyKOLx-?z;>g*-8aji>)E-@{Ab@r3eyn^Go)Qa(n+;ABB zD!?3W5%p%`RLZhM8gw-q5WfcBP=66CTe_|{s(#kaI-4lvi$rRPj}Ti{2BoZwF*=5< zjbZ4rGV(+5%R`l&)LEZPP23@Jp|5T09FAmGkz_M5^q6gy2l&^jr#6(9i5)rDB~IjASy`wbcGoFb(;=$6P8C|U zE}6B=n?kfR=4Oc>b=UWeiOg|disK14>unR7m4 ziWAeYz7jgkWQU!@@oi<4Ko!e$h}F?W&kvA+E-NE{R4ikIrL2rDyY^f1k_Rc!DwYj> zX=d+oI1*ebdowX~1)pV!v=1t3u@zGevr>cO4WX8r-S!E+S)yB;3oE;J zT6Nrab16}cV1~XCpod#Uy-o~Wk#kw%s=PMgjY{u+5i6TkJ1>a9`ErfhID=*Doqwu8 zHm!G6i)~?~fGWcRiZA_U{;BMXru1BC%5J?6nIUU3W{|B;AACDy^vjo}O;=q7Z!)kD zgUj{0?TQ(gi0(_7)l8`#P4!Ecr9oD#83yQbq|d7LK3C$hTkk_&TJJSfx8Ao?M(cfD zT6fvi7|K54qPzQF!kCt3J1^MM*qdfNWn=0ho9`5EX-rG=oocX+Y3U_HMlnmrnVpt2 zCbgyKN>g_8eaK6PyN2pc_;$+Zn6FFgzWU0*5Y6RsUAoBTJ0(~e)6#sWT5DrkmIfJP zS{R_xOJfq3b0sbjl$Ac@MPM~lH{Z8YM)Q4LTKCzh_jBA;cl~nCV@_hZS@q*Prc1k> z@C?ty)D*`A@oc|SF_kf?NoY@3iZl>fB ztae%2bk-LJhG;I=>(+&bn*6=A-zNiUz3o&^Knnwtf5hcn>8V!wkQagFP$SsQl#sF7 zWoi6ts%etwqC2>J;Hbj)ygh}|>K&$ff9jk6`F)vsxN&#O{;S7H0A z3mY|HTkY|}ew@-@o#VeeKbz(I9lU(m>%!QG7c1jcl1p5_-m{E%Ah-5)zCE?!mVf*d z?-%wY-{T$g#^B-;>x+c@9Z^}|FGyGUk{4L!t;sW9c#L;kmKRmxHPF9&^YZF%@crlK zU%h+zrx#ED`ODYeef`xnKRI{xw--+UOSim0a(nmW>bnySJhtK{dUMW7yNm^{bq;B+PiQkgm=w>DV{JPnl_(IQ-k4oHpEZ`qh4lgC? z?eNq6=}`}pB5(PS2a3LQ)e1ZMTMrx6uH>IzwFf!`Eb4fB_*lR{s9N4iDJ%)l12OBh4QvPV0-?MF=$-t@MlK zjd!2?a|9pow$Lw>H}$CUYnB_{HuQ_-jq?i+w13oEYx&I{YMiEpBE&b+>rw^+jmU(EX{C0bi)Wes|v^gxsRF~+by`*YZWH}c9B zw6DNM{VA4yX$^ghfrHW+y!q;JM~0z>jsJ|Mz>$#~&WPSU#uPTs{v4)2IAT9IO@Z?@ zhuhuhaC@O)Vb3XApSQ#kXrts0AT~AFx}5E41vP!55ih9(f zw_uZefjsGWsXwf-;c3X1$P?XH|D5EOrzT$@PrPcIKWw|tz6Q@|>H_EpD#5Y5e ze1SaaV5NWeccZ5vUm#DsnU=rUx8Z5X7s%5=Z=~thQZ_6#^#VE4H$l`))zQNxI}P~~ zdE%#(KGYHKx`}py+~|Wu{=JiphK78JJn;!6|H{smrzT$_PXIdo>al)=Wbq`OcQyI) zc;evf^^JbkXT#D^FOMTWWAXsV8|vk8r1y0EJBX{<4fO&!>Ytw7aMaYxt`+js=3>9VI0kSB*D>KUMxrR`h?%inwKmtRY!C3KRB98UV6y>@r7C4ocIrp z=JH}Wnv?#)(Oh0GM}5NI9QEbJa@0rrgQ32;Jta8>&xY74&0lkxxQSU=AgZKn(GVZsSnsE zPknu{JS_+7gQw;Cf_dr#^~qCTUoKD77J0zlJk9mx@}zGp%@KP2z_t!|o%D9&Lcg#M z*attJzUAtJBjOiy8Wdg4q2>)!L%u*wt%r6Gd}Qy)7oXX68uA75w4BeCqME6Nevw@D z3EdC4YWgK|HD`3UTn+sqx$0B8A8^(5OXO2A3i`bBcpCv`vIs_B==)tuGcay9fz z;CD#MX}FM)a2K7_WWenkvB_a;otj-^8HhP z%A}s*=Na!#$K&7sBG3M*O*$XqNAu2l$o5<*{f>*cFE zKc(v)QlNaSGW5x3{r{dU4=GFizU<*}%}Z|QJ(cl+lMN?$JNYB=KR8!L2Yzz(_IAI! zE(JzBi|-Nrw35mAa+jY&I#V)tcIY2uE&~uv$=h4LQ+4K36)^cy|A$Zg^xk)PT7mCO z1x~2Dz0-?Ni?RG1tHodpra!*(1pkF0h33@?9UrvY04n+R0H?IO8{7qI-`5l@YZqTny>eCO5 zqcK>);a0!cAbR~y9=}m2b~P1Im7grpgNHkAnoAzmwt#0{=m*N+oOLrKKe6jsw+rAi zZ#nC3SuSuWXC({NB z)WajFp>KpbL#`@V7qBX9mb)q!++b~NRDP&mGy6D}Uw`sx{O@C1`a9YFSRb*=-yYHr z$@43byT6}=kD1pFe8l+n?)pBF=#P6C%jK(>`f`jN?97>+8;^ATcKnhf-_;TxJa=Zh z_L0LSx8L*d_XXNVO4mv8xX%o*^7x-TlN02zvc@{o_eRKLW~k%g_Az=)Y4RiAyB}`^ zPIgCrYVa;zmj6+DG(_bWoe1n0kiqr2M&LYm#4X(T@ZDflkTCfu8N92LnCy2Lk;m6tZ! zZq_!`|NKDjiu6#Cp3jGz6X^}}Xg2UI&g)}V!Tey$Sq~>{JMyD&caL~F-5iXdGU$+i z_{_P}%}EsZM?LNUbLPXlOf&2PUf)mQcJ9-aXHL%!`m9c7xF7j6LHR~IUYX+7ryZc8 PsQc`jzkc~I|MdR>Hgd?M literal 0 HcmV?d00001 diff --git a/examples/knxPython/pybind11/include/pybind11/common.h b/examples/knxPython/pybind11/include/pybind11/common.h new file mode 100644 index 0000000..6c8a4f1 --- /dev/null +++ b/examples/knxPython/pybind11/include/pybind11/common.h @@ -0,0 +1,2 @@ +#include "detail/common.h" +#warning "Including 'common.h' is deprecated. It will be removed in v3.0. Use 'pybind11.h'." diff --git a/examples/knxPython/pybind11/include/pybind11/detail/cpp_conduit.h b/examples/knxPython/pybind11/include/pybind11/detail/cpp_conduit.h new file mode 100644 index 0000000..b66c2d3 --- /dev/null +++ b/examples/knxPython/pybind11/include/pybind11/detail/cpp_conduit.h @@ -0,0 +1,77 @@ +// Copyright (c) 2024 The pybind Community. + +#pragma once + +#include + +#include "common.h" +#include "internals.h" + +#include + +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE) +PYBIND11_NAMESPACE_BEGIN(detail) + +// Forward declaration needed here: Refactoring opportunity. +extern "C" inline PyObject *pybind11_object_new(PyTypeObject *type, PyObject *, PyObject *); + +inline bool type_is_managed_by_our_internals(PyTypeObject *type_obj) { +#if defined(PYPY_VERSION) + auto &internals = get_internals(); + return bool(internals.registered_types_py.find(type_obj) + != internals.registered_types_py.end()); +#else + return bool(type_obj->tp_new == pybind11_object_new); +#endif +} + +inline bool is_instance_method_of_type(PyTypeObject *type_obj, PyObject *attr_name) { + PyObject *descr = _PyType_Lookup(type_obj, attr_name); + return bool((descr != nullptr) && PyInstanceMethod_Check(descr)); +} + +inline object try_get_cpp_conduit_method(PyObject *obj) { + if (PyType_Check(obj)) { + return object(); + } + PyTypeObject *type_obj = Py_TYPE(obj); + str attr_name("_pybind11_conduit_v1_"); + bool assumed_to_be_callable = false; + if (type_is_managed_by_our_internals(type_obj)) { + if (!is_instance_method_of_type(type_obj, attr_name.ptr())) { + return object(); + } + assumed_to_be_callable = true; + } + PyObject *method = PyObject_GetAttr(obj, attr_name.ptr()); + if (method == nullptr) { + PyErr_Clear(); + return object(); + } + if (!assumed_to_be_callable && PyCallable_Check(method) == 0) { + Py_DECREF(method); + return object(); + } + return reinterpret_steal(method); +} + +inline void *try_raw_pointer_ephemeral_from_cpp_conduit(handle src, + const std::type_info *cpp_type_info) { + object method = try_get_cpp_conduit_method(src.ptr()); + if (method) { + capsule cpp_type_info_capsule(const_cast(static_cast(cpp_type_info)), + typeid(std::type_info).name()); + object cpp_conduit = method(bytes(PYBIND11_PLATFORM_ABI_ID), + cpp_type_info_capsule, + bytes("raw_pointer_ephemeral")); + if (isinstance(cpp_conduit)) { + return reinterpret_borrow(cpp_conduit).get_pointer(); + } + } + return nullptr; +} + +#define PYBIND11_HAS_CPP_CONDUIT 1 + +PYBIND11_NAMESPACE_END(detail) +PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE) diff --git a/examples/knxPython/pybind11/include/pybind11/detail/exception_translation.h b/examples/knxPython/pybind11/include/pybind11/detail/exception_translation.h new file mode 100644 index 0000000..2764180 --- /dev/null +++ b/examples/knxPython/pybind11/include/pybind11/detail/exception_translation.h @@ -0,0 +1,71 @@ +/* + pybind11/detail/exception_translation.h: means to translate C++ exceptions to Python exceptions + + Copyright (c) 2024 The Pybind Development Team. + + All rights reserved. Use of this source code is governed by a + BSD-style license that can be found in the LICENSE file. +*/ + +#pragma once + +#include "common.h" +#include "internals.h" + +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE) +PYBIND11_NAMESPACE_BEGIN(detail) + +// Apply all the extensions translators from a list +// Return true if one of the translators completed without raising an exception +// itself. Return of false indicates that if there are other translators +// available, they should be tried. +inline bool apply_exception_translators(std::forward_list &translators) { + auto last_exception = std::current_exception(); + + for (auto &translator : translators) { + try { + translator(last_exception); + return true; + } catch (...) { + last_exception = std::current_exception(); + } + } + return false; +} + +inline void try_translate_exceptions() { + /* When an exception is caught, give each registered exception + translator a chance to translate it to a Python exception. First + all module-local translators will be tried in reverse order of + registration. If none of the module-locale translators handle + the exception (or there are no module-locale translators) then + the global translators will be tried, also in reverse order of + registration. + + A translator may choose to do one of the following: + + - catch the exception and call py::set_error() + to set a standard (or custom) Python exception, or + - do nothing and let the exception fall through to the next translator, or + - delegate translation to the next translator by throwing a new type of exception. + */ + + bool handled = with_internals([&](internals &internals) { + auto &local_exception_translators = get_local_internals().registered_exception_translators; + if (detail::apply_exception_translators(local_exception_translators)) { + return true; + } + auto &exception_translators = internals.registered_exception_translators; + if (detail::apply_exception_translators(exception_translators)) { + return true; + } + return false; + }); + + if (!handled) { + set_error(PyExc_SystemError, "Exception escaped from default exception translator!"); + } +} + +PYBIND11_NAMESPACE_END(detail) +PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE) diff --git a/examples/knxPython/pybind11/include/pybind11/detail/value_and_holder.h b/examples/knxPython/pybind11/include/pybind11/detail/value_and_holder.h new file mode 100644 index 0000000..ca37d70 --- /dev/null +++ b/examples/knxPython/pybind11/include/pybind11/detail/value_and_holder.h @@ -0,0 +1,77 @@ +// Copyright (c) 2016-2024 The Pybind Development Team. +// All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#pragma once + +#include "common.h" + +#include +#include + +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE) +PYBIND11_NAMESPACE_BEGIN(detail) + +struct value_and_holder { + instance *inst = nullptr; + size_t index = 0u; + const detail::type_info *type = nullptr; + void **vh = nullptr; + + // Main constructor for a found value/holder: + value_and_holder(instance *i, const detail::type_info *type, size_t vpos, size_t index) + : inst{i}, index{index}, type{type}, + vh{inst->simple_layout ? inst->simple_value_holder + : &inst->nonsimple.values_and_holders[vpos]} {} + + // Default constructor (used to signal a value-and-holder not found by get_value_and_holder()) + value_and_holder() = default; + + // Used for past-the-end iterator + explicit value_and_holder(size_t index) : index{index} {} + + template + V *&value_ptr() const { + return reinterpret_cast(vh[0]); + } + // True if this `value_and_holder` has a non-null value pointer + explicit operator bool() const { return value_ptr() != nullptr; } + + template + H &holder() const { + return reinterpret_cast(vh[1]); + } + bool holder_constructed() const { + return inst->simple_layout + ? inst->simple_holder_constructed + : (inst->nonsimple.status[index] & instance::status_holder_constructed) != 0u; + } + // NOLINTNEXTLINE(readability-make-member-function-const) + void set_holder_constructed(bool v = true) { + if (inst->simple_layout) { + inst->simple_holder_constructed = v; + } else if (v) { + inst->nonsimple.status[index] |= instance::status_holder_constructed; + } else { + inst->nonsimple.status[index] &= (std::uint8_t) ~instance::status_holder_constructed; + } + } + bool instance_registered() const { + return inst->simple_layout + ? inst->simple_instance_registered + : ((inst->nonsimple.status[index] & instance::status_instance_registered) != 0); + } + // NOLINTNEXTLINE(readability-make-member-function-const) + void set_instance_registered(bool v = true) { + if (inst->simple_layout) { + inst->simple_instance_registered = v; + } else if (v) { + inst->nonsimple.status[index] |= instance::status_instance_registered; + } else { + inst->nonsimple.status[index] &= (std::uint8_t) ~instance::status_instance_registered; + } + } +}; + +PYBIND11_NAMESPACE_END(detail) +PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE) diff --git a/examples/knxPython/pybind11/tests/exo_planet_c_api.cpp b/examples/knxPython/pybind11/tests/exo_planet_c_api.cpp new file mode 100644 index 0000000..3bde0b2 --- /dev/null +++ b/examples/knxPython/pybind11/tests/exo_planet_c_api.cpp @@ -0,0 +1,103 @@ +// Copyright (c) 2024 The pybind Community. + +// THIS MUST STAY AT THE TOP! +#include // EXCLUSIVELY for PYBIND11_PLATFORM_ABI_ID +// Potential future direction to maximize reusability: +// (e.g. for use from SWIG, Cython, PyCLIF, nanobind): +// #include +// This would only depend on: +// 1. A C++ compiler, WITHOUT requiring -fexceptions. +// 2. Python.h + +#include "test_cpp_conduit_traveler_types.h" + +#include +#include + +namespace { + +void *get_cpp_conduit_void_ptr(PyObject *py_obj, const std::type_info *cpp_type_info) { + PyObject *cpp_type_info_capsule + = PyCapsule_New(const_cast(static_cast(cpp_type_info)), + typeid(std::type_info).name(), + nullptr); + if (cpp_type_info_capsule == nullptr) { + return nullptr; + } + PyObject *cpp_conduit = PyObject_CallMethod(py_obj, + "_pybind11_conduit_v1_", + "yOy", + PYBIND11_PLATFORM_ABI_ID, + cpp_type_info_capsule, + "raw_pointer_ephemeral"); + Py_DECREF(cpp_type_info_capsule); + if (cpp_conduit == nullptr) { + return nullptr; + } + void *void_ptr = PyCapsule_GetPointer(cpp_conduit, cpp_type_info->name()); + Py_DECREF(cpp_conduit); + if (PyErr_Occurred()) { + return nullptr; + } + return void_ptr; +} + +template +T *get_cpp_conduit_type_ptr(PyObject *py_obj) { + void *void_ptr = get_cpp_conduit_void_ptr(py_obj, &typeid(T)); + if (void_ptr == nullptr) { + return nullptr; + } + return static_cast(void_ptr); +} + +extern "C" PyObject *wrapGetLuggage(PyObject * /*self*/, PyObject *traveler) { + const auto *cpp_traveler + = get_cpp_conduit_type_ptr(traveler); + if (cpp_traveler == nullptr) { + return nullptr; + } + return PyUnicode_FromString(cpp_traveler->luggage.c_str()); +} + +extern "C" PyObject *wrapGetPoints(PyObject * /*self*/, PyObject *premium_traveler) { + const auto *cpp_premium_traveler + = get_cpp_conduit_type_ptr( + premium_traveler); + if (cpp_premium_traveler == nullptr) { + return nullptr; + } + return PyLong_FromLong(static_cast(cpp_premium_traveler->points)); +} + +PyMethodDef ThisMethodDef[] = {{"GetLuggage", wrapGetLuggage, METH_O, nullptr}, + {"GetPoints", wrapGetPoints, METH_O, nullptr}, + {nullptr, nullptr, 0, nullptr}}; + +struct PyModuleDef ThisModuleDef = { + PyModuleDef_HEAD_INIT, // m_base + "exo_planet_c_api", // m_name + nullptr, // m_doc + -1, // m_size + ThisMethodDef, // m_methods + nullptr, // m_slots + nullptr, // m_traverse + nullptr, // m_clear + nullptr // m_free +}; + +} // namespace + +#if defined(WIN32) || defined(_WIN32) +# define EXO_PLANET_C_API_EXPORT __declspec(dllexport) +#else +# define EXO_PLANET_C_API_EXPORT __attribute__((visibility("default"))) +#endif + +extern "C" EXO_PLANET_C_API_EXPORT PyObject *PyInit_exo_planet_c_api() { + PyObject *m = PyModule_Create(&ThisModuleDef); + if (m == nullptr) { + return nullptr; + } + return m; +} diff --git a/examples/knxPython/pybind11/tests/exo_planet_pybind11.cpp b/examples/knxPython/pybind11/tests/exo_planet_pybind11.cpp new file mode 100644 index 0000000..9d1a2b8 --- /dev/null +++ b/examples/knxPython/pybind11/tests/exo_planet_pybind11.cpp @@ -0,0 +1,19 @@ +// Copyright (c) 2024 The pybind Community. + +#if defined(PYBIND11_INTERNALS_VERSION) +# undef PYBIND11_INTERNALS_VERSION +#endif +#define PYBIND11_INTERNALS_VERSION 900000001 + +#include "test_cpp_conduit_traveler_bindings.h" + +namespace pybind11_tests { +namespace test_cpp_conduit { + +PYBIND11_MODULE(exo_planet_pybind11, m) { + wrap_traveler(m); + m.def("wrap_very_lonely_traveler", [m]() { wrap_very_lonely_traveler(m); }); +} + +} // namespace test_cpp_conduit +} // namespace pybind11_tests diff --git a/examples/knxPython/pybind11/tests/home_planet_very_lonely_traveler.cpp b/examples/knxPython/pybind11/tests/home_planet_very_lonely_traveler.cpp new file mode 100644 index 0000000..78d50cf --- /dev/null +++ b/examples/knxPython/pybind11/tests/home_planet_very_lonely_traveler.cpp @@ -0,0 +1,13 @@ +// Copyright (c) 2024 The pybind Community. + +#include "test_cpp_conduit_traveler_bindings.h" + +namespace pybind11_tests { +namespace test_cpp_conduit { + +PYBIND11_MODULE(home_planet_very_lonely_traveler, m) { + m.def("wrap_very_lonely_traveler", [m]() { wrap_very_lonely_traveler(m); }); +} + +} // namespace test_cpp_conduit +} // namespace pybind11_tests diff --git a/examples/knxPython/pybind11/tests/pyproject.toml b/examples/knxPython/pybind11/tests/pyproject.toml new file mode 100644 index 0000000..044bf15 --- /dev/null +++ b/examples/knxPython/pybind11/tests/pyproject.toml @@ -0,0 +1,21 @@ +# Warning: this is currently used for pyodide, and is not a general out-of-tree +# builder for the tests (yet). Specifically, wheels can't be built from SDists. + +[build-system] +requires = ["scikit-build-core"] +build-backend = "scikit_build_core.build" + +[project] +name = "pybind11_tests" +version = "0.0.1" +dependencies = ["pytest", "pytest-timeout", "numpy", "scipy"] + +[tool.scikit-build] +# Hide a warning while we also support CMake < 3.15 +cmake.version = ">=3.15" + +[tool.scikit-build.cmake.define] +PYBIND11_FINDPYTHON = true + +[tool.cibuildwheel] +test-command = "pytest -o timeout=0 -p no:cacheprovider {project}/tests/test_*.py" diff --git a/examples/knxPython/pybind11/tests/test_cpp_conduit.cpp b/examples/knxPython/pybind11/tests/test_cpp_conduit.cpp new file mode 100644 index 0000000..4ee4f06 --- /dev/null +++ b/examples/knxPython/pybind11/tests/test_cpp_conduit.cpp @@ -0,0 +1,22 @@ +// Copyright (c) 2024 The pybind Community. + +#include "pybind11_tests.h" +#include "test_cpp_conduit_traveler_bindings.h" + +#include + +namespace pybind11_tests { +namespace test_cpp_conduit { + +TEST_SUBMODULE(cpp_conduit, m) { + m.attr("PYBIND11_PLATFORM_ABI_ID") = py::bytes(PYBIND11_PLATFORM_ABI_ID); + m.attr("cpp_type_info_capsule_Traveler") + = py::capsule(&typeid(Traveler), typeid(std::type_info).name()); + m.attr("cpp_type_info_capsule_int") = py::capsule(&typeid(int), typeid(std::type_info).name()); + + wrap_traveler(m); + wrap_lonely_traveler(m); +} + +} // namespace test_cpp_conduit +} // namespace pybind11_tests diff --git a/examples/knxPython/pybind11/tests/test_cpp_conduit.py b/examples/knxPython/pybind11/tests/test_cpp_conduit.py new file mode 100644 index 0000000..51fcf69 --- /dev/null +++ b/examples/knxPython/pybind11/tests/test_cpp_conduit.py @@ -0,0 +1,162 @@ +# Copyright (c) 2024 The pybind Community. + +from __future__ import annotations + +import exo_planet_c_api +import exo_planet_pybind11 +import home_planet_very_lonely_traveler +import pytest + +from pybind11_tests import cpp_conduit as home_planet + + +def test_traveler_getattr_actually_exists(): + t_h = home_planet.Traveler("home") + assert t_h.any_name == "Traveler GetAttr: any_name luggage: home" + + +def test_premium_traveler_getattr_actually_exists(): + t_h = home_planet.PremiumTraveler("home", 7) + assert t_h.secret_name == "PremiumTraveler GetAttr: secret_name points: 7" + + +def test_call_cpp_conduit_success(): + t_h = home_planet.Traveler("home") + cap = t_h._pybind11_conduit_v1_( + home_planet.PYBIND11_PLATFORM_ABI_ID, + home_planet.cpp_type_info_capsule_Traveler, + b"raw_pointer_ephemeral", + ) + assert cap.__class__.__name__ == "PyCapsule" + + +def test_call_cpp_conduit_platform_abi_id_mismatch(): + t_h = home_planet.Traveler("home") + cap = t_h._pybind11_conduit_v1_( + home_planet.PYBIND11_PLATFORM_ABI_ID + b"MISMATCH", + home_planet.cpp_type_info_capsule_Traveler, + b"raw_pointer_ephemeral", + ) + assert cap is None + + +def test_call_cpp_conduit_cpp_type_info_capsule_mismatch(): + t_h = home_planet.Traveler("home") + cap = t_h._pybind11_conduit_v1_( + home_planet.PYBIND11_PLATFORM_ABI_ID, + home_planet.cpp_type_info_capsule_int, + b"raw_pointer_ephemeral", + ) + assert cap is None + + +def test_call_cpp_conduit_pointer_kind_invalid(): + t_h = home_planet.Traveler("home") + with pytest.raises( + RuntimeError, match='^Invalid pointer_kind: "raw_pointer_ephemreal"$' + ): + t_h._pybind11_conduit_v1_( + home_planet.PYBIND11_PLATFORM_ABI_ID, + home_planet.cpp_type_info_capsule_Traveler, + b"raw_pointer_ephemreal", + ) + + +def test_home_only_basic(): + t_h = home_planet.Traveler("home") + assert t_h.luggage == "home" + assert home_planet.get_luggage(t_h) == "home" + + +def test_home_only_premium(): + p_h = home_planet.PremiumTraveler("home", 2) + assert p_h.luggage == "home" + assert home_planet.get_luggage(p_h) == "home" + assert home_planet.get_points(p_h) == 2 + + +def test_exo_only_basic(): + t_e = exo_planet_pybind11.Traveler("exo") + assert t_e.luggage == "exo" + assert exo_planet_pybind11.get_luggage(t_e) == "exo" + + +def test_exo_only_premium(): + p_e = exo_planet_pybind11.PremiumTraveler("exo", 3) + assert p_e.luggage == "exo" + assert exo_planet_pybind11.get_luggage(p_e) == "exo" + assert exo_planet_pybind11.get_points(p_e) == 3 + + +def test_home_passed_to_exo_basic(): + t_h = home_planet.Traveler("home") + assert exo_planet_pybind11.get_luggage(t_h) == "home" + + +def test_exo_passed_to_home_basic(): + t_e = exo_planet_pybind11.Traveler("exo") + assert home_planet.get_luggage(t_e) == "exo" + + +def test_home_passed_to_exo_premium(): + p_h = home_planet.PremiumTraveler("home", 2) + assert exo_planet_pybind11.get_luggage(p_h) == "home" + assert exo_planet_pybind11.get_points(p_h) == 2 + + +def test_exo_passed_to_home_premium(): + p_e = exo_planet_pybind11.PremiumTraveler("exo", 3) + assert home_planet.get_luggage(p_e) == "exo" + assert home_planet.get_points(p_e) == 3 + + +@pytest.mark.parametrize( + "traveler_type", [home_planet.Traveler, exo_planet_pybind11.Traveler] +) +def test_exo_planet_c_api_traveler(traveler_type): + t = traveler_type("socks") + assert exo_planet_c_api.GetLuggage(t) == "socks" + + +@pytest.mark.parametrize( + "premium_traveler_type", + [home_planet.PremiumTraveler, exo_planet_pybind11.PremiumTraveler], +) +def test_exo_planet_c_api_premium_traveler(premium_traveler_type): + pt = premium_traveler_type("gucci", 5) + assert exo_planet_c_api.GetLuggage(pt) == "gucci" + assert exo_planet_c_api.GetPoints(pt) == 5 + + +def test_home_planet_wrap_very_lonely_traveler(): + # This does not exercise the cpp_conduit feature, but is here to + # demonstrate that the cpp_conduit feature does not solve all + # cross-extension interoperability issues. + # Here is the proof that the following works for extensions with + # matching `PYBIND11_INTERNALS_ID`s: + # test_cpp_conduit.cpp: + # py::class_ + # home_planet_very_lonely_traveler.cpp: + # py::class_ + # See test_exo_planet_pybind11_wrap_very_lonely_traveler() for the negative + # test. + assert home_planet.LonelyTraveler is not None # Verify that the base class exists. + home_planet_very_lonely_traveler.wrap_very_lonely_traveler() + # Ensure that the derived class exists. + assert home_planet_very_lonely_traveler.VeryLonelyTraveler is not None + + +def test_exo_planet_pybind11_wrap_very_lonely_traveler(): + # See comment under test_home_planet_wrap_very_lonely_traveler() first. + # Here the `PYBIND11_INTERNALS_ID`s don't match between: + # test_cpp_conduit.cpp: + # py::class_ + # exo_planet_pybind11.cpp: + # py::class_ + assert home_planet.LonelyTraveler is not None # Verify that the base class exists. + with pytest.raises( + RuntimeError, + match='^generic_type: type "VeryLonelyTraveler" referenced unknown base type ' + '"pybind11_tests::test_cpp_conduit::LonelyTraveler"$', + ): + exo_planet_pybind11.wrap_very_lonely_traveler() diff --git a/examples/knxPython/pybind11/tests/test_cpp_conduit_traveler_bindings.h b/examples/knxPython/pybind11/tests/test_cpp_conduit_traveler_bindings.h new file mode 100644 index 0000000..4e52c90 --- /dev/null +++ b/examples/knxPython/pybind11/tests/test_cpp_conduit_traveler_bindings.h @@ -0,0 +1,47 @@ +// Copyright (c) 2024 The pybind Community. + +#pragma once + +#include + +#include "test_cpp_conduit_traveler_types.h" + +#include + +namespace pybind11_tests { +namespace test_cpp_conduit { + +namespace py = pybind11; + +inline void wrap_traveler(py::module_ m) { + py::class_(m, "Traveler") + .def(py::init()) + .def_readwrite("luggage", &Traveler::luggage) + // See issue #3788: + .def("__getattr__", [](const Traveler &self, const std::string &key) { + return "Traveler GetAttr: " + key + " luggage: " + self.luggage; + }); + + m.def("get_luggage", [](const Traveler &person) { return person.luggage; }); + + py::class_(m, "PremiumTraveler") + .def(py::init()) + .def_readwrite("points", &PremiumTraveler::points) + // See issue #3788: + .def("__getattr__", [](const PremiumTraveler &self, const std::string &key) { + return "PremiumTraveler GetAttr: " + key + " points: " + std::to_string(self.points); + }); + + m.def("get_points", [](const PremiumTraveler &person) { return person.points; }); +} + +inline void wrap_lonely_traveler(py::module_ m) { + py::class_(std::move(m), "LonelyTraveler"); +} + +inline void wrap_very_lonely_traveler(py::module_ m) { + py::class_(std::move(m), "VeryLonelyTraveler"); +} + +} // namespace test_cpp_conduit +} // namespace pybind11_tests diff --git a/examples/knxPython/pybind11/tests/test_cpp_conduit_traveler_types.h b/examples/knxPython/pybind11/tests/test_cpp_conduit_traveler_types.h new file mode 100644 index 0000000..b8e6a5a --- /dev/null +++ b/examples/knxPython/pybind11/tests/test_cpp_conduit_traveler_types.h @@ -0,0 +1,25 @@ +// Copyright (c) 2024 The pybind Community. + +#pragma once + +#include + +namespace pybind11_tests { +namespace test_cpp_conduit { + +struct Traveler { + explicit Traveler(const std::string &luggage) : luggage(luggage) {} + std::string luggage; +}; + +struct PremiumTraveler : Traveler { + explicit PremiumTraveler(const std::string &luggage, int points) + : Traveler(luggage), points(points) {} + int points; +}; + +struct LonelyTraveler {}; +struct VeryLonelyTraveler : LonelyTraveler {}; + +} // namespace test_cpp_conduit +} // namespace pybind11_tests diff --git a/examples/knxPython/pybind11/tests/test_type_caster_std_function_specializations.cpp b/examples/knxPython/pybind11/tests/test_type_caster_std_function_specializations.cpp new file mode 100644 index 0000000..89213dd --- /dev/null +++ b/examples/knxPython/pybind11/tests/test_type_caster_std_function_specializations.cpp @@ -0,0 +1,46 @@ +#include +#include + +#include "pybind11_tests.h" + +namespace py = pybind11; + +namespace { + +struct SpecialReturn { + int value = 99; +}; + +} // namespace + +namespace pybind11 { +namespace detail { +namespace type_caster_std_function_specializations { + +template +struct func_wrapper : func_wrapper_base { + using func_wrapper_base::func_wrapper_base; + SpecialReturn operator()(Args... args) const { + gil_scoped_acquire acq; + SpecialReturn result; + try { + result = hfunc.f(std::forward(args)...).template cast(); + } catch (error_already_set &) { + result.value += 1; + } + result.value += 100; + return result; + } +}; + +} // namespace type_caster_std_function_specializations +} // namespace detail +} // namespace pybind11 + +TEST_SUBMODULE(type_caster_std_function_specializations, m) { + py::class_(m, "SpecialReturn") + .def(py::init<>()) + .def_readwrite("value", &SpecialReturn::value); + m.def("call_callback_with_special_return", + [](const std::function &func) { return func(); }); +} diff --git a/examples/knxPython/pybind11/tests/test_type_caster_std_function_specializations.py b/examples/knxPython/pybind11/tests/test_type_caster_std_function_specializations.py new file mode 100644 index 0000000..9e45d4f --- /dev/null +++ b/examples/knxPython/pybind11/tests/test_type_caster_std_function_specializations.py @@ -0,0 +1,15 @@ +from __future__ import annotations + +from pybind11_tests import type_caster_std_function_specializations as m + + +def test_callback_with_special_return(): + def return_special(): + return m.SpecialReturn() + + def raise_exception(): + raise ValueError("called raise_exception.") + + assert return_special().value == 99 + assert m.call_callback_with_special_return(return_special).value == 199 + assert m.call_callback_with_special_return(raise_exception).value == 200 diff --git a/src/knx/group_object/dpt/dpt7.cpp b/src/knx/group_object/dpt/dpt7.cpp new file mode 100644 index 0000000..8e210c9 --- /dev/null +++ b/src/knx/group_object/dpt/dpt7.cpp @@ -0,0 +1,19 @@ +#include "dpt7.h" + +#include "dptconvert.h" + +Knx::Go_SizeCode Knx::Dpt7::size() const +{ + return Go_2_Octets; +} + +void Knx::Dpt7::encode(uint8_t* data) const +{ + unsigned16ToPayload(data, 0, _value, 0xFFFF); +} + +bool Knx::Dpt7::decode(uint8_t* data) +{ + _value = unsigned16FromPayload(data, 0); + return true; +} diff --git a/src/knx/group_object/dpt/dpt7.h b/src/knx/group_object/dpt/dpt7.h new file mode 100644 index 0000000..08a70d0 --- /dev/null +++ b/src/knx/group_object/dpt/dpt7.h @@ -0,0 +1,25 @@ +#pragma once +#include "dpt.h" +namespace Knx +{ + class Dpt7: public DPT + { + public: + Go_SizeCode size() const override; + + void encode(uint8_t* data) const override; + bool decode(uint8_t* data) override; + }; + +typedef Dpt7 DPT_Value_2_Ucount; +typedef Dpt7 DPT_TimePeriodMsec; +typedef Dpt7 DPT_TimePeriod10MSec; +typedef Dpt7 DPT_TimePeriod100MSec; +typedef Dpt7 DPT_TimePeriodSec; +typedef Dpt7 DPT_TimePeriodMin; +typedef Dpt7 DPT_TimePeriodHrs; +typedef Dpt7 DPT_PropDataType; +typedef Dpt7 DPT_Length_mm; +typedef Dpt7 DPT_UElCurrentmA; +typedef Dpt7 DPT_Brightness; +} \ No newline at end of file