netgen-mesher 6.2.2506.post35.dev0__cp314-cp314-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. netgen/NgOCC.py +7 -0
  2. netgen/__init__.py +114 -0
  3. netgen/__init__.pyi +22 -0
  4. netgen/__main__.py +53 -0
  5. netgen/cmake/NetgenConfig.cmake +79 -0
  6. netgen/cmake/netgen-targets-release.cmake +69 -0
  7. netgen/cmake/netgen-targets.cmake +146 -0
  8. netgen/config/__init__.py +1 -0
  9. netgen/config/__init__.pyi +52 -0
  10. netgen/config/__main__.py +4 -0
  11. netgen/config/config.py +68 -0
  12. netgen/config/config.pyi +54 -0
  13. netgen/csg.py +25 -0
  14. netgen/geom2d.py +178 -0
  15. netgen/gui.py +82 -0
  16. netgen/include/core/archive.hpp +1256 -0
  17. netgen/include/core/array.hpp +1760 -0
  18. netgen/include/core/autodiff.hpp +1131 -0
  19. netgen/include/core/autodiffdiff.hpp +733 -0
  20. netgen/include/core/bitarray.hpp +240 -0
  21. netgen/include/core/concurrentqueue.h +3619 -0
  22. netgen/include/core/exception.hpp +145 -0
  23. netgen/include/core/flags.hpp +199 -0
  24. netgen/include/core/hashtable.hpp +1281 -0
  25. netgen/include/core/localheap.hpp +318 -0
  26. netgen/include/core/logging.hpp +117 -0
  27. netgen/include/core/memtracer.hpp +221 -0
  28. netgen/include/core/mpi4py_pycapi.h +245 -0
  29. netgen/include/core/mpi_wrapper.hpp +643 -0
  30. netgen/include/core/ng_mpi.hpp +94 -0
  31. netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
  32. netgen/include/core/ng_mpi_native.hpp +25 -0
  33. netgen/include/core/ngcore.hpp +32 -0
  34. netgen/include/core/ngcore_api.hpp +152 -0
  35. netgen/include/core/ngstream.hpp +115 -0
  36. netgen/include/core/paje_trace.hpp +279 -0
  37. netgen/include/core/profiler.hpp +382 -0
  38. netgen/include/core/python_ngcore.hpp +457 -0
  39. netgen/include/core/ranges.hpp +109 -0
  40. netgen/include/core/register_archive.hpp +100 -0
  41. netgen/include/core/signal.hpp +82 -0
  42. netgen/include/core/simd.hpp +160 -0
  43. netgen/include/core/simd_arm64.hpp +407 -0
  44. netgen/include/core/simd_avx.hpp +394 -0
  45. netgen/include/core/simd_avx512.hpp +285 -0
  46. netgen/include/core/simd_generic.hpp +1053 -0
  47. netgen/include/core/simd_math.hpp +178 -0
  48. netgen/include/core/simd_sse.hpp +289 -0
  49. netgen/include/core/statushandler.hpp +37 -0
  50. netgen/include/core/symboltable.hpp +153 -0
  51. netgen/include/core/table.hpp +810 -0
  52. netgen/include/core/taskmanager.hpp +1161 -0
  53. netgen/include/core/type_traits.hpp +65 -0
  54. netgen/include/core/utils.hpp +385 -0
  55. netgen/include/core/version.hpp +102 -0
  56. netgen/include/core/xbool.hpp +47 -0
  57. netgen/include/csg/algprim.hpp +563 -0
  58. netgen/include/csg/brick.hpp +150 -0
  59. netgen/include/csg/csg.hpp +43 -0
  60. netgen/include/csg/csgeom.hpp +389 -0
  61. netgen/include/csg/csgparser.hpp +101 -0
  62. netgen/include/csg/curve2d.hpp +67 -0
  63. netgen/include/csg/edgeflw.hpp +112 -0
  64. netgen/include/csg/explicitcurve2d.hpp +113 -0
  65. netgen/include/csg/extrusion.hpp +185 -0
  66. netgen/include/csg/gencyl.hpp +70 -0
  67. netgen/include/csg/geoml.hpp +16 -0
  68. netgen/include/csg/identify.hpp +213 -0
  69. netgen/include/csg/manifold.hpp +29 -0
  70. netgen/include/csg/meshsurf.hpp +46 -0
  71. netgen/include/csg/polyhedra.hpp +121 -0
  72. netgen/include/csg/revolution.hpp +180 -0
  73. netgen/include/csg/singularref.hpp +84 -0
  74. netgen/include/csg/solid.hpp +295 -0
  75. netgen/include/csg/specpoin.hpp +194 -0
  76. netgen/include/csg/spline3d.hpp +99 -0
  77. netgen/include/csg/splinesurface.hpp +85 -0
  78. netgen/include/csg/surface.hpp +394 -0
  79. netgen/include/csg/triapprox.hpp +63 -0
  80. netgen/include/csg/vscsg.hpp +34 -0
  81. netgen/include/general/autodiff.hpp +356 -0
  82. netgen/include/general/autoptr.hpp +39 -0
  83. netgen/include/general/gzstream.h +121 -0
  84. netgen/include/general/hashtabl.hpp +1692 -0
  85. netgen/include/general/myadt.hpp +48 -0
  86. netgen/include/general/mystring.hpp +226 -0
  87. netgen/include/general/netgenout.hpp +205 -0
  88. netgen/include/general/ngarray.hpp +797 -0
  89. netgen/include/general/ngbitarray.hpp +149 -0
  90. netgen/include/general/ngpython.hpp +74 -0
  91. netgen/include/general/optmem.hpp +44 -0
  92. netgen/include/general/parthreads.hpp +138 -0
  93. netgen/include/general/seti.hpp +50 -0
  94. netgen/include/general/sort.hpp +47 -0
  95. netgen/include/general/spbita2d.hpp +59 -0
  96. netgen/include/general/stack.hpp +114 -0
  97. netgen/include/general/table.hpp +280 -0
  98. netgen/include/general/template.hpp +509 -0
  99. netgen/include/geom2d/csg2d.hpp +750 -0
  100. netgen/include/geom2d/geometry2d.hpp +280 -0
  101. netgen/include/geom2d/spline2d.hpp +234 -0
  102. netgen/include/geom2d/vsgeom2d.hpp +28 -0
  103. netgen/include/gprim/adtree.hpp +1392 -0
  104. netgen/include/gprim/geom2d.hpp +858 -0
  105. netgen/include/gprim/geom3d.hpp +749 -0
  106. netgen/include/gprim/geomfuncs.hpp +212 -0
  107. netgen/include/gprim/geomobjects.hpp +544 -0
  108. netgen/include/gprim/geomops.hpp +404 -0
  109. netgen/include/gprim/geomtest3d.hpp +101 -0
  110. netgen/include/gprim/gprim.hpp +33 -0
  111. netgen/include/gprim/spline.hpp +778 -0
  112. netgen/include/gprim/splinegeometry.hpp +73 -0
  113. netgen/include/gprim/transform3d.hpp +216 -0
  114. netgen/include/include/acisgeom.hpp +3 -0
  115. netgen/include/include/csg.hpp +1 -0
  116. netgen/include/include/geometry2d.hpp +1 -0
  117. netgen/include/include/gprim.hpp +1 -0
  118. netgen/include/include/incopengl.hpp +62 -0
  119. netgen/include/include/inctcl.hpp +13 -0
  120. netgen/include/include/incvis.hpp +6 -0
  121. netgen/include/include/linalg.hpp +1 -0
  122. netgen/include/include/meshing.hpp +1 -0
  123. netgen/include/include/myadt.hpp +1 -0
  124. netgen/include/include/mydefs.hpp +70 -0
  125. netgen/include/include/mystdlib.h +59 -0
  126. netgen/include/include/netgen_config.hpp +27 -0
  127. netgen/include/include/netgen_version.hpp +9 -0
  128. netgen/include/include/nginterface_v2_impl.hpp +395 -0
  129. netgen/include/include/ngsimd.hpp +1 -0
  130. netgen/include/include/occgeom.hpp +1 -0
  131. netgen/include/include/opti.hpp +1 -0
  132. netgen/include/include/parallel.hpp +1 -0
  133. netgen/include/include/stlgeom.hpp +1 -0
  134. netgen/include/include/visual.hpp +1 -0
  135. netgen/include/interface/rw_medit.hpp +11 -0
  136. netgen/include/interface/writeuser.hpp +80 -0
  137. netgen/include/linalg/densemat.hpp +414 -0
  138. netgen/include/linalg/linalg.hpp +29 -0
  139. netgen/include/linalg/opti.hpp +142 -0
  140. netgen/include/linalg/polynomial.hpp +47 -0
  141. netgen/include/linalg/vector.hpp +217 -0
  142. netgen/include/meshing/adfront2.hpp +274 -0
  143. netgen/include/meshing/adfront3.hpp +332 -0
  144. netgen/include/meshing/basegeom.hpp +370 -0
  145. netgen/include/meshing/bcfunctions.hpp +53 -0
  146. netgen/include/meshing/bisect.hpp +72 -0
  147. netgen/include/meshing/boundarylayer.hpp +113 -0
  148. netgen/include/meshing/classifyhpel.hpp +1984 -0
  149. netgen/include/meshing/clusters.hpp +46 -0
  150. netgen/include/meshing/curvedelems.hpp +274 -0
  151. netgen/include/meshing/delaunay2d.hpp +73 -0
  152. netgen/include/meshing/fieldlines.hpp +103 -0
  153. netgen/include/meshing/findip.hpp +198 -0
  154. netgen/include/meshing/findip2.hpp +103 -0
  155. netgen/include/meshing/geomsearch.hpp +69 -0
  156. netgen/include/meshing/global.hpp +54 -0
  157. netgen/include/meshing/hpref_hex.hpp +330 -0
  158. netgen/include/meshing/hpref_prism.hpp +3405 -0
  159. netgen/include/meshing/hpref_pyramid.hpp +154 -0
  160. netgen/include/meshing/hpref_quad.hpp +2082 -0
  161. netgen/include/meshing/hpref_segm.hpp +122 -0
  162. netgen/include/meshing/hpref_tet.hpp +4230 -0
  163. netgen/include/meshing/hpref_trig.hpp +848 -0
  164. netgen/include/meshing/hprefinement.hpp +366 -0
  165. netgen/include/meshing/improve2.hpp +178 -0
  166. netgen/include/meshing/improve3.hpp +151 -0
  167. netgen/include/meshing/localh.hpp +223 -0
  168. netgen/include/meshing/meshclass.hpp +1076 -0
  169. netgen/include/meshing/meshfunc.hpp +47 -0
  170. netgen/include/meshing/meshing.hpp +63 -0
  171. netgen/include/meshing/meshing2.hpp +163 -0
  172. netgen/include/meshing/meshing3.hpp +123 -0
  173. netgen/include/meshing/meshtool.hpp +90 -0
  174. netgen/include/meshing/meshtype.hpp +1930 -0
  175. netgen/include/meshing/msghandler.hpp +62 -0
  176. netgen/include/meshing/paralleltop.hpp +172 -0
  177. netgen/include/meshing/python_mesh.hpp +206 -0
  178. netgen/include/meshing/ruler2.hpp +172 -0
  179. netgen/include/meshing/ruler3.hpp +211 -0
  180. netgen/include/meshing/soldata.hpp +141 -0
  181. netgen/include/meshing/specials.hpp +17 -0
  182. netgen/include/meshing/surfacegeom.hpp +73 -0
  183. netgen/include/meshing/topology.hpp +1003 -0
  184. netgen/include/meshing/validate.hpp +21 -0
  185. netgen/include/meshing/visual_interface.hpp +71 -0
  186. netgen/include/mydefs.hpp +70 -0
  187. netgen/include/nginterface.h +474 -0
  188. netgen/include/nginterface_v2.hpp +406 -0
  189. netgen/include/nglib.h +697 -0
  190. netgen/include/nglib_occ.h +50 -0
  191. netgen/include/occ/occ_edge.hpp +47 -0
  192. netgen/include/occ/occ_face.hpp +52 -0
  193. netgen/include/occ/occ_solid.hpp +23 -0
  194. netgen/include/occ/occ_utils.hpp +376 -0
  195. netgen/include/occ/occ_vertex.hpp +30 -0
  196. netgen/include/occ/occgeom.hpp +659 -0
  197. netgen/include/occ/occmeshsurf.hpp +168 -0
  198. netgen/include/occ/vsocc.hpp +33 -0
  199. netgen/include/pybind11/LICENSE +29 -0
  200. netgen/include/pybind11/attr.h +722 -0
  201. netgen/include/pybind11/buffer_info.h +208 -0
  202. netgen/include/pybind11/cast.h +2361 -0
  203. netgen/include/pybind11/chrono.h +228 -0
  204. netgen/include/pybind11/common.h +2 -0
  205. netgen/include/pybind11/complex.h +74 -0
  206. netgen/include/pybind11/conduit/README.txt +15 -0
  207. netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
  208. netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
  209. netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
  210. netgen/include/pybind11/critical_section.h +56 -0
  211. netgen/include/pybind11/detail/class.h +823 -0
  212. netgen/include/pybind11/detail/common.h +1348 -0
  213. netgen/include/pybind11/detail/cpp_conduit.h +75 -0
  214. netgen/include/pybind11/detail/descr.h +226 -0
  215. netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
  216. netgen/include/pybind11/detail/exception_translation.h +71 -0
  217. netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
  218. netgen/include/pybind11/detail/init.h +538 -0
  219. netgen/include/pybind11/detail/internals.h +799 -0
  220. netgen/include/pybind11/detail/native_enum_data.h +209 -0
  221. netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
  222. netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
  223. netgen/include/pybind11/detail/type_caster_base.h +1591 -0
  224. netgen/include/pybind11/detail/typeid.h +65 -0
  225. netgen/include/pybind11/detail/using_smart_holder.h +22 -0
  226. netgen/include/pybind11/detail/value_and_holder.h +90 -0
  227. netgen/include/pybind11/eigen/common.h +9 -0
  228. netgen/include/pybind11/eigen/matrix.h +723 -0
  229. netgen/include/pybind11/eigen/tensor.h +521 -0
  230. netgen/include/pybind11/eigen.h +12 -0
  231. netgen/include/pybind11/embed.h +320 -0
  232. netgen/include/pybind11/eval.h +161 -0
  233. netgen/include/pybind11/functional.h +147 -0
  234. netgen/include/pybind11/gil.h +199 -0
  235. netgen/include/pybind11/gil_safe_call_once.h +102 -0
  236. netgen/include/pybind11/gil_simple.h +37 -0
  237. netgen/include/pybind11/iostream.h +265 -0
  238. netgen/include/pybind11/native_enum.h +67 -0
  239. netgen/include/pybind11/numpy.h +2312 -0
  240. netgen/include/pybind11/operators.h +202 -0
  241. netgen/include/pybind11/options.h +92 -0
  242. netgen/include/pybind11/pybind11.h +3645 -0
  243. netgen/include/pybind11/pytypes.h +2680 -0
  244. netgen/include/pybind11/stl/filesystem.h +114 -0
  245. netgen/include/pybind11/stl.h +666 -0
  246. netgen/include/pybind11/stl_bind.h +858 -0
  247. netgen/include/pybind11/subinterpreter.h +299 -0
  248. netgen/include/pybind11/trampoline_self_life_support.h +65 -0
  249. netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
  250. netgen/include/pybind11/typing.h +298 -0
  251. netgen/include/pybind11/warnings.h +75 -0
  252. netgen/include/stlgeom/meshstlsurface.hpp +67 -0
  253. netgen/include/stlgeom/stlgeom.hpp +491 -0
  254. netgen/include/stlgeom/stlline.hpp +193 -0
  255. netgen/include/stlgeom/stltool.hpp +331 -0
  256. netgen/include/stlgeom/stltopology.hpp +419 -0
  257. netgen/include/stlgeom/vsstl.hpp +58 -0
  258. netgen/include/visualization/meshdoc.hpp +42 -0
  259. netgen/include/visualization/mvdraw.hpp +325 -0
  260. netgen/include/visualization/vispar.hpp +128 -0
  261. netgen/include/visualization/visual.hpp +28 -0
  262. netgen/include/visualization/visual_api.hpp +10 -0
  263. netgen/include/visualization/vssolution.hpp +399 -0
  264. netgen/lib/libnggui.lib +0 -0
  265. netgen/lib/ngcore.lib +0 -0
  266. netgen/lib/nglib.lib +0 -0
  267. netgen/lib/togl.lib +0 -0
  268. netgen/libnggui.dll +0 -0
  269. netgen/libngguipy.lib +0 -0
  270. netgen/libngguipy.pyd +0 -0
  271. netgen/libngpy/_NgOCC.pyi +1545 -0
  272. netgen/libngpy/__init__.pyi +7 -0
  273. netgen/libngpy/_csg.pyi +259 -0
  274. netgen/libngpy/_geom2d.pyi +323 -0
  275. netgen/libngpy/_meshing.pyi +1111 -0
  276. netgen/libngpy/_stl.pyi +131 -0
  277. netgen/libngpy.lib +0 -0
  278. netgen/libngpy.pyd +0 -0
  279. netgen/meshing.py +65 -0
  280. netgen/ngcore.dll +0 -0
  281. netgen/nglib.dll +0 -0
  282. netgen/occ.py +52 -0
  283. netgen/read_gmsh.py +259 -0
  284. netgen/read_meshio.py +22 -0
  285. netgen/stl.py +2 -0
  286. netgen/togl.dll +0 -0
  287. netgen/version.py +2 -0
  288. netgen/webgui.py +529 -0
  289. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
  290. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
  291. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
  292. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
  293. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
  294. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
  295. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
  296. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
  297. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
  298. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
  299. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
  300. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
  301. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
  302. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
  303. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
  304. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
  305. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
  306. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
  307. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
  308. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
  309. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
  310. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
  311. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
  312. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
  313. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
  314. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
  315. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
  316. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
  317. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
  318. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
  319. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
  320. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
  321. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
  322. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
  323. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
  324. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
  325. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
  326. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
  327. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
  328. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
  329. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
  330. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
  331. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
  332. netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
  333. netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
  334. netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
  335. netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
  336. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
  337. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
  338. netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
  339. pyngcore/__init__.py +1 -0
  340. pyngcore/pyngcore.cp314-win_amd64.pyd +0 -0
@@ -0,0 +1,228 @@
1
+ /*
2
+ pybind11/chrono.h: Transparent conversion between std::chrono and python's datetime
3
+
4
+ Copyright (c) 2016 Trent Houliston <trent@houliston.me> and
5
+ Wenzel Jakob <wenzel.jakob@epfl.ch>
6
+
7
+ All rights reserved. Use of this source code is governed by a
8
+ BSD-style license that can be found in the LICENSE file.
9
+ */
10
+
11
+ #pragma once
12
+
13
+ #include "pybind11.h"
14
+
15
+ #include <chrono>
16
+ #include <cmath>
17
+ #include <ctime>
18
+ #include <datetime.h>
19
+ #include <mutex>
20
+
21
+ PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
22
+ PYBIND11_NAMESPACE_BEGIN(detail)
23
+
24
+ template <typename type>
25
+ class duration_caster {
26
+ public:
27
+ using rep = typename type::rep;
28
+ using period = typename type::period;
29
+
30
+ // signed 25 bits required by the standard.
31
+ using days = std::chrono::duration<int_least32_t, std::ratio<86400>>;
32
+
33
+ bool load(handle src, bool) {
34
+ using namespace std::chrono;
35
+
36
+ // Lazy initialise the PyDateTime import
37
+ if (!PyDateTimeAPI) {
38
+ PyDateTime_IMPORT;
39
+ }
40
+
41
+ if (!src) {
42
+ return false;
43
+ }
44
+ // If invoked with datetime.delta object
45
+ if (PyDelta_Check(src.ptr())) {
46
+ value = type(duration_cast<duration<rep, period>>(
47
+ days(PyDateTime_DELTA_GET_DAYS(src.ptr()))
48
+ + seconds(PyDateTime_DELTA_GET_SECONDS(src.ptr()))
49
+ + microseconds(PyDateTime_DELTA_GET_MICROSECONDS(src.ptr()))));
50
+ return true;
51
+ }
52
+ // If invoked with a float we assume it is seconds and convert
53
+ if (PyFloat_Check(src.ptr())) {
54
+ value = type(duration_cast<duration<rep, period>>(
55
+ duration<double>(PyFloat_AsDouble(src.ptr()))));
56
+ return true;
57
+ }
58
+ return false;
59
+ }
60
+
61
+ // If this is a duration just return it back
62
+ static const std::chrono::duration<rep, period> &
63
+ get_duration(const std::chrono::duration<rep, period> &src) {
64
+ return src;
65
+ }
66
+ static const std::chrono::duration<rep, period> &
67
+ get_duration(const std::chrono::duration<rep, period> &&)
68
+ = delete;
69
+
70
+ // If this is a time_point get the time_since_epoch
71
+ template <typename Clock>
72
+ static std::chrono::duration<rep, period>
73
+ get_duration(const std::chrono::time_point<Clock, std::chrono::duration<rep, period>> &src) {
74
+ return src.time_since_epoch();
75
+ }
76
+
77
+ static handle cast(const type &src, return_value_policy /* policy */, handle /* parent */) {
78
+ using namespace std::chrono;
79
+
80
+ // Use overloaded function to get our duration from our source
81
+ // Works out if it is a duration or time_point and get the duration
82
+ auto d = get_duration(src);
83
+
84
+ // Lazy initialise the PyDateTime import
85
+ if (!PyDateTimeAPI) {
86
+ PyDateTime_IMPORT;
87
+ }
88
+
89
+ // Declare these special duration types so the conversions happen with the correct
90
+ // primitive types (int)
91
+ using dd_t = duration<int, std::ratio<86400>>;
92
+ using ss_t = duration<int, std::ratio<1>>;
93
+ using us_t = duration<int, std::micro>;
94
+
95
+ auto dd = duration_cast<dd_t>(d);
96
+ auto subd = d - dd;
97
+ auto ss = duration_cast<ss_t>(subd);
98
+ auto us = duration_cast<us_t>(subd - ss);
99
+ return PyDelta_FromDSU(dd.count(), ss.count(), us.count());
100
+ }
101
+
102
+ PYBIND11_TYPE_CASTER(type, const_name("datetime.timedelta"));
103
+ };
104
+
105
+ inline std::tm *localtime_thread_safe(const std::time_t *time, std::tm *buf) {
106
+ #if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || defined(_MSC_VER)
107
+ if (localtime_s(buf, time))
108
+ return nullptr;
109
+ return buf;
110
+ #else
111
+ static std::mutex mtx;
112
+ std::lock_guard<std::mutex> lock(mtx);
113
+ std::tm *tm_ptr = std::localtime(time);
114
+ if (tm_ptr != nullptr) {
115
+ *buf = *tm_ptr;
116
+ }
117
+ return tm_ptr;
118
+ #endif
119
+ }
120
+
121
+ // This is for casting times on the system clock into datetime.datetime instances
122
+ template <typename Duration>
123
+ class type_caster<std::chrono::time_point<std::chrono::system_clock, Duration>> {
124
+ public:
125
+ using type = std::chrono::time_point<std::chrono::system_clock, Duration>;
126
+ bool load(handle src, bool) {
127
+ using namespace std::chrono;
128
+
129
+ // Lazy initialise the PyDateTime import
130
+ if (!PyDateTimeAPI) {
131
+ PyDateTime_IMPORT;
132
+ }
133
+
134
+ if (!src) {
135
+ return false;
136
+ }
137
+
138
+ std::tm cal;
139
+ microseconds msecs;
140
+
141
+ if (PyDateTime_Check(src.ptr())) {
142
+ cal.tm_sec = PyDateTime_DATE_GET_SECOND(src.ptr());
143
+ cal.tm_min = PyDateTime_DATE_GET_MINUTE(src.ptr());
144
+ cal.tm_hour = PyDateTime_DATE_GET_HOUR(src.ptr());
145
+ cal.tm_mday = PyDateTime_GET_DAY(src.ptr());
146
+ cal.tm_mon = PyDateTime_GET_MONTH(src.ptr()) - 1;
147
+ cal.tm_year = PyDateTime_GET_YEAR(src.ptr()) - 1900;
148
+ cal.tm_isdst = -1;
149
+ msecs = microseconds(PyDateTime_DATE_GET_MICROSECOND(src.ptr()));
150
+ } else if (PyDate_Check(src.ptr())) {
151
+ cal.tm_sec = 0;
152
+ cal.tm_min = 0;
153
+ cal.tm_hour = 0;
154
+ cal.tm_mday = PyDateTime_GET_DAY(src.ptr());
155
+ cal.tm_mon = PyDateTime_GET_MONTH(src.ptr()) - 1;
156
+ cal.tm_year = PyDateTime_GET_YEAR(src.ptr()) - 1900;
157
+ cal.tm_isdst = -1;
158
+ msecs = microseconds(0);
159
+ } else if (PyTime_Check(src.ptr())) {
160
+ cal.tm_sec = PyDateTime_TIME_GET_SECOND(src.ptr());
161
+ cal.tm_min = PyDateTime_TIME_GET_MINUTE(src.ptr());
162
+ cal.tm_hour = PyDateTime_TIME_GET_HOUR(src.ptr());
163
+ cal.tm_mday = 1; // This date (day, month, year) = (1, 0, 70)
164
+ cal.tm_mon = 0; // represents 1-Jan-1970, which is the first
165
+ cal.tm_year = 70; // earliest available date for Python's datetime
166
+ cal.tm_isdst = -1;
167
+ msecs = microseconds(PyDateTime_TIME_GET_MICROSECOND(src.ptr()));
168
+ } else {
169
+ return false;
170
+ }
171
+
172
+ value = time_point_cast<Duration>(system_clock::from_time_t(std::mktime(&cal)) + msecs);
173
+ return true;
174
+ }
175
+
176
+ static handle cast(const std::chrono::time_point<std::chrono::system_clock, Duration> &src,
177
+ return_value_policy /* policy */,
178
+ handle /* parent */) {
179
+ using namespace std::chrono;
180
+
181
+ // Lazy initialise the PyDateTime import
182
+ if (!PyDateTimeAPI) {
183
+ PyDateTime_IMPORT;
184
+ }
185
+
186
+ // Get out microseconds, and make sure they are positive, to avoid bug in eastern
187
+ // hemisphere time zones (cfr. https://github.com/pybind/pybind11/issues/2417)
188
+ using us_t = duration<int, std::micro>;
189
+ auto us = duration_cast<us_t>(src.time_since_epoch() % seconds(1));
190
+ if (us.count() < 0) {
191
+ us += duration_cast<us_t>(seconds(1));
192
+ }
193
+
194
+ // Subtract microseconds BEFORE `system_clock::to_time_t`, because:
195
+ // > If std::time_t has lower precision, it is implementation-defined whether the value is
196
+ // rounded or truncated. (https://en.cppreference.com/w/cpp/chrono/system_clock/to_time_t)
197
+ std::time_t tt
198
+ = system_clock::to_time_t(time_point_cast<system_clock::duration>(src - us));
199
+
200
+ std::tm localtime;
201
+ std::tm *localtime_ptr = localtime_thread_safe(&tt, &localtime);
202
+ if (!localtime_ptr) {
203
+ throw cast_error("Unable to represent system_clock in local time");
204
+ }
205
+ return PyDateTime_FromDateAndTime(localtime.tm_year + 1900,
206
+ localtime.tm_mon + 1,
207
+ localtime.tm_mday,
208
+ localtime.tm_hour,
209
+ localtime.tm_min,
210
+ localtime.tm_sec,
211
+ us.count());
212
+ }
213
+ PYBIND11_TYPE_CASTER(type, const_name("datetime.datetime"));
214
+ };
215
+
216
+ // Other clocks that are not the system clock are not measured as datetime.datetime objects
217
+ // since they are not measured on calendar time. So instead we just make them timedeltas
218
+ // Or if they have passed us a time as a float we convert that
219
+ template <typename Clock, typename Duration>
220
+ class type_caster<std::chrono::time_point<Clock, Duration>>
221
+ : public duration_caster<std::chrono::time_point<Clock, Duration>> {};
222
+
223
+ template <typename Rep, typename Period>
224
+ class type_caster<std::chrono::duration<Rep, Period>>
225
+ : public duration_caster<std::chrono::duration<Rep, Period>> {};
226
+
227
+ PYBIND11_NAMESPACE_END(detail)
228
+ PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
@@ -0,0 +1,2 @@
1
+ #include "detail/common.h"
2
+ #warning "Including 'common.h' is deprecated. It will be removed in v3.0. Use 'pybind11.h'."
@@ -0,0 +1,74 @@
1
+ /*
2
+ pybind11/complex.h: Complex number support
3
+
4
+ Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
5
+
6
+ All rights reserved. Use of this source code is governed by a
7
+ BSD-style license that can be found in the LICENSE file.
8
+ */
9
+
10
+ #pragma once
11
+
12
+ #include "pybind11.h"
13
+
14
+ #include <complex>
15
+
16
+ /// glibc defines I as a macro which breaks things, e.g., boost template names
17
+ #ifdef I
18
+ # undef I
19
+ #endif
20
+
21
+ PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
22
+
23
+ template <typename T>
24
+ struct format_descriptor<std::complex<T>, detail::enable_if_t<std::is_floating_point<T>::value>> {
25
+ static constexpr const char c = format_descriptor<T>::c;
26
+ static constexpr const char value[3] = {'Z', c, '\0'};
27
+ static std::string format() { return std::string(value); }
28
+ };
29
+
30
+ #ifndef PYBIND11_CPP17
31
+
32
+ template <typename T>
33
+ constexpr const char
34
+ format_descriptor<std::complex<T>,
35
+ detail::enable_if_t<std::is_floating_point<T>::value>>::value[3];
36
+
37
+ #endif
38
+
39
+ PYBIND11_NAMESPACE_BEGIN(detail)
40
+
41
+ template <typename T>
42
+ struct is_fmt_numeric<std::complex<T>, detail::enable_if_t<std::is_floating_point<T>::value>> {
43
+ static constexpr bool value = true;
44
+ static constexpr int index = is_fmt_numeric<T>::index + 3;
45
+ };
46
+
47
+ template <typename T>
48
+ class type_caster<std::complex<T>> {
49
+ public:
50
+ bool load(handle src, bool convert) {
51
+ if (!src) {
52
+ return false;
53
+ }
54
+ if (!convert && !PyComplex_Check(src.ptr())) {
55
+ return false;
56
+ }
57
+ Py_complex result = PyComplex_AsCComplex(src.ptr());
58
+ if (result.real == -1.0 && PyErr_Occurred()) {
59
+ PyErr_Clear();
60
+ return false;
61
+ }
62
+ value = std::complex<T>((T) result.real, (T) result.imag);
63
+ return true;
64
+ }
65
+
66
+ static handle
67
+ cast(const std::complex<T> &src, return_value_policy /* policy */, handle /* parent */) {
68
+ return PyComplex_FromDoubles((double) src.real(), (double) src.imag());
69
+ }
70
+
71
+ PYBIND11_TYPE_CASTER(std::complex<T>, const_name("complex"));
72
+ };
73
+ PYBIND11_NAMESPACE_END(detail)
74
+ PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
@@ -0,0 +1,15 @@
1
+ NOTE
2
+ ----
3
+
4
+ The C++ code here
5
+
6
+ ** only depends on <Python.h> **
7
+
8
+ and nothing else.
9
+
10
+ DO NOT ADD CODE WITH OTHER EXTERNAL DEPENDENCIES TO THIS DIRECTORY.
11
+
12
+ Read on:
13
+
14
+ pybind11_conduit_v1.h — Type-safe interoperability between different
15
+ independent Python/C++ bindings systems.
@@ -0,0 +1,116 @@
1
+ // Copyright (c) 2024 The pybind Community.
2
+
3
+ /* The pybind11_conduit_v1 feature enables type-safe interoperability between
4
+
5
+ * different independent Python/C++ bindings systems,
6
+
7
+ * including pybind11 versions with different PYBIND11_INTERNALS_VERSION's.
8
+
9
+ * NOTE: The conduit feature
10
+ only covers from-Python-to-C++ conversions, it
11
+ does not cover from-C++-to-Python conversions.
12
+ (For the latter, a different feature would have to be added.)
13
+
14
+ The naming of the feature is a bit misleading:
15
+
16
+ * The feature is in no way tied to pybind11 internals.
17
+
18
+ * It just happens to originate from pybind11 and currently still lives there.
19
+
20
+ * The only external dependency is <Python.h>.
21
+
22
+ The implementation is a VERY light-weight dependency. It is designed to be
23
+ compatible with any ISO C++11 (or higher) compiler, and does NOT require
24
+ C++ Exception Handling to be enabled.
25
+
26
+ Please see https://github.com/pybind/pybind11/pull/5296 for more background.
27
+
28
+ The implementation involves a
29
+
30
+ def _pybind11_conduit_v1_(
31
+ self,
32
+ pybind11_platform_abi_id: bytes,
33
+ cpp_type_info_capsule: capsule,
34
+ pointer_kind: bytes) -> capsule
35
+
36
+ method that is meant to be added to Python objects wrapping C++ objects
37
+ (e.g. pybind11::class_-wrapped types).
38
+
39
+ The design of the _pybind11_conduit_v1_ feature provides two layers of
40
+ protection against C++ ABI mismatches:
41
+
42
+ * The first and most important layer is that the pybind11_platform_abi_id's
43
+ must match between extensions. — This will never be perfect, but is the same
44
+ pragmatic approach used in pybind11 since 2017
45
+ (https://github.com/pybind/pybind11/commit/96997a4b9d4ec3d389a570604394af5d5eee2557,
46
+ PYBIND11_INTERNALS_ID).
47
+
48
+ * The second layer is that the typeid(std::type_info).name()'s must match
49
+ between extensions.
50
+
51
+ The implementation below (which is shorter than this comment!), serves as a
52
+ battle-tested specification. The main API is this one function:
53
+
54
+ auto *cpp_pointer = pybind11_conduit_v1::get_type_pointer_ephemeral<YourType>(py_obj);
55
+
56
+ It is meant to be a minimalistic reference implementation, intentionally
57
+ without comprehensive error reporting. It is expected that major bindings
58
+ systems will roll their own, compatible implementations, potentially with
59
+ system-specific error reporting. The essential specifications all bindings
60
+ systems need to agree on are merely:
61
+
62
+ * PYBIND11_PLATFORM_ABI_ID (const char* literal).
63
+
64
+ * The cpp_type_info capsule (see below: a void *ptr and a const char *name).
65
+
66
+ * The cpp_conduit capsule (see below: a void *ptr and a const char *name).
67
+
68
+ * "raw_pointer_ephemeral" means: the lifetime of the pointer is the lifetime
69
+ of the py_obj.
70
+
71
+ */
72
+
73
+ // THIS MUST STAY AT THE TOP!
74
+ #include "pybind11_platform_abi_id.h"
75
+
76
+ #include <Python.h>
77
+ #include <typeinfo>
78
+
79
+ namespace pybind11_conduit_v1 {
80
+
81
+ inline void *get_raw_pointer_ephemeral(PyObject *py_obj, const std::type_info *cpp_type_info) {
82
+ PyObject *cpp_type_info_capsule
83
+ = PyCapsule_New(const_cast<void *>(static_cast<const void *>(cpp_type_info)),
84
+ typeid(std::type_info).name(),
85
+ nullptr);
86
+ if (cpp_type_info_capsule == nullptr) {
87
+ return nullptr;
88
+ }
89
+ PyObject *cpp_conduit = PyObject_CallMethod(py_obj,
90
+ "_pybind11_conduit_v1_",
91
+ "yOy",
92
+ PYBIND11_PLATFORM_ABI_ID,
93
+ cpp_type_info_capsule,
94
+ "raw_pointer_ephemeral");
95
+ Py_DECREF(cpp_type_info_capsule);
96
+ if (cpp_conduit == nullptr) {
97
+ return nullptr;
98
+ }
99
+ void *raw_ptr = PyCapsule_GetPointer(cpp_conduit, cpp_type_info->name());
100
+ Py_DECREF(cpp_conduit);
101
+ if (PyErr_Occurred()) {
102
+ return nullptr;
103
+ }
104
+ return raw_ptr;
105
+ }
106
+
107
+ template <typename T>
108
+ T *get_type_pointer_ephemeral(PyObject *py_obj) {
109
+ void *raw_ptr = get_raw_pointer_ephemeral(py_obj, &typeid(T));
110
+ if (raw_ptr == nullptr) {
111
+ return nullptr;
112
+ }
113
+ return static_cast<T *>(raw_ptr);
114
+ }
115
+
116
+ } // namespace pybind11_conduit_v1
@@ -0,0 +1,87 @@
1
+ #pragma once
2
+
3
+ // Copyright (c) 2024 The pybind Community.
4
+
5
+ // To maximize reusability:
6
+ // DO NOT ADD CODE THAT REQUIRES C++ EXCEPTION HANDLING.
7
+
8
+ #include "wrap_include_python_h.h"
9
+
10
+ // Implementation details. DO NOT USE ELSEWHERE. (Unfortunately we cannot #undef them.)
11
+ // This is duplicated here to maximize portability.
12
+ #define PYBIND11_PLATFORM_ABI_ID_STRINGIFY(x) #x
13
+ #define PYBIND11_PLATFORM_ABI_ID_TOSTRING(x) PYBIND11_PLATFORM_ABI_ID_STRINGIFY(x)
14
+
15
+ #ifdef PYBIND11_COMPILER_TYPE
16
+ // // To maintain backward compatibility (see PR #5439).
17
+ # define PYBIND11_COMPILER_TYPE_LEADING_UNDERSCORE ""
18
+ #else
19
+ # define PYBIND11_COMPILER_TYPE_LEADING_UNDERSCORE "_"
20
+ # if defined(__MINGW32__)
21
+ # define PYBIND11_COMPILER_TYPE "mingw"
22
+ # elif defined(__CYGWIN__)
23
+ # define PYBIND11_COMPILER_TYPE "gcc_cygwin"
24
+ # elif defined(_MSC_VER)
25
+ # define PYBIND11_COMPILER_TYPE "msvc"
26
+ # elif defined(__clang__) || defined(__GNUC__)
27
+ # define PYBIND11_COMPILER_TYPE "system" // Assumed compatible with system compiler.
28
+ # else
29
+ # error "Unknown PYBIND11_COMPILER_TYPE: PLEASE REVISE THIS CODE."
30
+ # endif
31
+ #endif
32
+
33
+ // PR #5439 made this macro obsolete. However, there are many manipulations of this macro in the
34
+ // wild. Therefore, to maintain backward compatibility, it is kept around.
35
+ #ifndef PYBIND11_STDLIB
36
+ # define PYBIND11_STDLIB ""
37
+ #endif
38
+
39
+ #ifndef PYBIND11_BUILD_ABI
40
+ # if defined(_MSC_VER) // See PR #4953.
41
+ # if defined(_MT) && defined(_DLL) // Corresponding to CL command line options /MD or /MDd.
42
+ # if (_MSC_VER) / 100 == 19
43
+ # define PYBIND11_BUILD_ABI "_md_mscver19"
44
+ # else
45
+ # error "Unknown major version for MSC_VER: PLEASE REVISE THIS CODE."
46
+ # endif
47
+ # elif defined(_MT) // Corresponding to CL command line options /MT or /MTd.
48
+ # define PYBIND11_BUILD_ABI "_mt_mscver" PYBIND11_PLATFORM_ABI_ID_TOSTRING(_MSC_VER)
49
+ # else
50
+ # if (_MSC_VER) / 100 == 19
51
+ # define PYBIND11_BUILD_ABI "_none_mscver19"
52
+ # else
53
+ # error "Unknown major version for MSC_VER: PLEASE REVISE THIS CODE."
54
+ # endif
55
+ # endif
56
+ # elif defined(_LIBCPP_ABI_VERSION) // https://libcxx.llvm.org/DesignDocs/ABIVersioning.html
57
+ # define PYBIND11_BUILD_ABI \
58
+ "_libcpp_abi" PYBIND11_PLATFORM_ABI_ID_TOSTRING(_LIBCPP_ABI_VERSION)
59
+ # elif defined(_GLIBCXX_USE_CXX11_ABI) // See PR #5439.
60
+ # if defined(__NVCOMPILER)
61
+ // // Assume that NVHPC is in the 1xxx ABI family.
62
+ // // THIS ASSUMPTION IS NOT FUTURE PROOF but apparently the best we can do.
63
+ // // Please let us know if there is a way to validate the assumption here.
64
+ # elif !defined(__GXX_ABI_VERSION)
65
+ # error \
66
+ "Unknown platform or compiler (_GLIBCXX_USE_CXX11_ABI): PLEASE REVISE THIS CODE."
67
+ # endif
68
+ # if defined(__GXX_ABI_VERSION) && __GXX_ABI_VERSION < 1002 || __GXX_ABI_VERSION >= 2000
69
+ # error "Unknown platform or compiler (__GXX_ABI_VERSION): PLEASE REVISE THIS CODE."
70
+ # endif
71
+ # define PYBIND11_BUILD_ABI \
72
+ "_libstdcpp_gxx_abi_1xxx_use_cxx11_abi_" PYBIND11_PLATFORM_ABI_ID_TOSTRING( \
73
+ _GLIBCXX_USE_CXX11_ABI)
74
+ # else
75
+ # error "Unknown platform or compiler: PLEASE REVISE THIS CODE."
76
+ # endif
77
+ #endif
78
+
79
+ // On MSVC, debug and release builds are not ABI-compatible!
80
+ #if defined(_MSC_VER) && defined(_DEBUG)
81
+ # define PYBIND11_BUILD_TYPE "_debug"
82
+ #else
83
+ # define PYBIND11_BUILD_TYPE ""
84
+ #endif
85
+
86
+ #define PYBIND11_PLATFORM_ABI_ID \
87
+ PYBIND11_COMPILER_TYPE PYBIND11_STDLIB PYBIND11_BUILD_ABI PYBIND11_BUILD_TYPE
@@ -0,0 +1,72 @@
1
+ #pragma once
2
+
3
+ // Copyright (c) 2024 The pybind Community.
4
+
5
+ // STRONG REQUIREMENT:
6
+ // This header is a wrapper around `#include <Python.h>`, therefore it
7
+ // MUST BE INCLUDED BEFORE ANY STANDARD HEADERS are included.
8
+ // See also:
9
+ // https://docs.python.org/3/c-api/intro.html#include-files
10
+ // Quoting from there:
11
+ // Note: Since Python may define some pre-processor definitions which affect
12
+ // the standard headers on some systems, you must include Python.h before
13
+ // any standard headers are included.
14
+
15
+ // To maximize reusability:
16
+ // DO NOT ADD CODE THAT REQUIRES C++ EXCEPTION HANDLING.
17
+
18
+ // Disable linking to pythonX_d.lib on Windows in debug mode.
19
+ #if defined(_MSC_VER) && defined(_DEBUG) && !defined(Py_DEBUG)
20
+ // Workaround for a VS 2022 issue.
21
+ // See https://github.com/pybind/pybind11/pull/3497 for full context.
22
+ // NOTE: This workaround knowingly violates the Python.h include order
23
+ // requirement (see above).
24
+ # include <yvals.h>
25
+ # if _MSVC_STL_VERSION >= 143
26
+ # include <crtdefs.h>
27
+ # endif
28
+ # define PYBIND11_DEBUG_MARKER
29
+ # undef _DEBUG
30
+ #endif
31
+
32
+ // Don't let Python.h #define (v)snprintf as macro because they are implemented
33
+ // properly in Visual Studio since 2015.
34
+ #if defined(_MSC_VER)
35
+ # define HAVE_SNPRINTF 1
36
+ #endif
37
+
38
+ #if defined(_MSC_VER)
39
+ # pragma warning(push)
40
+ # pragma warning(disable : 4505)
41
+ // C4505: 'PySlice_GetIndicesEx': unreferenced local function has been removed
42
+ #endif
43
+
44
+ #include <Python.h>
45
+ #include <frameobject.h>
46
+ #include <pythread.h>
47
+
48
+ #if defined(_MSC_VER)
49
+ # pragma warning(pop)
50
+ #endif
51
+
52
+ #if defined(PYBIND11_DEBUG_MARKER)
53
+ # define _DEBUG 1
54
+ # undef PYBIND11_DEBUG_MARKER
55
+ #endif
56
+
57
+ // Python #defines overrides on all sorts of core functions, which
58
+ // tends to wreak havok in C++ codebases that expect these to work
59
+ // like regular functions (potentially with several overloads).
60
+ #if defined(isalnum)
61
+ # undef isalnum
62
+ # undef isalpha
63
+ # undef islower
64
+ # undef isspace
65
+ # undef isupper
66
+ # undef tolower
67
+ # undef toupper
68
+ #endif
69
+
70
+ #if defined(copysign)
71
+ # undef copysign
72
+ #endif
@@ -0,0 +1,56 @@
1
+ // Copyright (c) 2016-2025 The Pybind Development Team.
2
+ // All rights reserved. Use of this source code is governed by a
3
+ // BSD-style license that can be found in the LICENSE file.
4
+
5
+ #pragma once
6
+
7
+ #include "pytypes.h"
8
+
9
+ PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
10
+
11
+ /// This does not do anything if there's a GIL. On free-threaded Python,
12
+ /// it locks an object. This uses the CPython API, which has limits
13
+ class scoped_critical_section {
14
+ public:
15
+ #ifdef Py_GIL_DISABLED
16
+ explicit scoped_critical_section(handle obj1, handle obj2 = handle{}) {
17
+ if (obj1) {
18
+ if (obj2) {
19
+ PyCriticalSection2_Begin(&section2, obj1.ptr(), obj2.ptr());
20
+ rank = 2;
21
+ } else {
22
+ PyCriticalSection_Begin(&section, obj1.ptr());
23
+ rank = 1;
24
+ }
25
+ } else if (obj2) {
26
+ PyCriticalSection_Begin(&section, obj2.ptr());
27
+ rank = 1;
28
+ }
29
+ }
30
+
31
+ ~scoped_critical_section() {
32
+ if (rank == 1) {
33
+ PyCriticalSection_End(&section);
34
+ } else if (rank == 2) {
35
+ PyCriticalSection2_End(&section2);
36
+ }
37
+ }
38
+ #else
39
+ explicit scoped_critical_section(handle, handle = handle{}) {};
40
+ ~scoped_critical_section() = default;
41
+ #endif
42
+
43
+ scoped_critical_section(const scoped_critical_section &) = delete;
44
+ scoped_critical_section &operator=(const scoped_critical_section &) = delete;
45
+
46
+ private:
47
+ #ifdef Py_GIL_DISABLED
48
+ int rank{0};
49
+ union {
50
+ PyCriticalSection section;
51
+ PyCriticalSection2 section2;
52
+ };
53
+ #endif
54
+ };
55
+
56
+ PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)