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,797 @@
1
+ #ifndef NGARRAY_HPP_INCLUDED
2
+ #define NGARRAY_HPP_INCLUDED
3
+
4
+ /**************************************************************************/
5
+ /* File: ngarray.hpp */
6
+ /* Author: Joachim Schoeberl */
7
+ /* Date: 01. Jun. 95 */
8
+ /**************************************************************************/
9
+
10
+ #include <core/array.hpp>
11
+
12
+ namespace netgen
13
+ {
14
+ using namespace ngcore;
15
+
16
+ // template <class T, int B1, int B2> class IndirectArray;
17
+ template <class TA1, class TA2> class NgIndirectArray;
18
+
19
+
20
+
21
+
22
+ template <typename TSIZE>
23
+ class ArrayRangeIterator
24
+ {
25
+ TSIZE ind;
26
+ public:
27
+ ArrayRangeIterator (TSIZE ai) : ind(ai) { ; }
28
+ ArrayRangeIterator operator++ (int) { return ind++; }
29
+ ArrayRangeIterator operator++ () { return ++ind; }
30
+ TSIZE operator*() const { return ind; }
31
+ bool operator != (ArrayRangeIterator d2) { return ind != d2.ind; }
32
+ };
33
+
34
+ /// a range of integers
35
+ template <typename T>
36
+ class T_Range
37
+ {
38
+ T first, next;
39
+ public:
40
+ T_Range (T f, T n) : first(f), next(n) {;}
41
+ T Size() const { return next-first; }
42
+ T operator[] (T i) const { return first+i; }
43
+ bool Contains (T i) const { return ((i >= first) && (i < next)); }
44
+ T_Range Modify (int inc_begin, int inc_end) const
45
+ { return T_Range(first+inc_begin, next+inc_end); }
46
+ ArrayRangeIterator<T> begin() const { return first; }
47
+ ArrayRangeIterator<T> end() const { return next; }
48
+ };
49
+
50
+
51
+ template <typename T, int BASE = 0, typename TIND = int>
52
+ class NgFlatArray;
53
+
54
+ template <typename T, int BASE, typename TIND>
55
+ class ArrayIterator
56
+ {
57
+ NgFlatArray<T,BASE,TIND> ar;
58
+ TIND ind;
59
+ public:
60
+ ArrayIterator (NgFlatArray<T,BASE,TIND> aar, TIND ai) : ar(aar), ind(ai) { ; }
61
+ ArrayIterator operator++ (int) { return ArrayIterator(ar, ind++); }
62
+ ArrayIterator operator++ () { return ArrayIterator(ar, ++ind); }
63
+ T operator*() const { return ar[ind]; }
64
+ T & operator*() { return ar[ind]; }
65
+ bool operator != (ArrayIterator d2) { return ind != d2.ind; }
66
+ bool operator == (ArrayIterator d2) { return ind == d2.ind; }
67
+ };
68
+
69
+
70
+
71
+ /**
72
+ A simple array container.
73
+ NgArray represented by size and data-pointer.
74
+ No memory allocation and deallocation, must be provided by user.
75
+ Helper functions for printing.
76
+ Optional range check by macro RANGE_CHECK
77
+ */
78
+
79
+ template <typename T, int BASE, typename TIND>
80
+ class NgFlatArray
81
+ {
82
+ protected:
83
+ /// the size
84
+ size_t size;
85
+ /// the data
86
+ T * data;
87
+ public:
88
+ typedef T TELEM;
89
+ using index_type = TIND;
90
+
91
+ /// provide size and memory
92
+ NgFlatArray (size_t asize, T * adata)
93
+ : size(asize), data(adata) { ; }
94
+
95
+ /// the size
96
+ size_t Size() const { return size; }
97
+
98
+ ArrayIterator<T,BASE,TIND> begin() const
99
+ { return ArrayIterator<T,BASE,TIND> (*this, BASE); }
100
+ ArrayIterator<T,BASE,TIND> end() const
101
+ { return ArrayIterator<T,BASE,TIND> (*this, BASE+size); }
102
+
103
+ // TIND Begin() const { return TIND(BASE); }
104
+ // TIND End() const { return TIND(size+BASE); }
105
+ T_Range<TIND> Range() const { return T_Range<TIND>(BASE, size+BASE); }
106
+
107
+ [[deprecated("Use *Range().begin() instead")]]
108
+ auto Begin() const { return *Range().begin(); }
109
+ [[deprecated("Use *Range().end() instead")]]
110
+ auto End() const { return *Range().end(); }
111
+
112
+ /// Access array. BASE-based
113
+ T & operator[] (TIND i) const
114
+ {
115
+ NETGEN_CHECK_RANGE(i,BASE,size+BASE);
116
+ return data[i-BASE];
117
+ }
118
+
119
+ template <typename T2, int B2>
120
+ NgIndirectArray<NgFlatArray, NgFlatArray<T2,B2> > operator[] (const NgFlatArray<T2,B2> & ia) const
121
+ {
122
+ return NgIndirectArray<NgFlatArray, NgFlatArray<T2,B2> > (*this, ia);
123
+ }
124
+
125
+
126
+
127
+ /// Access array, one-based (old fashioned)
128
+ T & Elem (int i)
129
+ {
130
+ NETGEN_CHECK_RANGE(i,1,size+1);
131
+ return ((T*)data)[i-1];
132
+ }
133
+
134
+ /// Access array, one-based (old fashioned)
135
+ // [[deprecated("Use operator[] instead")]]
136
+ const T & Get (int i) const
137
+ {
138
+ NETGEN_CHECK_RANGE(i,1,size+1);
139
+ return ((const T*)data)[i-1];
140
+ }
141
+
142
+ /// Access array, one-based (old fashioned)
143
+ void Set (int i, const T & el)
144
+ {
145
+ NETGEN_CHECK_RANGE(i,1,size+1);
146
+ ((T*)data)[i-1] = el;
147
+ }
148
+
149
+ /// access first element
150
+ T & First () const
151
+ {
152
+ NETGEN_CHECK_RANGE(0,0,size);
153
+ return data[0];
154
+ }
155
+
156
+
157
+ /// access last element. check by macro CHECK_RANGE
158
+ T & Last () const
159
+ {
160
+ NETGEN_CHECK_RANGE(size-1,0,size);
161
+ return data[size-1];
162
+ }
163
+
164
+ /// Fill array with value val
165
+ NgFlatArray & operator= (const T & val)
166
+ {
167
+ for (int i = 0; i < size; i++)
168
+ data[i] = val;
169
+ return *this;
170
+ }
171
+
172
+ /// takes range starting from position start of end-start elements
173
+ const NgFlatArray<T> Range (TIND start, TIND end)
174
+ {
175
+ return NgFlatArray<T> (end-start, data+start);
176
+ }
177
+
178
+ /// first position of element elem, returns -1 if element not contained in array
179
+ TIND Pos(const T & elem) const
180
+ {
181
+ TIND pos = -1;
182
+ for(TIND i=0; pos==-1 && i < this->size; i++)
183
+ if(elem == data[i]) pos = i;
184
+ return pos;
185
+ }
186
+
187
+ /// does the array contain element elem ?
188
+ bool Contains(const T & elem) const
189
+ {
190
+ return ( Pos(elem) >= 0 );
191
+ }
192
+
193
+ operator ngcore::FlatArray<T> () const
194
+ {
195
+ static_assert (BASE==0);
196
+ return ngcore::FlatArray<T>(size, data);
197
+ }
198
+ };
199
+
200
+
201
+
202
+ // print array
203
+ template <typename T, int BASE, typename TIND>
204
+ inline ostream & operator<< (ostream & s, const NgFlatArray<T,BASE,TIND> & a)
205
+ {
206
+ // for (TIND i = a.Begin(); i < a.End(); i++)
207
+ for (auto i : a.Range())
208
+ s << i << ": " << a[i] << endl;
209
+ return s;
210
+ }
211
+
212
+
213
+ /**
214
+ Dynamic array container.
215
+
216
+ NgArray<T> is an automatically increasing array container.
217
+ The allocated memory doubles on overflow.
218
+ Either the container takes care of memory allocation and deallocation,
219
+ or the user provides one block of data.
220
+ */
221
+ template <class T, int BASE = 0, typename TIND = int>
222
+ class NgArray : public NgFlatArray<T, BASE, TIND>
223
+ {
224
+ protected:
225
+ using NgFlatArray<T,BASE,TIND>::size;
226
+ using NgFlatArray<T,BASE,TIND>::data;
227
+
228
+ /// physical size of array
229
+ size_t allocsize = 0;
230
+ /// memory is responsibility of container
231
+ bool ownmem;
232
+
233
+ public:
234
+
235
+ /// Generate array of logical and physical size asize
236
+ explicit NgArray()
237
+ : NgFlatArray<T, BASE, TIND> (0, NULL)
238
+ {
239
+ allocsize = 0;
240
+ ownmem = 1;
241
+ }
242
+
243
+ explicit NgArray(size_t asize)
244
+ : NgFlatArray<T, BASE, TIND> (asize, asize ? new T[asize] : nullptr)
245
+ {
246
+ allocsize = asize;
247
+ ownmem = (asize == 0) ? 0 : 1;
248
+ }
249
+
250
+ /// Generate array in user data
251
+ NgArray(TIND asize, T* adata)
252
+ : NgFlatArray<T, BASE, TIND> (asize, adata)
253
+ {
254
+ allocsize = asize;
255
+ ownmem = 0;
256
+ }
257
+
258
+ /// array copy
259
+ explicit NgArray (const NgArray<T,BASE,TIND> & a2)
260
+ : NgFlatArray<T, BASE, TIND> (a2.Size(), a2.Size() ? new T[a2.Size()] : 0)
261
+ {
262
+ allocsize = size;
263
+ ownmem = 1;
264
+ for (TIND i = BASE; i < size+BASE; i++)
265
+ (*this)[i] = a2[i];
266
+ }
267
+
268
+ /// array move
269
+ NgArray (NgArray && a2)
270
+ : NgFlatArray<T,BASE,TIND> (a2.size, a2.data), allocsize(a2.allocsize), ownmem(a2.ownmem)
271
+ {
272
+ a2.size = 0;
273
+ a2.data = nullptr;
274
+ a2.allocsize = 0;
275
+ a2.ownmem = false;
276
+ }
277
+
278
+
279
+ /// if responsible, deletes memory
280
+ ~NgArray()
281
+ {
282
+ if (ownmem)
283
+ delete [] data;
284
+ }
285
+
286
+ /// Change logical size. If necessary, do reallocation. Keeps contents.
287
+ void SetSize(size_t nsize)
288
+ {
289
+ if (nsize > allocsize)
290
+ ReSize (nsize);
291
+ size = nsize;
292
+ }
293
+
294
+ void SetSize0()
295
+ {
296
+ size = 0;
297
+ }
298
+
299
+ /// Change physical size. Keeps logical size. Keeps contents.
300
+ void SetAllocSize (size_t nallocsize)
301
+ {
302
+ if (nallocsize > allocsize)
303
+ ReSize (nallocsize);
304
+ }
305
+
306
+
307
+ /// Add element at end of array. reallocation if necessary.
308
+ void Append (const T & el)
309
+ {
310
+ if (size == allocsize)
311
+ ReSize (size+1);
312
+ data[size] = el;
313
+ size++;
314
+ // return size;
315
+ }
316
+
317
+ template <typename T2, int B2>
318
+ void Append (NgFlatArray<T2, B2> a2)
319
+ {
320
+ if (size+a2.Size() > allocsize)
321
+ ReSize (size+a2.Size());
322
+ for (int i = 0; i < a2.Size(); i++)
323
+ data[size+i] = a2[i+B2];
324
+ size += a2.Size();
325
+ }
326
+
327
+
328
+ /// Delete element i (0-based). Move last element to position i.
329
+ void Delete (TIND i)
330
+ {
331
+ NETGEN_CHECK_RANGE(i,0,size);
332
+ data[i] = std::move(data[size-1]);
333
+ size--;
334
+ // DeleteElement (i+1);
335
+ }
336
+
337
+
338
+ /// Delete element i (1-based). Move last element to position i.
339
+ void DeleteElement (TIND i)
340
+ {
341
+ NETGEN_CHECK_RANGE(i,1,size+1);
342
+ data[i-1] = std::move(data[size-1]);
343
+ size--;
344
+ }
345
+
346
+ /// Delete last element.
347
+ void DeleteLast ()
348
+ {
349
+ size--;
350
+ }
351
+
352
+ /// Deallocate memory
353
+ void DeleteAll ()
354
+ {
355
+ if (ownmem)
356
+ delete [] data;
357
+ data = 0;
358
+ size = allocsize = 0;
359
+ }
360
+
361
+ /// Fill array with val
362
+ NgArray & operator= (const T & val)
363
+ {
364
+ NgFlatArray<T, BASE, TIND>::operator= (val);
365
+ return *this;
366
+ }
367
+
368
+ /// array copy
369
+ NgArray & operator= (const NgArray & a2)
370
+ {
371
+ SetSize (a2.Size());
372
+ for (TIND i (BASE); i < size+BASE; i++)
373
+ (*this)[i] = a2[i];
374
+ return *this;
375
+ }
376
+
377
+ /// array copy
378
+ NgArray & operator= (const NgFlatArray<T> & a2)
379
+ {
380
+ SetSize (a2.Size());
381
+ for (TIND i = BASE; i < size+BASE; i++)
382
+ (*this)[i] = a2[i];
383
+ return *this;
384
+ }
385
+
386
+ NgArray & operator= (NgArray && a2)
387
+ {
388
+ ngcore::Swap (data, a2.data);
389
+ ngcore::Swap (size, a2.size);
390
+ ngcore::Swap (allocsize, a2.allocsize);
391
+ ngcore::Swap (ownmem, a2.ownmem);
392
+ return *this;
393
+ }
394
+
395
+ T * Release()
396
+ {
397
+ ownmem = false;
398
+ return data;
399
+ }
400
+
401
+ // Only provide this function if T is archivable
402
+ template<typename ARCHIVE>
403
+ auto DoArchive(ARCHIVE& archive)
404
+ -> typename std::enable_if_t<ARCHIVE::template is_archivable<T>, void>
405
+ {
406
+ if(archive.Output())
407
+ archive << size;
408
+ else
409
+ {
410
+ size_t s;
411
+ archive & s;
412
+ SetSize(s);
413
+ }
414
+ archive.Do(data, size);
415
+ }
416
+
417
+ private:
418
+
419
+ /// resize array, at least to size minsize. copy contents
420
+ void ReSize (size_t minsize)
421
+ {
422
+ size_t nsize = 2 * allocsize;
423
+ if (nsize < minsize) nsize = minsize;
424
+
425
+ if (data)
426
+ {
427
+ T * p = new T[nsize];
428
+
429
+ size_t mins = (nsize < size) ? nsize : size;
430
+
431
+ if constexpr(std::is_trivially_copyable<T>::value)
432
+ memcpy (p, data, sizeof(T)*mins);
433
+ else
434
+ for (size_t i = 0; i < mins; i++) p[i] = std::move(data[i]);
435
+
436
+ if (ownmem)
437
+ delete [] data;
438
+ ownmem = 1;
439
+ data = p;
440
+ }
441
+ else
442
+ {
443
+ data = new T[nsize];
444
+ ownmem = 1;
445
+ }
446
+
447
+ allocsize = nsize;
448
+ }
449
+ };
450
+
451
+
452
+
453
+ template <class T, int S>
454
+ class NgArrayMem : public NgArray<T>
455
+ {
456
+ using NgArray<T>::size;
457
+ using NgArray<T>::data;
458
+ using NgArray<T>::ownmem;
459
+
460
+ T mem[S]; // Intel C++ calls dummy constructor
461
+ // char mem[S*sizeof(T)];
462
+ // double mem[(S*sizeof(T)+7) / 8];
463
+ public:
464
+ /// Generate array of logical and physical size asize
465
+ explicit NgArrayMem(size_t asize = 0)
466
+ : NgArray<T> (S, static_cast<T*> (static_cast<void*>(&mem[0])))
467
+ {
468
+ size = asize;
469
+ if (asize > S)
470
+ {
471
+ data = new T[asize];
472
+ ownmem = 1;
473
+ }
474
+ // SetSize (asize);
475
+ }
476
+
477
+ NgArrayMem & operator= (const T & val)
478
+ {
479
+ NgArray<T>::operator= (val);
480
+ return *this;
481
+ }
482
+
483
+ /// array copy
484
+ NgArrayMem & operator= (const NgFlatArray<T> & a2)
485
+ {
486
+ this->SetSize (a2.Size());
487
+ for (size_t i = 0; i < size; i++)
488
+ (*this)[i] = a2[i];
489
+ return *this;
490
+ }
491
+
492
+ };
493
+
494
+
495
+
496
+
497
+ /*
498
+ template <class T, int B1, int B2>
499
+ class IndirectArray
500
+ {
501
+ const NgFlatArray<T, B1> & array;
502
+ const NgFlatArray<int, B2> & ia;
503
+
504
+ public:
505
+ IndirectArray (const NgFlatArray<T,B1> & aa, const NgFlatArray<int, B2> & aia)
506
+ : array(aa), ia(aia) { ; }
507
+ int Size() const { return ia.Size(); }
508
+ const T & operator[] (int i) const { return array[ia[i]]; }
509
+ };
510
+ */
511
+
512
+ template <class TA1, class TA2>
513
+ class NgIndirectArray
514
+ {
515
+ const TA1 & array;
516
+ const TA2 & ia;
517
+
518
+ public:
519
+ NgIndirectArray (const TA1 & aa, const TA2 & aia)
520
+ : array(aa), ia(aia) { ; }
521
+ int Size() const { return ia.Size(); }
522
+ [[deprecated("Use *Range().begin() instead")]]
523
+ int Begin() const { return ia.Begin(); }
524
+ [[deprecated("Use *Range().end() instead")]]
525
+ int End() const { return ia.End(); }
526
+
527
+ const typename TA1::TELEM & operator[] (int i) const { return array[ia[i]]; }
528
+ auto Range() const { return ia.Range(); }
529
+ // auto begin() const { return ia.begin(); }
530
+ // auto end() const { return ia.end(); }
531
+ };
532
+
533
+
534
+ template <typename T1, typename T2>
535
+ inline ostream & operator<< (ostream & s, const NgIndirectArray<T1,T2> & ia)
536
+ {
537
+ for (int i = ia.Begin(); i < ia.End(); i++)
538
+ s << i << ": " << ia[i] << endl;
539
+ return s;
540
+ }
541
+
542
+
543
+
544
+ /*
545
+
546
+ ///
547
+ template <class T, int BASE = 0>
548
+ class MoveableArray
549
+ {
550
+ int size;
551
+ int allocsize;
552
+ DynamicMem<T> data;
553
+
554
+ public:
555
+
556
+ MoveableArray()
557
+ {
558
+ size = allocsize = 0;
559
+ data.SetName ("MoveableArray");
560
+ }
561
+
562
+ MoveableArray(int asize)
563
+ : size(asize), allocsize(asize), data(asize)
564
+ { ; }
565
+
566
+ ~MoveableArray () { ; }
567
+
568
+ int Size() const { return size; }
569
+
570
+ void SetSize(int nsize)
571
+ {
572
+ if (nsize > allocsize)
573
+ {
574
+ data.ReAlloc (nsize);
575
+ allocsize = nsize;
576
+ }
577
+ size = nsize;
578
+ }
579
+
580
+ void SetAllocSize (int nallocsize)
581
+ {
582
+ data.ReAlloc (nallocsize);
583
+ allocsize = nallocsize;
584
+ }
585
+
586
+ ///
587
+ T & operator[] (int i)
588
+ { return ((T*)data)[i-BASE]; }
589
+
590
+ ///
591
+ const T & operator[] (int i) const
592
+ { return ((const T*)data)[i-BASE]; }
593
+
594
+ ///
595
+ T & Elem (int i)
596
+ { return ((T*)data)[i-1]; }
597
+
598
+ ///
599
+ const T & Get (int i) const
600
+ { return ((const T*)data)[i-1]; }
601
+
602
+ ///
603
+ void Set (int i, const T & el)
604
+ { ((T*)data)[i-1] = el; }
605
+
606
+ ///
607
+ T & Last ()
608
+ { return ((T*)data)[size-1]; }
609
+
610
+ ///
611
+ const T & Last () const
612
+ { return ((const T*)data)[size-1]; }
613
+
614
+ ///
615
+ int Append (const T & el)
616
+ {
617
+ if (size == allocsize)
618
+ {
619
+ SetAllocSize (2*allocsize+1);
620
+ }
621
+ ((T*)data)[size] = el;
622
+ size++;
623
+ return size;
624
+ }
625
+
626
+ ///
627
+ void Delete (int i)
628
+ {
629
+ DeleteElement (i+1);
630
+ }
631
+
632
+ ///
633
+ void DeleteElement (int i)
634
+ {
635
+ ((T*)data)[i-1] = ((T*)data)[size-1];
636
+ size--;
637
+ }
638
+
639
+ ///
640
+ void DeleteLast ()
641
+ { size--; }
642
+
643
+ ///
644
+ void DeleteAll ()
645
+ {
646
+ size = allocsize = 0;
647
+ data.Free();
648
+ }
649
+
650
+ ///
651
+ void PrintMemInfo (ostream & ost) const
652
+ {
653
+ ost << Size() << " elements of size " << sizeof(T) << " = "
654
+ << Size() * sizeof(T) << endl;
655
+ }
656
+
657
+ MoveableArray & operator= (const T & el)
658
+ {
659
+ for (int i = 0; i < size; i++)
660
+ ((T*)data)[i] = el;
661
+ return *this;
662
+ }
663
+
664
+
665
+ MoveableArray & Copy (const MoveableArray & a2)
666
+ {
667
+ SetSize (a2.Size());
668
+ for (int i = 0; i < this->size; i++)
669
+ data[i] = a2.data[i];
670
+ return *this;
671
+ }
672
+
673
+ /// array copy
674
+ MoveableArray & operator= (const MoveableArray & a2)
675
+ {
676
+ return Copy(a2);
677
+ }
678
+
679
+
680
+ void SetName (const char * aname)
681
+ {
682
+ data.SetName(aname);
683
+ }
684
+ private:
685
+ ///
686
+ //MoveableArray & operator= (MoveableArray &); //???
687
+ ///
688
+ //MoveableArray (const MoveableArray &); //???
689
+ };
690
+
691
+
692
+ template <class T>
693
+ inline ostream & operator<< (ostream & ost, MoveableArray<T> & a)
694
+ {
695
+ for (int i = 0; i < a.Size(); i++)
696
+ ost << i << ": " << a[i] << endl;
697
+ return ost;
698
+ }
699
+ */
700
+
701
+
702
+ /// bubble sort array
703
+ template <class T>
704
+ inline void BubbleSort (const NgFlatArray<T> & data)
705
+ {
706
+ for (int i = 0; i < data.Size(); i++)
707
+ for (int j = i+1; j < data.Size(); j++)
708
+ if (data[i] > data[j])
709
+ {
710
+ T hv = data[i];
711
+ data[i] = data[j];
712
+ data[j] = hv;
713
+ }
714
+ }
715
+
716
+ /// bubble sort array
717
+ template <class T, class S>
718
+ inline void BubbleSort (NgFlatArray<T> & data, NgFlatArray<S> & index)
719
+ {
720
+ for (int i = 0; i < data.Size(); i++)
721
+ for (int j = i+1; j < data.Size(); j++)
722
+ if (data[i] > data[j])
723
+ {
724
+ T hv = data[i];
725
+ data[i] = data[j];
726
+ data[j] = hv;
727
+
728
+ S hvs = index[i];
729
+ index[i] = index[j];
730
+ index[j] = hvs;
731
+ }
732
+ }
733
+
734
+
735
+ template <class T, class S>
736
+ void QuickSortRec (NgFlatArray<T> & data,
737
+ NgFlatArray<S> & index,
738
+ int left, int right)
739
+ {
740
+ int i = left;
741
+ int j = right;
742
+ T midval = data[(left+right)/2];
743
+
744
+ do
745
+ {
746
+ while (data[i] < midval) i++;
747
+ while (midval < data[j]) j--;
748
+
749
+ if (i <= j)
750
+ {
751
+ ngcore::Swap (data[i], data[j]);
752
+ ngcore::Swap (index[i], index[j]);
753
+ i++; j--;
754
+ }
755
+ }
756
+ while (i <= j);
757
+ if (left < j) QuickSortRec (data, index, left, j);
758
+ if (i < right) QuickSortRec (data, index, i, right);
759
+ }
760
+
761
+ template <class T, class S>
762
+ void QuickSort (NgFlatArray<T> & data, NgFlatArray<S> & index)
763
+ {
764
+ if (data.Size() > 1)
765
+ QuickSortRec (data, index, 0, data.Size()-1);
766
+ }
767
+
768
+
769
+
770
+
771
+
772
+
773
+
774
+
775
+
776
+ template <class T>
777
+ void Intersection (const NgFlatArray<T> & in1, const NgFlatArray<T> & in2,
778
+ NgArray<T> & out)
779
+ {
780
+ out.SetSize(0);
781
+ for(int i=0; i<in1.Size(); i++)
782
+ if(in2.Contains(in1[i]))
783
+ out.Append(in1[i]);
784
+ }
785
+ template <class T>
786
+ void Intersection (const NgFlatArray<T> & in1, const NgFlatArray<T> & in2, const NgFlatArray<T> & in3,
787
+ NgArray<T> & out)
788
+ {
789
+ out.SetSize(0);
790
+ for(int i=0; i<in1.Size(); i++)
791
+ if(in2.Contains(in1[i]) && in3.Contains(in1[i]))
792
+ out.Append(in1[i]);
793
+ }
794
+ }
795
+
796
+ #endif // NGARRAY_HPP_INCLUDED
797
+