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.
- netgen/NgOCC.py +7 -0
- netgen/__init__.py +114 -0
- netgen/__init__.pyi +22 -0
- netgen/__main__.py +53 -0
- netgen/cmake/NetgenConfig.cmake +79 -0
- netgen/cmake/netgen-targets-release.cmake +69 -0
- netgen/cmake/netgen-targets.cmake +146 -0
- netgen/config/__init__.py +1 -0
- netgen/config/__init__.pyi +52 -0
- netgen/config/__main__.py +4 -0
- netgen/config/config.py +68 -0
- netgen/config/config.pyi +54 -0
- netgen/csg.py +25 -0
- netgen/geom2d.py +178 -0
- netgen/gui.py +82 -0
- netgen/include/core/archive.hpp +1256 -0
- netgen/include/core/array.hpp +1760 -0
- netgen/include/core/autodiff.hpp +1131 -0
- netgen/include/core/autodiffdiff.hpp +733 -0
- netgen/include/core/bitarray.hpp +240 -0
- netgen/include/core/concurrentqueue.h +3619 -0
- netgen/include/core/exception.hpp +145 -0
- netgen/include/core/flags.hpp +199 -0
- netgen/include/core/hashtable.hpp +1281 -0
- netgen/include/core/localheap.hpp +318 -0
- netgen/include/core/logging.hpp +117 -0
- netgen/include/core/memtracer.hpp +221 -0
- netgen/include/core/mpi4py_pycapi.h +245 -0
- netgen/include/core/mpi_wrapper.hpp +643 -0
- netgen/include/core/ng_mpi.hpp +94 -0
- netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
- netgen/include/core/ng_mpi_native.hpp +25 -0
- netgen/include/core/ngcore.hpp +32 -0
- netgen/include/core/ngcore_api.hpp +152 -0
- netgen/include/core/ngstream.hpp +115 -0
- netgen/include/core/paje_trace.hpp +279 -0
- netgen/include/core/profiler.hpp +382 -0
- netgen/include/core/python_ngcore.hpp +457 -0
- netgen/include/core/ranges.hpp +109 -0
- netgen/include/core/register_archive.hpp +100 -0
- netgen/include/core/signal.hpp +82 -0
- netgen/include/core/simd.hpp +160 -0
- netgen/include/core/simd_arm64.hpp +407 -0
- netgen/include/core/simd_avx.hpp +394 -0
- netgen/include/core/simd_avx512.hpp +285 -0
- netgen/include/core/simd_generic.hpp +1053 -0
- netgen/include/core/simd_math.hpp +178 -0
- netgen/include/core/simd_sse.hpp +289 -0
- netgen/include/core/statushandler.hpp +37 -0
- netgen/include/core/symboltable.hpp +153 -0
- netgen/include/core/table.hpp +810 -0
- netgen/include/core/taskmanager.hpp +1161 -0
- netgen/include/core/type_traits.hpp +65 -0
- netgen/include/core/utils.hpp +385 -0
- netgen/include/core/version.hpp +102 -0
- netgen/include/core/xbool.hpp +47 -0
- netgen/include/csg/algprim.hpp +563 -0
- netgen/include/csg/brick.hpp +150 -0
- netgen/include/csg/csg.hpp +43 -0
- netgen/include/csg/csgeom.hpp +389 -0
- netgen/include/csg/csgparser.hpp +101 -0
- netgen/include/csg/curve2d.hpp +67 -0
- netgen/include/csg/edgeflw.hpp +112 -0
- netgen/include/csg/explicitcurve2d.hpp +113 -0
- netgen/include/csg/extrusion.hpp +185 -0
- netgen/include/csg/gencyl.hpp +70 -0
- netgen/include/csg/geoml.hpp +16 -0
- netgen/include/csg/identify.hpp +213 -0
- netgen/include/csg/manifold.hpp +29 -0
- netgen/include/csg/meshsurf.hpp +46 -0
- netgen/include/csg/polyhedra.hpp +121 -0
- netgen/include/csg/revolution.hpp +180 -0
- netgen/include/csg/singularref.hpp +84 -0
- netgen/include/csg/solid.hpp +295 -0
- netgen/include/csg/specpoin.hpp +194 -0
- netgen/include/csg/spline3d.hpp +99 -0
- netgen/include/csg/splinesurface.hpp +85 -0
- netgen/include/csg/surface.hpp +394 -0
- netgen/include/csg/triapprox.hpp +63 -0
- netgen/include/csg/vscsg.hpp +34 -0
- netgen/include/general/autodiff.hpp +356 -0
- netgen/include/general/autoptr.hpp +39 -0
- netgen/include/general/gzstream.h +121 -0
- netgen/include/general/hashtabl.hpp +1692 -0
- netgen/include/general/myadt.hpp +48 -0
- netgen/include/general/mystring.hpp +226 -0
- netgen/include/general/netgenout.hpp +205 -0
- netgen/include/general/ngarray.hpp +797 -0
- netgen/include/general/ngbitarray.hpp +149 -0
- netgen/include/general/ngpython.hpp +74 -0
- netgen/include/general/optmem.hpp +44 -0
- netgen/include/general/parthreads.hpp +138 -0
- netgen/include/general/seti.hpp +50 -0
- netgen/include/general/sort.hpp +47 -0
- netgen/include/general/spbita2d.hpp +59 -0
- netgen/include/general/stack.hpp +114 -0
- netgen/include/general/table.hpp +280 -0
- netgen/include/general/template.hpp +509 -0
- netgen/include/geom2d/csg2d.hpp +750 -0
- netgen/include/geom2d/geometry2d.hpp +280 -0
- netgen/include/geom2d/spline2d.hpp +234 -0
- netgen/include/geom2d/vsgeom2d.hpp +28 -0
- netgen/include/gprim/adtree.hpp +1392 -0
- netgen/include/gprim/geom2d.hpp +858 -0
- netgen/include/gprim/geom3d.hpp +749 -0
- netgen/include/gprim/geomfuncs.hpp +212 -0
- netgen/include/gprim/geomobjects.hpp +544 -0
- netgen/include/gprim/geomops.hpp +404 -0
- netgen/include/gprim/geomtest3d.hpp +101 -0
- netgen/include/gprim/gprim.hpp +33 -0
- netgen/include/gprim/spline.hpp +778 -0
- netgen/include/gprim/splinegeometry.hpp +73 -0
- netgen/include/gprim/transform3d.hpp +216 -0
- netgen/include/include/acisgeom.hpp +3 -0
- netgen/include/include/csg.hpp +1 -0
- netgen/include/include/geometry2d.hpp +1 -0
- netgen/include/include/gprim.hpp +1 -0
- netgen/include/include/incopengl.hpp +62 -0
- netgen/include/include/inctcl.hpp +13 -0
- netgen/include/include/incvis.hpp +6 -0
- netgen/include/include/linalg.hpp +1 -0
- netgen/include/include/meshing.hpp +1 -0
- netgen/include/include/myadt.hpp +1 -0
- netgen/include/include/mydefs.hpp +70 -0
- netgen/include/include/mystdlib.h +59 -0
- netgen/include/include/netgen_config.hpp +27 -0
- netgen/include/include/netgen_version.hpp +9 -0
- netgen/include/include/nginterface_v2_impl.hpp +395 -0
- netgen/include/include/ngsimd.hpp +1 -0
- netgen/include/include/occgeom.hpp +1 -0
- netgen/include/include/opti.hpp +1 -0
- netgen/include/include/parallel.hpp +1 -0
- netgen/include/include/stlgeom.hpp +1 -0
- netgen/include/include/visual.hpp +1 -0
- netgen/include/interface/rw_medit.hpp +11 -0
- netgen/include/interface/writeuser.hpp +80 -0
- netgen/include/linalg/densemat.hpp +414 -0
- netgen/include/linalg/linalg.hpp +29 -0
- netgen/include/linalg/opti.hpp +142 -0
- netgen/include/linalg/polynomial.hpp +47 -0
- netgen/include/linalg/vector.hpp +217 -0
- netgen/include/meshing/adfront2.hpp +274 -0
- netgen/include/meshing/adfront3.hpp +332 -0
- netgen/include/meshing/basegeom.hpp +370 -0
- netgen/include/meshing/bcfunctions.hpp +53 -0
- netgen/include/meshing/bisect.hpp +72 -0
- netgen/include/meshing/boundarylayer.hpp +113 -0
- netgen/include/meshing/classifyhpel.hpp +1984 -0
- netgen/include/meshing/clusters.hpp +46 -0
- netgen/include/meshing/curvedelems.hpp +274 -0
- netgen/include/meshing/delaunay2d.hpp +73 -0
- netgen/include/meshing/fieldlines.hpp +103 -0
- netgen/include/meshing/findip.hpp +198 -0
- netgen/include/meshing/findip2.hpp +103 -0
- netgen/include/meshing/geomsearch.hpp +69 -0
- netgen/include/meshing/global.hpp +54 -0
- netgen/include/meshing/hpref_hex.hpp +330 -0
- netgen/include/meshing/hpref_prism.hpp +3405 -0
- netgen/include/meshing/hpref_pyramid.hpp +154 -0
- netgen/include/meshing/hpref_quad.hpp +2082 -0
- netgen/include/meshing/hpref_segm.hpp +122 -0
- netgen/include/meshing/hpref_tet.hpp +4230 -0
- netgen/include/meshing/hpref_trig.hpp +848 -0
- netgen/include/meshing/hprefinement.hpp +366 -0
- netgen/include/meshing/improve2.hpp +178 -0
- netgen/include/meshing/improve3.hpp +151 -0
- netgen/include/meshing/localh.hpp +223 -0
- netgen/include/meshing/meshclass.hpp +1076 -0
- netgen/include/meshing/meshfunc.hpp +47 -0
- netgen/include/meshing/meshing.hpp +63 -0
- netgen/include/meshing/meshing2.hpp +163 -0
- netgen/include/meshing/meshing3.hpp +123 -0
- netgen/include/meshing/meshtool.hpp +90 -0
- netgen/include/meshing/meshtype.hpp +1930 -0
- netgen/include/meshing/msghandler.hpp +62 -0
- netgen/include/meshing/paralleltop.hpp +172 -0
- netgen/include/meshing/python_mesh.hpp +206 -0
- netgen/include/meshing/ruler2.hpp +172 -0
- netgen/include/meshing/ruler3.hpp +211 -0
- netgen/include/meshing/soldata.hpp +141 -0
- netgen/include/meshing/specials.hpp +17 -0
- netgen/include/meshing/surfacegeom.hpp +73 -0
- netgen/include/meshing/topology.hpp +1003 -0
- netgen/include/meshing/validate.hpp +21 -0
- netgen/include/meshing/visual_interface.hpp +71 -0
- netgen/include/mydefs.hpp +70 -0
- netgen/include/nginterface.h +474 -0
- netgen/include/nginterface_v2.hpp +406 -0
- netgen/include/nglib.h +697 -0
- netgen/include/nglib_occ.h +50 -0
- netgen/include/occ/occ_edge.hpp +47 -0
- netgen/include/occ/occ_face.hpp +52 -0
- netgen/include/occ/occ_solid.hpp +23 -0
- netgen/include/occ/occ_utils.hpp +376 -0
- netgen/include/occ/occ_vertex.hpp +30 -0
- netgen/include/occ/occgeom.hpp +659 -0
- netgen/include/occ/occmeshsurf.hpp +168 -0
- netgen/include/occ/vsocc.hpp +33 -0
- netgen/include/pybind11/LICENSE +29 -0
- netgen/include/pybind11/attr.h +722 -0
- netgen/include/pybind11/buffer_info.h +208 -0
- netgen/include/pybind11/cast.h +2361 -0
- netgen/include/pybind11/chrono.h +228 -0
- netgen/include/pybind11/common.h +2 -0
- netgen/include/pybind11/complex.h +74 -0
- netgen/include/pybind11/conduit/README.txt +15 -0
- netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
- netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
- netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
- netgen/include/pybind11/critical_section.h +56 -0
- netgen/include/pybind11/detail/class.h +823 -0
- netgen/include/pybind11/detail/common.h +1348 -0
- netgen/include/pybind11/detail/cpp_conduit.h +75 -0
- netgen/include/pybind11/detail/descr.h +226 -0
- netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
- netgen/include/pybind11/detail/exception_translation.h +71 -0
- netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
- netgen/include/pybind11/detail/init.h +538 -0
- netgen/include/pybind11/detail/internals.h +799 -0
- netgen/include/pybind11/detail/native_enum_data.h +209 -0
- netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
- netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
- netgen/include/pybind11/detail/type_caster_base.h +1591 -0
- netgen/include/pybind11/detail/typeid.h +65 -0
- netgen/include/pybind11/detail/using_smart_holder.h +22 -0
- netgen/include/pybind11/detail/value_and_holder.h +90 -0
- netgen/include/pybind11/eigen/common.h +9 -0
- netgen/include/pybind11/eigen/matrix.h +723 -0
- netgen/include/pybind11/eigen/tensor.h +521 -0
- netgen/include/pybind11/eigen.h +12 -0
- netgen/include/pybind11/embed.h +320 -0
- netgen/include/pybind11/eval.h +161 -0
- netgen/include/pybind11/functional.h +147 -0
- netgen/include/pybind11/gil.h +199 -0
- netgen/include/pybind11/gil_safe_call_once.h +102 -0
- netgen/include/pybind11/gil_simple.h +37 -0
- netgen/include/pybind11/iostream.h +265 -0
- netgen/include/pybind11/native_enum.h +67 -0
- netgen/include/pybind11/numpy.h +2312 -0
- netgen/include/pybind11/operators.h +202 -0
- netgen/include/pybind11/options.h +92 -0
- netgen/include/pybind11/pybind11.h +3645 -0
- netgen/include/pybind11/pytypes.h +2680 -0
- netgen/include/pybind11/stl/filesystem.h +114 -0
- netgen/include/pybind11/stl.h +666 -0
- netgen/include/pybind11/stl_bind.h +858 -0
- netgen/include/pybind11/subinterpreter.h +299 -0
- netgen/include/pybind11/trampoline_self_life_support.h +65 -0
- netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
- netgen/include/pybind11/typing.h +298 -0
- netgen/include/pybind11/warnings.h +75 -0
- netgen/include/stlgeom/meshstlsurface.hpp +67 -0
- netgen/include/stlgeom/stlgeom.hpp +491 -0
- netgen/include/stlgeom/stlline.hpp +193 -0
- netgen/include/stlgeom/stltool.hpp +331 -0
- netgen/include/stlgeom/stltopology.hpp +419 -0
- netgen/include/stlgeom/vsstl.hpp +58 -0
- netgen/include/visualization/meshdoc.hpp +42 -0
- netgen/include/visualization/mvdraw.hpp +325 -0
- netgen/include/visualization/vispar.hpp +128 -0
- netgen/include/visualization/visual.hpp +28 -0
- netgen/include/visualization/visual_api.hpp +10 -0
- netgen/include/visualization/vssolution.hpp +399 -0
- netgen/lib/libnggui.lib +0 -0
- netgen/lib/ngcore.lib +0 -0
- netgen/lib/nglib.lib +0 -0
- netgen/lib/togl.lib +0 -0
- netgen/libnggui.dll +0 -0
- netgen/libngguipy.lib +0 -0
- netgen/libngguipy.pyd +0 -0
- netgen/libngpy/_NgOCC.pyi +1545 -0
- netgen/libngpy/__init__.pyi +7 -0
- netgen/libngpy/_csg.pyi +259 -0
- netgen/libngpy/_geom2d.pyi +323 -0
- netgen/libngpy/_meshing.pyi +1111 -0
- netgen/libngpy/_stl.pyi +131 -0
- netgen/libngpy.lib +0 -0
- netgen/libngpy.pyd +0 -0
- netgen/meshing.py +65 -0
- netgen/ngcore.dll +0 -0
- netgen/nglib.dll +0 -0
- netgen/occ.py +52 -0
- netgen/read_gmsh.py +259 -0
- netgen/read_meshio.py +22 -0
- netgen/stl.py +2 -0
- netgen/togl.dll +0 -0
- netgen/version.py +2 -0
- netgen/webgui.py +529 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
- pyngcore/__init__.py +1 -0
- 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,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(§ion2, obj1.ptr(), obj2.ptr());
|
|
20
|
+
rank = 2;
|
|
21
|
+
} else {
|
|
22
|
+
PyCriticalSection_Begin(§ion, obj1.ptr());
|
|
23
|
+
rank = 1;
|
|
24
|
+
}
|
|
25
|
+
} else if (obj2) {
|
|
26
|
+
PyCriticalSection_Begin(§ion, obj2.ptr());
|
|
27
|
+
rank = 1;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
~scoped_critical_section() {
|
|
32
|
+
if (rank == 1) {
|
|
33
|
+
PyCriticalSection_End(§ion);
|
|
34
|
+
} else if (rank == 2) {
|
|
35
|
+
PyCriticalSection2_End(§ion2);
|
|
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)
|